[教程]逆向反汇编第七课

在以C为代表的高级语言中用if-then-else,switch-case等高级语句来构成程序的判断流程,
不仅条理清晰且维护性还是不错的.而汇编语言的代码则复杂得多,会看到cmp等指令的后面跟着 各类的跳转指令jz jnz等.识别关键跳转是软件破解的一个重要技能,许多软件用一个或多个跳转 来实现注册或非注册.
下面先说说if-then-else语句
将语句if-then-else语句编译代码后,整数用cmp指令比较,而浮点值则是使用fcom fcomp比 较.语句if-then-else编译后,其汇编代码形式如下:
cmp    a,b    ;a和b只是代表
jz(jnz)    xxxx    ;xxxx是一个地址
cmp指令不修改操作符,根据两个操作数的相减,影响处理的几个标志,如零标志 进位标志 符号标志和溢出标志,jz等指令就是条件跳转指令,根据a,b的值大小决定跳转方向.
实际上,许多情况下编译器都用test或or之类的较短的逻辑指令来替换cmp指令.一般形式是"test eax,eax",如eax如果为0,则逻辑与运算结果为零,否则设为0.
来看一个C反汇编的实例.

看反汇编的代码:

好,看完if-then-else了,下面砍switch-case语句.
SWITCH语句是多分支选择语句.SWITCH语句编译后,实质就是多个IF-THEN语句嵌套组合.编译 器会将SWITCH编译成一组不同关系运算组成的语句.具体点,来看一个例子.

把它编译,然后反汇编看看汇编代码:

上面的是未优化的反汇编,再看看优化过后的:

编译器优化后用"dec eax"指令代替cmp指令,这样指令更短,并且执行速度更快,并且优化后,编译器会合理排列switch后各case节点,有最优化方式找到所需要的节点.
     如果case取值表示一个算数级数,那么编译器会利用一个跳转表来实现例如"

编译器编译后,"jmp dword ptr [4*eax+004010B0]"指令就相当于switch(a),其根据eax的值进行索引,计算出指向相应case处理代码的指针.汇编代码如下:

下面的我就不写了,反正大概就是这样.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值