逆向分析技术1
32位软件逆向技术 在编写win32应用程序时,都必须在源码里实现一个winmain函数,但首先执行的是启动函数的相关代码,由编译器生成。 函数的识别: call指令与跳转指令功能类似,不同的是,call指令保存返回信息,即将其之后的指令地址压入栈的顶部,当遇到ret指令时返回这个地址。 函数的参数:传递参数有三种方式,分别是栈方式、寄存器方式、以及全局变量进行隐含参数传递的方式。
enter指令可以帮助进行栈的维护,enter语句的作用就是push ebp,mov ebp,esp ;sub esp,xxx;而leave语句则完成了add esp,xxx,pop ebp的功能。
数据结构:
数据结构是计算机存储、组织数据的方式。在进行逆向分析时,确定数据结构以后,算法就很容易得到了。有些时候,事情也会反过来,即根据特定算法来判断数据结构
逆向分析程序的第一步就是分析程序的类型了,了解程序使用什么语言。peid能检测大多数编译语言、病毒和加密的壳,
IDA的交叉参考:通过交叉参考可以知道指令代码相互调用的关系。
参考重命名:单机希望修改的名称并使用快捷键"N"打开更名对话框.
注释只会让这一行有意义,但是重命名会让所有参考点有意义.
标签的用法: 定义了标签之后,就可以再次跳转到标签所在的位置.
格式化指令操作数:
IDA可以格式化指令使用的常量,因此因尽可能使用符号名称而非数字.
3.为了允许使用操作符和函数重载,C++编译器往往会按照某种规则改写每一个入口点的符号名,从而允许同一个名字(具有不同的参数类型或者不同的作用域)有多个用法且不会破坏现有的基于c的链接器。这项技术通常称为名称修饰。
在VC++中,函数修饰名编译类型(C或C++)函数名、类名、调用约定、返回类型、参数等因素共同决定。关于名称修饰的内容很多,下面仅简单谈一下常见的c编译、c++变异函数名的修饰。
c编译时函数修饰约定规则如下。
·stdcall 调用约定在输出函数名前面加一个下划线前缀,在后面加一个@符号及其参数的字节数,格式为“_functionname@number"
__cdecl调用约定仅在输出函数名前面加一个下划线前缀,格式为”__functionname "
Fastcall调用约定仅在输出函数名前面加一个“@”符号,在后面加一个“@”符号及其参数的字节数,格式为“@functionname@number"
64位软件逆向技术
寄存器:扩充了8个128位XMM寄存器(在64位程序中,XMM寄存器经常被用来优化代码)。64位寄存器与x86下的32位寄存器兼容。
函数:
栈平衡
在运行过程中,栈内存空间会被个函数重复利用,如果函数调用只申请栈空间而不释放它,那么随着函数调用次数的增加,栈内存很快就会耗光,程序会因此无法正常运行。平衡栈,目的是保证函数调用后的栈顶位置和函数调用前的位置一致。
启动函数:
程序在运行时,先执行初始化函数代码,再调用main函数执行用户编写的代码。
脱壳——ESP定律法
ESP定律的原理在于利用程序中堆栈平衡来快速找到OEP。
程序在自解密或者自解压之前,不少壳会先将当前寄存器状态压栈,在解压结束之后会将寄存器出栈,步骤如下:
- 程序刚开始载入pushad/pushfd
- 将全部寄存器压栈后就设对ESP寄存器设硬件断点
- 运行程序,触发断点
- 删除硬件断点开始分析
一部到达OEP法
所谓的一部到达OEP的脱壳方法,是根据所脱壳的特征,寻找其距离OEP最近的一处汇编指令,然后下int3断点,在程序走到OEP的时候dump程序
要点:
- ctrl+f查找popad
- ctrl+i跳转到下一个匹配处
- 找到匹配处,确认是壳解压完毕即将跳转到OEP部分,则设下断点运行到该处
- 只适用于极少数压缩壳
内存镜像法:
是在加壳程序被加载时,通过OD的ALT+M 快捷键,进入到程序虚拟内存区段,然后通过加两次内存一次性断点,到达程序正确OEP的位置
内存镜像法的原理在于对于程序资源段和代码段下断点,一般程序自解压或者自解密时,会首先访问资源段获取所需资源,然后在自动脱壳完成后,转回程序代码段,这时候下内存一次性断点,程序就会停在OEP处

浙公网安备 33010602011771号