分支语句的反汇编识别
一、IF语句
1.概述
如果看到
指令
cmp(准确的说是映像标志位的寄存器)
jxx
很有可能就是if语句。
只有小于等于的,就跳转,跳转意味这if后面的代码不执行。
一旦表达式成立,就跳
汇编翻译c语言是反的。
因为c语言里是条件成立就执行,汇编说的是跳转的条件,条件成立就跳走了,嗲代码不执行。
逻辑是反的。
如果单纯的要把指令对上,会累死人的,要了解这段汇编大概做了什么事情。
你用c把功能描述出来就行。你爱杂写杂写。
不要总结这个。
2.if语句的反汇编判断
执行各类影响标志位的指令
jxx xxxx
2.1 案例一
mov eax,dword ptr[ebp-8]
cmp eax,dword ptr[ebp-4]
jle 00401059 jle:小于等于则跳转
2.2 案例二
mov eax,dword ptr[ebp-8]
cmp eax,dword ptr[ebp-4]
jl 00401059 jl:小于则跳转
2.3 案例三
mov eax,dword ptr[ebp-8] jge:大于或者等于跳转
cmp eax,dword ptr[ebp-4]
jge 00401059
2.4 案例四
mov eax,dword ptr[ebp-8] jg:大于则跳转
cmp eax,dword ptr[ebp-4]
jg 00401059
2.5 有符号数(jge/jle)和无符号数(jae/jbe)
2.5.1有符号数:
if(x>y){Fun(x>y)}
if (nNum_x > nNum_y)
mov eax,dword ptr ds:[ x ]
cmp eax,dword ptr ds:[ y ]
jle NextFun
Fun(x>y)
NextFun
if(x<y){Fun(x<y)}
if (nNum_x < nNum_y)
mov eax,dword ptr ds:[ x ]
cmp eax,dword ptr ds:[ y ]
jge NextFun
Fun(x<y)
NextFun
2.5.2无符号数:
if(x>y){Fun(x>y)}
if (x > y)
mov eax,dword ptr ds:[ x ]
cmp eax,dword ptr ds:[ y ]
jbe NextFun
Fun(x>y)
NextFun
if(x<y){Fun(x<y)}
if (x < y)
mov eax,dword ptr ds:[ x ]
cmp eax,dword ptr ds:[ y ]
jae NextFun
Fun(x<y)
NextFun
二、IF_else语句
1.有符号&无符号
有符号
if(x>y){Fun(x>y)}else{Fun(x<y)}
if (nNum_x > nNum_y)
mov eax,dword ptr ds:[ x ]
cmp eax,dword ptr ds:[ y ]
jle Fun(x<y)
Fun(x>y)
jmp NextFun (0E33D57h)
Fun(x<y)
NextFun
if(x<y){Fun(x<y)}
if (nNum_x < nNum_y)
mov eax,dword ptr ds:[ x ]
cmp eax,dword ptr ds:[ y ]
jge Fun(x>y)
Fun(x<y)
jmp NextFun (0E33D57h)
Fun(x>y)
NextFun
无符号
if(x>y){Fun(x>y)}else{Fun(x<y)}
if (x > y)
mov eax,dword ptr ds:[ x ]
cmp eax,dword ptr ds:[ y ]
jbe Fun(x<y)
Fun(x>y)
jmp NextFun (0E33D57h)
Fun(x<y)
NextFun
if(x<y){Fun(x<y)}
if (x < y)
mov eax,dword ptr ds:[ x ]
cmp eax,dword ptr ds:[ y ]
jae Fun(x>y)
Fun(x<y)
jmp NextFun (0E33D57h)
Fun(x>y)
NextFun
2 学习总结
2.1-if-else语句的反汇编判断
if_begin:
先执行各类影响标志位的指令
jxx else_begin
…
if_end:
jmp end
else_begin:
…..
else_end
end
1、如果不跳转,那么执行到jmp处,jmp直接跳到end处。
2.如果跳转,则会直接跳过 jmp end处的代码,直接执行后面的代码
总结: 跳转执行一部分代码,不跳转执行另外一部分代码
2.2 与if的区别
第一个jxx跳转的地址前面有一个jmp,可以判断是if else语句。
2.3 if -else 的特点:
从上往下判断,只要有一个条件执行了,其他的一概不执行。
3Demo
Fun:
012113F0 push ebp int g_n =10;
012113F1 mov ebp,esp void Fun(int x,int y)
012113F3 sub esp,0D8h {
012113F9 push ebx int loc1 = g_n;
012113FA push esi int loc2 = 2;
012113FB push edi if ( x>=y)
012113FC lea edi,[ebp+FFFFFF28h] {
01211402 mov ecx,36h loc2+=1;
01211407 mov eax,0CCCCCCCCh }
0121140C rep stos dword ptr es:[edi]
0121140E mov eax,dword ptr ds:[01218000h] if ( x<y)
01211413 mov dword ptr [ebp-8],eax {
01211416 mov dword ptr [ebp-14h],2 g_n = loc2;
0121141D mov eax,dword ptr [ebp+8] }
01211420 cmp eax,dword ptr [ebp+0Ch] else
01211423 jl 0121142E {
01211425 mov eax,dword ptr [ebp-14h] g_n = loc1 + loc2;
01211428 add eax,1
0121142B mov dword ptr [ebp-14h],eax }
0121142E mov eax,dword ptr [ebp+8]
01211431 cmp eax,dword ptr [ebp+0Ch] printf("%d",g_n);
01211434 jge 01211440
01211436 mov eax,dword ptr [ebp-14h] }
01211439 mov dword ptr ds:[01218000h],eax
0121143E jmp 0121144B
01211440 mov eax,dword ptr [ebp-8] 参数 ebp+8 x
01211443 add eax,dword ptr [ebp-14h] ebp+c y
01211446 mov dword ptr ds:[01218000h],eax
0121144B mov esi,esp
0121144D mov eax,dword ptr ds:[01218000h] 局部变量 ebp-4 loc1 =g_N
01211452 push eax ebp-8 loc2 = 2
01211453 push 1215880h
01211458 call dword ptr ds:[012192BCh]
0121145E add esp,8 全局 g_n 4225c4
01211461 cmp esi,esp
01211463 call 01211154
01211468 pop edi 功能 if x》=y if(x>=y)
01211469 pop esi loc2+=1; {loc2 ++=
0121146A pop ebx
0121146B add esp,0D8h if x<y
01211471 cmp ebp,esp 返回值 g_n = loc2
01211473 call 01211154
01211478 mov esp,ebp else
0121147A pop ebp g_n+=loc2
0121147B ret
三、If-else-if
1 if–else if–else 多分支语句的反汇编判断:
if_begin:
影响标志位的指令
jxx else_if_begin
….
if_end:
jmp end
else_if_begin:
影响标志位的指令
jxx else_begin
…
else_if_end:
jmp end
else_gegin:
…
else_end
end:
…
2 分析:
1、当每个条件跳转指令要跳转的地址前面都有jmp指令
2、这些jmp指令跳转的地址都是一样的
3、如果某个分支没有条件判断,则为else部分
3 Demo
Fun_ifelseif:
00F614B0 push ebp
00F614B1 mov ebp,esp
00F614B3 sub esp,0C0h
00F614B9 push ebx
00F614BA push esi
00F614BB push edi
00F614BC lea edi,[ebp+FFFFFF40h]
00F614C2 mov ecx,30h
00F614C7 mov eax,0CCCCCCCCh
00F614CC rep stos dword ptr es:[edi]
00F614CE mov eax,dword ptr [ebp+8]
00F614D1 cmp eax,dword ptr [ebp+0Ch]
00F614D4 jle 00F614E0
00F614D6 mov eax,dword ptr [ebp+8]
00F614D9 mov dword ptr ds:[00F68000h],eax
00F614DE jmp 00F6150E
00F614E0 mov eax,dword ptr [ebp+8]
00F614E3 cmp eax,dword ptr [ebp+10h]
00F614E6 jle 00F614F2
00F614E8 mov eax,dword ptr [ebp+10h]
00F614EB mov dword ptr ds:[00F68000h],eax
00F614F0 jmp 00F6150E
00F614F2 mov eax,dword ptr [ebp+0Ch]
00F614F5 cmp eax,dword ptr [ebp+10h]
00F614F8 jle 00F61504
00F614FA mov eax,dword ptr [ebp+0Ch]
00F614FD mov dword ptr ds:[00F68000h],eax
00F61502 jmp 00F6150E
00F61504 mov dword ptr ds:[00F68000h],457h
00F6150E pop edi
00F6150F pop esi
00F61510 pop ebx
00F61511 mov esp,ebp
00F61513 pop ebp
00F61514 ret
void Fun_ifelseif(int x,int y,int z)
{
if ( x>y)
{
g_n = x;
}else if ( x> z)
{
g_n = z;
}
else if(y >z)
{
g_n = y;
}
else
{
g_n =1111;
}
}
00F61504
这个地址上面有个jmp ,后面也没比较了,并且还有代码,就知道
这就是else 了。
if-else-if :
跳的地址上面有个jmp 和if else一样
然后紧跟的又是一个比较。
几个jmp 都跳到刷锅了。----重要特征
四、变形的If-else
1 int z = x== y;
{
013E3C5E mov eax,dword ptr [ebp+8]
013E3C61 cmp eax,dword ptr [ebp+0Ch]
013E3C64 jne 013E3C72
013E3C66 mov dword ptr [ebp+FFFFFF30h],1
013E3C70 jmp 013E3C7C
013E3C72 mov dword ptr [ebp+FFFFFF30h],0
013E3C7C mov ecx,dword ptr [ebp+FFFFFF30h]
013E3C82 mov dword ptr [ebp-8],ecx
}
2 z = x>y?x:y;
z = x>y?x:y;
汇编里面和if-else一样,只是为了写代码方便。
五、其他知识点
IDA把入口点识别为导出表