日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2025/4/14 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图解在反汇编中识别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分支语句的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。