逆向分析之核心代码的分析

逆向分析的难点在于区分用户代码、库代码和编译器插入代码。本文介绍了如何识别函数、函数参数、局部变量、分支选择、循环控制和数组、结构体。理解这些是逆向分析入门的关键。
摘要由CSDN通过智能技术生成

个人感觉分析正常的(没有花指令)反汇编代码最大的挑战就是难以分清反汇编出的代码是用户的代码还是库的代码,还是编译器插入的代码.克服这一关需要丰富的经验. 因此. 逆向的入门大多数是难倒在这一关上. 这一关挺过去了,逆向也就入门了.
除了上述这一挑战. 当然还有来自其他方面许许多多的挑战.

1. 识别一个函数
程序都是以函数为一个单位. 函数内的多条代码使函数完成了特定的功能, 在分析当中也是以一个函数作为一个分析单位. 在分析时, 应当尽可能多的分析出这个函数所完成的具体功能.
反汇编中的函数一般都有以下格式:
1.1 第一种函数格式
push ebp
mov ebp,esp
….
mov esp,ebp
pop ebp
ret
1.2 第二种函数格式
这种函数没有特定的格式, 但可以肯定的是在函数的末尾肯定有 ret语句.

2. 识别函数的返回值, 形参个数,形参, 局部变量
• 函数一般是使用 eax 寄存器来保存返回值.但有一些编译器可能用其他的方式来传递返回值, 因此,在分析程序的前期,需要确定该程序是用什么编译器进行编译的(通过PEId可以查看),才能确定其返回值是用什么方式进行传递的.
• 函数的形参个数可以通过函数平衡多少字节的栈空间来推理出. 因为存在着许许多多的传参方式,所以这种方法并不是绝对正确的. 因此要先观察出一个函数的传参方式是何种方式.

和函数的传参方式息息相关的函数调用方式:
不同的调用方式平衡堆栈的方式是不同的. C 方式调用时,是调用者进行堆栈平衡.传参时,一般是自右往左将实参入栈.在 32位下实参一般是 4个字节一个,但也有例外的情况(比如传递一个结构体变量).
在平衡堆栈时,一般是在函数调用语句后由调用者平衡堆栈.
例如:
call fun ; 调用一个函数
add esp , 4 ; 平衡堆栈.
stdCall 是被调用自己平衡 <

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值