图解在反汇编中识别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");elseprintf("Hello everybody!\r\n");return 0; }
先構建一個debug版本;
?
然后用ollydbg打開;
停留在入口點;01091078處;
?
向下找到if-else分支對應的反匯編代碼;
反匯編代碼如下;
?
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處;
?
向上找到分支語句部分反匯編如下;
?
?
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++之if-else分支语句的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图解MySql命令行创建存储过程
- 下一篇: Fiddler 环境和过滤规则详解