SMC技术
SMC,即Self Modifying Code,动态代码加密技术,指通过修改代码或数据,阻止别人直接静态分析,然
后在动态运行程序时对代码进行解密,达到程序正常运行的效果。
VirtualProtect 函数通常用于代码自加密的场景。代码自加密是一种保护代码不被轻易逆向分析的技术,
通过在程序运行时动态地修改代码的内存保护属性,使得代码在执行时可以被修改和执行,但在不执行时则
不能被读取或修改。
在linux系统中,可以通过mprotect函数修改目标内存的权限
在Windows系统中,VirtualProtect函数实现内存权限的修改
因此也可以观察是否有这俩个函数来判断是否进行了SMC
SMC一般有俩种破解方法,第一种是找到对代码或数据加密的函数后通过idapython写解密脚本。第二种是动
态调试到SMC解密结束的地方dump出来。
堆栈平衡
one:一般是程序代码有一些干扰代码,让IDA的反汇编分析出现错误。比如用push + n条指令 + retn来
实际跳转,而IDA会以为retn是函数要结束,结果它分析后发现调用栈不平衡,因此就提示sp analysis failed.
two:还有一些比如编译器优化,因为ida是用retn指令来识别函数结束的,如果函数不是以这种方式结束,
IDA就会分析为栈不平衡。也就是IDA找不到函数结束的位置。
1、概念解释
函数返回时,堆栈需要恢复到调用前的状态
2、平衡的重要性
避免内存访问错误和程序崩溃
保证程序的正常执行逻辑
3、平栈的方式
外平栈(cdecl)
在 cdecl 调用约定中,参数也是从右往左一次压入堆栈,但堆栈平衡由调用者在函数返回后负责清理
内平栈(stdcall)
stdcall 是内平栈,既有被调用函数在返回前负责清理堆栈,通过调整栈指针来移除压入栈中的参数
下面简单举个例子,让大家更深刻的了解堆栈平衡的概念
汇编中的函数调用中栈的工作过程
A_Func(5,6);
push 6
push 5
call A_Func
add esp, 8