最短小的PE檔案之破譯

2021-03-31 08:56:58 字數 4123 閱讀 1171

發信人: 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 ...