2011-04-07 30 views
1

我在MASM編寫一個簡單的程序,如:修補代碼到MASM編譯的可執行文件

.386 
.model flat, stdcall 
option casemap:none 

.data 
szName db "MASM", 0 

.code 
start: 
mov eax, DWORD PTR [szName] 
ret 
end start 

的我檢查OllyDbg的調試器的代碼,我得到:

CPU Disasm 
Address Hex dump   Command         Comments 
00401004  CC   INT3 
00401005 /. E9 06000000 JMP 00401010 
0040100A | CC   INT3 
0040100B | CC   INT3 
0040100C | CC   INT3 
0040100D | CC   INT3 
0040100E | CC   INT3 
0040100F | CC   INT3 
00401010 |> A1 00404000 MOV EAX,DWORD PTR DS:[404000]   ; ASCII "MASM" 
00401015 \. C3   RETN 
00401016  A1   DB A1 

我問題是哪個組件在實際代碼(00401010)之前修補了這11個字節(00401005-0040100F)?爲什麼?

我使用Windows XP SP3,MASM和OllyDbg的。

OK,這裏是解釋(對誰照顧):此代碼已建在調試模式等等器/連接器(不知道到底哪個)將這些額外的字節。 JMP是爲了讓程序能夠運行,因爲它必須繞過INT 3指令系列。如果程序是以RELEASE模式構建的,則不需要附加這樣的額外代碼。

回答

0

我認爲他們只是定位字節,所以代碼是一個16個字節邊界對齊,並稍微快一點兒。

+1

OK,讓我們說,對於定位是一系列INT3指令,但爲什麼JMP指令? – Ponty 2011-04-07 12:36:24

+0

@Ponty:不知道。也許MASM放在那些INT3其調試器/工具 – BlackBear 2011-04-07 12:39:28

+0

確定我弄清楚,我建立調試,而不是釋放,這就是爲什麼我在實際的代碼前拿到這些額外的11個字節。但仍然沒有得到JMP指令...... – Ponty 2011-04-07 12:53:25