生活随笔
收集整理的這篇文章主要介紹了
PE文件 反汇编
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
PE文件 反匯編
- 1.PE文件
- 1.1 Dos頭
- 1.1.1 使用python pefile 庫讀取PE文件,查看DOS頭
- 1.1.2 使用16進制文本編輯器 UltraEdit 打開PE文件
- 1.2 NI頭
- 1.2.1 使用python pefile 庫讀取PE文件,查看IN頭
- 1.3 節表頭
- 1.3.1 使用16進制文本編輯器 UltraEdit 查看各節表頭
- 1.3.2 使用python pefile 庫讀取PE文件,查看.text節表頭
- 1.4 節表內容(.text)
- 2.反匯編
- 2.1 使用python capstone進行反匯編
1.PE文件
PE文件結構主要分為
4部分
:DOS頭、NI頭、節表頭、各節表的內容。
1.1 Dos頭
1.1.1 使用python pefile 庫讀取PE文件,查看DOS頭
1.1.2 使用16進制文本編輯器 UltraEdit 打開PE文件
可通過DOS夠識別一個文件是否為PE文件
;文件的前兩個字節為4D 5A(MZ)以及在
0x3c位置有一個地址值,該方式可以判定該文件為PE文件
;
1.2 NI頭
1.2.1 使用python pefile 庫讀取PE文件,查看IN頭
NI頭中保存著,PE文件的一些基本信息
1.3 節表頭
1.3.1 使用16進制文本編輯器 UltraEdit 查看各節表頭
上圖中有:
.text、
.rdate、
.edata等字節頭
1.3.2 使用python pefile 庫讀取PE文件,查看.text節表頭
1.4 節表內容(.text)
由
.text節表頭可知
:VirtualAddress:
0x1000 (起始地址
)Misc_VirtualSize
:0x6ff6a8 (大小
)
2.反匯編
2.1 使用python capstone進行反匯編
思路:
1.解析PE文件,得到PE文件中
.text的起始地址和大小;
2.將文件中對應地址和大小的
.text節表內容取出,然后使用python capstone進行反匯編;
import pefile
from capstone
import *def main(path
):global ActualOffset
, VirtualSize
, VirtualAddressopcode_list
= []pe
= pefile
.PE
(path
)print(pe
.DOS_HEADER
) print(pe
.NT_HEADERS
) print(pe
.FILE_HEADER
)print(pe
.OPTIONAL_HEADER
)ImageBase
= pe
.OPTIONAL_HEADER
.ImageBase
for section
in pe
.sections
:print(section
) for section
in pe
.sections
:if section
.Name
== b'.text\x00\x00\x00':VirtualAddress
= section
.VirtualAddress VirtualSize
= section
.Misc_VirtualSize StartVA
= ImageBase
+ VirtualAddressStoptVA
= ImageBase
+ VirtualAddress
+ VirtualSizefp
= open(path
, 'rb')fp
.seek
(VirtualAddress
) HexCode
= fp
.read
(VirtualSize
)md
= Cs
(CS_ARCH_X86
, CS_MODE_64
)for item
in md
.disasm
(HexCode
, 0):addr
= hex(int(StartVA
) + item
.address
)dic
= {"Addr": str(addr
) , "OpCode": item
.mnemonic
+ " " + item
.op_str
}print("[+] 反匯編地址: {} 參數: {}".format(addr
,dic
))opcode_list
.append
(dic
)if __name__
== '__main__':path
= "D:\avcodec.dll"main
(path
)
總結
以上是生活随笔為你收集整理的PE文件 反汇编的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。