图解在反汇编中识别VC++之if-else分支语句

测试用VC++代码;建一个win32控制台工程;

 

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
	int nTest=1;

	if(nTest>0)
		printf("Hello world!\r\n");
	else
		printf("Hello everybody!\r\n");

	return 0;
}


先构建一个debug版本;

 

然后用ollydbg打开;

停留在入口点;01091078处;

图解在反汇编中识别VC++之if-else分支语句_第1张图片

 

向下找到if-else分支对应的反汇编代码;

图解在反汇编中识别VC++之if-else分支语句_第2张图片

反汇编代码如下;

 

Address   Hex dump          Command                                  Comments
010913D0  /$ \55            PUSH EBP                                 ; INT ifelse1.wmain(argc,argv)
010913D1  |.  8BEC          MOV EBP,ESP
010913D3  |.  81EC CC000000 SUB ESP,0CC
010913D9  |.  53            PUSH EBX
010913DA  |.  56            PUSH ESI
010913DB  |.  57            PUSH EDI
010913DC  |.  8DBD 34FFFFFF LEA EDI,[LOCAL.51]
010913E2  |.  B9 33000000   MOV ECX,33
010913E7  |.  B8 CCCCCCCC   MOV EAX,CCCCCCCC
010913EC  |.  F3:AB         REP STOS DWORD PTR ES:[EDI]
010913EE  |.  C745 F8 01000 MOV DWORD PTR SS:[LOCAL.2],1
010913F5  |.  837D F8 00    CMP DWORD PTR SS:[LOCAL.2],0
010913F9  |.  7E 19         JLE SHORT 01091414
010913FB  |.  8BF4          MOV ESI,ESP
010913FD  |.  68 58580901   PUSH OFFSET 01095858                     ; ASCII "Hello world!
"
01091402  |.  FF15 BC920901 CALL DWORD PTR DS:[<&MSVCR110D.printf>]
01091408  |.  83C4 04       ADD ESP,4
0109140B  |.  3BF4          CMP ESI,ESP
0109140D  |.  E8 2EFDFFFF   CALL 01091140                            ; [_RTC_CheckEsp
01091412  |.  EB 17         JMP SHORT 0109142B
01091414  |>  8BF4          MOV ESI,ESP
01091416  |.  68 6C580901   PUSH OFFSET 0109586C                     ; ASCII "Hello everybody!
"
0109141B  |.  FF15 BC920901 CALL DWORD PTR DS:[<&MSVCR110D.printf>]
01091421  |.  83C4 04       ADD ESP,4
01091424  |.  3BF4          CMP ESI,ESP
01091426  |.  E8 15FDFFFF   CALL 01091140                            ; [_RTC_CheckEsp
0109142B  |>  33C0          XOR EAX,EAX
0109142D  |.  5F            POP EDI
0109142E  |.  5E            POP ESI
0109142F  |.  5B            POP EBX
01091430  |.  81C4 CC000000 ADD ESP,0CC
01091436  |.  3BEC          CMP EBP,ESP
01091438  |.  E8 03FDFFFF   CALL 01091140                            ; [_RTC_CheckEsp
0109143D  |.  8BE5          MOV ESP,EBP
0109143F  |.  5D            POP EBP
01091440  \.  C3            RETN


其要点如下;

 

if-else用的都是反比,即jle;

debug版的if-else分支特征如下:

CMP ????,????       ;比较数值

JXX AAAAAAAA          ;比较方式

......                              ;分支一

JMP BBBBBBBB

......                              ;分支二

此时JXX是short跳转;肯定在一个段内;

 

MOV DWORD PTR SS:[LOCAL.2],1

这是把1赋给本地变量;

 

再构建一个release版本;用ollydbg打开;停留在入口点;00E21289处;

图解在反汇编中识别VC++之if-else分支语句_第3张图片

 

向上找到分支语句部分反汇编如下;

图解在反汇编中识别VC++之if-else分支语句_第4张图片

 

 

Address   Hex dump          Command                                  Comments
00E21000  /$  68 0021E200   PUSH OFFSET 00E22100                     ; ASCII "Hello world!
"
00E21005  |.  FF15 9020E200 CALL DWORD PTR DS:[<&MSVCR110.printf>]
00E2100B  |.  83C4 04       ADD ESP,4
00E2100E  |.  33C0          XOR EAX,EAX
00E21010  \.  C3            RETN


可以看到,release版本,编译器直接剪掉了不可达分支;

 

 

ADD ESP,4

这个是平衡堆栈;

 

此次就到此;

此种高级武功,我所知也有限;

以上是以常量为判断条件的简单if-else分支;

其他还有以变量为判断条件的简单if-else,以常量为判断条件的复杂if-else,以变量为判断条件的复杂if-else;

和各种细节,有兴趣可自行研究;或参阅《黑客免杀攻防》等资料;

 

 

你可能感兴趣的:(VC++,汇编语言,安全编程)