条件判断 & 循环语句的逆向

来源:互联网 发布:淘宝快递费用价格表 编辑:程序博客网 时间:2024/05/16 16:15

【重点:当判断大于&小于时】(根据执行体是否紧贴着跳转指令来判断是那个条件语句)

 

 

一:执行体紧贴着跳转指令时,代码中的条件判断都会编译成否决条件的形式,原因如下:

 

如判断:if (a>5) printf("OK");

 

1为真时是让它往下继续执行printf,可是为真的跳转指令都会跳转而不会向下执行,所以才会用否决条件的跳转指令

 

2这样原本的JG会编译成否决条件的跳转指令,即:JLE,这样若为假(代表不小于等于5就是不满足JLE(等于满足最初条件的真,即:大于5,就能执行紧贴着跳转指令的执行体,即位于跳转指令的下条指令.

 

即:否决条件的假等同于最初条件的真(最初条件是大于0,否决条件JZ的假就是大于0,这样就等同于最初条件的大于0了,且也能在执行跳转指令下方的执行体了)

 

二:执行体未紧贴着跳转指令,即不位于跳转指令的下条指令时则不用判断条件取反,如do...while & swich 等情况

 

 

【当判断是否为0时,代码中的判断条件用JZ &JNZ即可】

 








if:使用了否决条件的跳转指令 &每个执行体的最后一句都是jmp 411aa9h用于跳出if,最后一个执行体则没有

 

if...else if...else

 

if(c>0 && c<10)

 

cmp dword ptr [c],0

jle 411a81h

cmp dword ptr [c],0ah

jge 411a81h

{

printf("c>0");

 

push offset string "c>0"

call printf

addesp 4

}

else if(c>10 && c<100)

 

jmp 411aa9h

    411a81h:cmp dword ptr [c],0ah

jle 411a9ch

cmp dword ptr [c],64h

jge 411a9ch

{

printf("c>10 && c<100")

 

push offset string "c>10 && c<100"

call printf

addesp 4

}else

{

printf("c>10 && c<100")

 

           jmp411aa9h

         411a9ch:pushoffset string "c>10 && c<100"

call printf

addesp 4

]

 

 

switch:不使用否决条件的跳转指令 &判断部分全部在开头,执行块都连续排列在下方

 

switch

 

switch( c

 

mov eax,dword ptr [c]

mov dword ptr [ebp-0e8h],eax

cmp dword ptr [ebp-0e8h],0

je 411a83h

cmp dword ptr [ebp-0e8h],1

je 411a90h

jmp 411a9fh

{

case 0:

printf("c>0")

    411a83h:push offset string "c>0"

call printf

add esp 4;C 调用方式,调用者清理堆栈

case 1://由于case0case1之间没有break所以两个执行块连在一起了

{

printf("c>10 && c<100")

        411a90h:push offset string "c>10&& c<100"

call printf

add esp4

break;

jmp 411aach ;如果有break会增加一个无条件跳转

}

default:

printf("c>10 && c<100")

    411a9fh:push offset string "c>10&& c<100"

call printf

add esp 4

}




do...while:不使用否决条件的跳转指令,执行体未在跳转指令的下方,所以未用否决形式

 

while:使用了否决条件的跳转指令,执行体在跳转指令的下方,所以使用了否决形式

 

 

 

do...while

 

do{

c = c+1;

 

   411A55h:moveax,dword ptr [c]

add eax,dword ptr [i]

mov dword ptr [c],eax

}while (c<100)

 

cmp dword ptr [c],64h

jl 411A55H ;执行体未在跳转指令的下方,所以未用否决形式

 

while

 

while(c<100){

 

cmp dword ptr [c],64h

jge退出;执行体在跳转指令的下方,所以使用了否决形式

c = c+1;

mov eax,dword ptr [c]

add eax,dword ptr [i]

mov dword ptr [c],eax

}