日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

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

發(fā)布時(shí)間:2025/4/14 c/c++ 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图解在反汇编中识别VC++之if-else分支语句 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

測(cè)試用VC++代碼;建一個(gè)win32控制臺(tái)工程;

?

#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; }


先構(gòu)建一個(gè)debug版本;

?

然后用ollydbg打開;

停留在入口點(diǎn);01091078處;

?

向下找到if-else分支對(duì)應(yīng)的反匯編代碼;

反匯編代碼如下;

?

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


其要點(diǎn)如下;

?

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

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

CMP ????,???? ? ? ? ;比較數(shù)值

JXX AAAAAAAA ? ? ? ? ?;比較方式

...... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?;分支一

JMP BBBBBBBB

...... ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?;分支二

此時(shí)JXX是short跳轉(zhuǎn);肯定在一個(gè)段內(nèi);

?

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

這是把1賦給本地變量;

?

再構(gòu)建一個(gè)release版本;用ollydbg打開;停留在入口點(diǎn);00E21289處;

?

向上找到分支語(yǔ)句部分反匯編如下;

?

?

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版本,編譯器直接剪掉了不可達(dá)分支;

?

?

ADD ESP,4

這個(gè)是平衡堆棧;

?

此次就到此;

此種高級(jí)武功,我所知也有限;

以上是以常量為判斷條件的簡(jiǎn)單if-else分支;

其他還有以變量為判斷條件的簡(jiǎn)單if-else,以常量為判斷條件的復(fù)雜if-else,以變量為判斷條件的復(fù)雜if-else;

和各種細(xì)節(jié),有興趣可自行研究;或參閱《黑客免殺攻防》等資料;

?

?

總結(jié)

以上是生活随笔為你收集整理的图解在反汇编中识别VC++之if-else分支语句的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。