2013-03-02 38 views
1

我寫一個函數象下面這樣:彙編編譯調試和發佈模式

void inject_func() 
{ 
    _asm 
    { 
     push 2 
     push 1 
     mov eax, 0x0041188E 
     call eax 
    } 
} 

在調試模式下編譯,我得到:

00F43330 > 55    PUSH EBP 
00F43331 8BEC    MOV EBP,ESP 
00F43333 81EC C0000000 SUB ESP,0C0 
00F43339 53    PUSH EBX 
00F4333A 56    PUSH ESI 
00F4333B 57    PUSH EDI 
00F4333C 8DBD 40FFFFFF LEA EDI,DWORD PTR SS:[EBP-C0] 
00F43342 B9 30000000  MOV ECX,30 
00F43347 B8 CCCCCCCC  MOV EAX,CCCCCCCC 
00F4334C F3:AB   REP STOS DWORD PTR ES:[EDI] 
00F4334E 6A 02   PUSH 2 
00F43350 6A 01   PUSH 1 
00F43352 B8 8E184100  MOV EAX,41188E 
00F43357 FFD0    CALL EAX 
00F43359 5F    POP EDI 
00F4335A 5E    POP ESI 
00F4335B 5B    POP EBX 
00F4335C 81C4 C0000000 ADD ESP,0C0 
00F43362 3BEC    CMP EBP,ESP 
00F43364 E8 8CE2FFFF  CALL inject_c.00F415F5 
00F43369 8BE5    MOV ESP,EBP 
00F4336B 5D    POP EBP 
00F4336C C3    RETN 

在釋放模式,我得到:和這就是我想要的。

00EA17A0 > . 6A 02   PUSH 2 
00EA17A2 . 6A 01   PUSH 1 
00EA17A4 . B8 8E184100 MOV EAX,41188E 
00EA17A9 . FFD0   CALL EAX 
00EA17AB . C3    RETN 

我知道VS2010有添加一些調試信息,我想問的是它是什麼添加的。我在谷歌搜索,但一無所知,可能關鍵字是不正確的。 任何人都知道這件事嗎?

回答

3

它是由編譯器實現的Security Checks的一部分。

通過用已知值填充堆棧,系統可以檢測到一些覆蓋。如果你不想要,你可以通過刪除/RTCs選項來關閉它。

+0

謝謝,它有幫助。 – D3Hunter 2013-04-17 14:08:25