發信人: rufi (如飛), 信區: arch_***piler
標 題: 最短小的pe檔案之破譯
發信站: 日月光華 (2023年03月24日23:45:03 星期三), 站內信件
最短小的pe檔案之破譯
這個檔案位元組數不多,分析起來不是很難,分析乙個標準的pe檔案反而花了很多的時間.
搞清楚標準的pe格式之後,對這個檔案的機理也就明白了.
下面是破譯出來的源程式:
0x400000 ;imagebase
origin:
dos_mz_header:
.e_magic db "mz"
start:
use32
mov eax,section_table.name ; ascii "hello!"
jmp main
pe_header:
.signature db "pe",0,0
fileheader:
.machine dw 0x014c ;machine = image_file_machine_i386
(14ch)
.numberofsections dw 0x01
.timedatestamp dd "user" ;db "user32.dll",0
.pointertosymboltable dd "32.d"
.numberofsymbols dd "ll"
.sizeofoptionalheader dw 0x00c8
.characteristics dw 0x0103 ;exe or dll
optionalheader: ;optionalheader has 31 fields
.magic dw 0x010b
.majorlinkerversion db 0
.minerlinkerversion db 0
.sizeofcode dd 0x1000
.sizeofinitializeddata dd 0x1000
.sizeofuninitializeddata dd 0
.addressofentrypoint dd start-origin
.baseofcode dd start-origin
.baseofdata dd pe_header-origin ;e_lfanew
.imagebase dd origin
.sectionalignment dd 0x1000
.filealignment dd 0x0200
messagebox:
.majorosversion dw 0x0102 ;point to dword before "messageboxa"
.minorosversion dw 0x0000
.majorimageversion dw 0
.minorimageversion dw 0
.majorsubsystemverion dw 4
.minorsubsystemverion dw 0
.win32versionvalue dd 0
.sizeofimage dd 0x2000
.sizeofheaders dd 0x0200
.checksum dd 0
.subsystem dw 2
.dllcharacteristics dw 0
.sizeofstackreserve dd 0x100000
.sizeofstack***mit dd 0x2000
.sizeofheapreserve dd 0x100000
.sizeofheapr***mit dd 0x1000
.loaderflags dd 0
.numberofdatadirectories dd 0x0d ;13
data_directories:
.export_table dd 0,0 ; rva,size
.import_table dd 0x94,0x28 ; rva,size
.resource_table dd 0,0 ; rva,size
.exception_table dd 0xffffffff,0x14 ; rva,size
.security_table dd 0x4c,0 ; rva,size
.relocation_table dd 0,0 ; rva,size
.debug dd 0,0 ; rva,size
;.description dd 0x5050006a,0x15ff006a ; rva,size
;.global_ptr dd 0x0040004c,0x909090c3 ; rva,size
main:
push 0 ; /style = mb_ok|m
push eax ; |title
push eax ; |text
push 0 ; |howner = null
call dword [ds:messagebox] ; /messageboxa
retn
nop
nop
nop
.tls_table dd 0,0 ; rva,size
.load_config_table dd 0,0 ; rva,size
.bound_import dd 0,0 ; rva,size
.importaddresstable dd 0x94,0x28 ; rva,size
編譯後就得到了那276個位元組,執行的結果是顯示乙個標題和內容都要是"hello!"的訊息
框. 分析這個源程式就會發現:
1.程式的入口點在dos header內,之後又跳轉到data_directories的debug之後,於是
data_directories的description和global_ptr中的內容為code.
2.pe header的baseofdata欄位同時又是dos header的
e_lfanew欄位,指向pe header的位置.
3.numberofdatadirectories設為了13,而正常情況下為16.
4.section_table中只有乙個節,而這個節內容分散在前面的資料中,以致於整個檔案的he
ader
之後沒有rawdata.
5.pointertorawdata為0,這樣從檔案開頭數過5個dword後,找到dll的檔名.
6.import_table的rva是0x94,這樣ox94之後的第5個dword,相當於imageimportdescripto
r的 firstthunk,這個欄位的內容為0x4c, 而ox4c處的字段為majorosversion,所這個地方的
內容(0x0102)
相當於thunkvalue,指向乙個imageimportbyname結構,0x0102處的雙位元組為hint,hint之
後的則是
函式名messageboxa.
概括地說,這個檔案的機理就把檔案頭不重要的平常沒有用到的位元組,填充為有用的資料
或**.
然後一些關鍵字段的內容為指標時,巧妙指向那些資料或**,於是檔案可以被執行.
-- add life,coding
push limits
mov reality,ideas
PE檔案詳解之PE檔案頭
1,pe檔案頭 pe header 緊挨著 dos stub 2,pe header 是pe相關結構nt映像頭 image nt header 的簡稱。裡面包含著許多pe裝載器用到的重要字段。3,執行體在支援pe檔案結構的作業系統中執行時,pe裝載器將從 image dos header 結構中的 ...
PE檔案詳解之PE檔案頭
1,pe檔案頭 pe header 緊挨著 dos stub 2,pe header 是pe相關結構nt映像頭 image nt header 的簡稱。裡面包含著許多pe裝載器用到的重要字段。3,執行體在支援pe檔案結構的作業系統中執行時,pe裝載器將從 image dos header 結構中的 ...
PE檔案之DOS頭
微軟為了照顧相容性,在以後的pe檔案中也加入了dos頭 在dos頭有兩個部分 1 dos mz頭 結構體為 image dos header struct 0h word e magic magic dos signature mz 4dh5ah dos可執行檔案標記 2h word e cblp ...