2014-10-20 155 views
-1

我在Windows 7中使用nasm製作了一個簡單的MessageBox,對於生成的文件的大小有點不滿意:2.51 kb。手動創建PE

extern MessageBoxA 
extern ExitProcess 

import MessageBoxA user32.dll 
import ExitProcess kernel32.dll 

section .text use32 

..start: 

push 0 
push sCapt 
push sText 
push 0 
call [MessageBoxA] 


push 0 
call [ExitProcess] 

section .data 

sCapt db 'test', 0 
sText db 'test2', 0 

所以我打開OllyDbg中的可執行文件,似乎它產生了很多不必要的東西。

ollydbg

所以要多學一點,我想直接讓這個程序以十六進制留在儘可能小的尺寸!我搜索,但沒有發現任何教導如何手動創建PE可執行文件。

如果有人可以給我鏈接或解釋如何做,我將不勝感激!

+2

你可能會發現[this](http://www.phreedom.org/research/tinype/)有趣。 – 2014-10-20 22:10:49

+0

Nasm實際上並未生成所有這些零,它只是加載頁面中未使用的空間。由於頁面大小是固定的(如果內存服務於4K),它必須包含* something *。 – usr2564301 2014-10-20 22:46:56

+0

下載更多內存。 – 2014-10-20 23:42:50

回答

4

您可以通過修改鏈接器的段對齊選項來使程序變小一些,但結果可能不嚴格符合Win32 PE映像的對齊規則。 EXE可能會運行,但是某個人 - 或者Windows或WINE或ReactOS的某個部分 - 實際上可能會依賴這些規則,這意味着您將對Heisenbugs開放。

也就是說,在What is the smallest possible Windows (PE) executable?,你可以找到你需要的信息,使盡可能最小的工作PE。從那裏鏈接的相關頁面有Tiny PE,其中Alexander Sotirov描述了製作最小可能EXE的技巧。像覆蓋標題結構,摺疊它們自己等等...

wiki article on the PE format有一個概述和不少有用的鏈接。

P.S .:一些較小的可執行文件實際上可能比正確對齊的文件載入更慢的幾微秒,如果將它們映射到內存中比需要的更復雜。除此之外,對於多達一頁大小的任何內容(例如大多數Win32系統中的4 KB),加載時間不應有任何明顯區別,除非您正在處理軟盤和扇區小於Windows的其他介質頁面大小。在任何情況下,創建過程(地址空間等等)和動態鏈接的開銷都必然會被壓縮。

+0

但我真的想從頭開始做PE! – 2014-10-20 23:39:34

+1

@ user3448245:TinyPE頁面實際上向您展示瞭如何做到這一點 – 2014-10-21 08:48:49