我玩了 Capstone 反汇编程序,发现了奇怪的行为。
我创建了一个简单的程序,它采用
notepad.exe
(x86-64 PE),反汇编其 .text
部分并逐行打印反汇编内容。 (稍作修改的版本https://stackoverflow.com/a/66140741)。
问题:看起来反汇编在
0x1c00
之后立即中断,从.text
部分的开头开始,并在应该之前结束0x400
字节。
注1:Capstone版本:5.0.1.
注2:文件未损坏。
注3:pefile正确加载文件。
注 4:在 Windows 上运行示例时的行为相同。
注 5:其他文件上的行为相同。
这是一个错误还是我做错了什么?
代码:
import pefile
from capstone import *
exe_file = '/home/user/TEST/notepad.exe'
pe = pefile.PE(exe_file)
# find .text section
offset = False
for section in pe.sections:
if section.Name == b'.text\x00\x00\x00':
offset = section.VirtualAddress
code_ptr = section.PointerToRawData
code_end_ptr = code_ptr + section.SizeOfRawData
print("@@@ offset=0x{:0x} code_ptr=0x{:0x} code_end_ptr=0x{:0x}".format(offset, code_ptr, code_end_ptr))
break
code = pe.get_memory_mapped_image()[code_ptr : code_end_ptr]
# start disassembling text section
md = Cs(CS_ARCH_X86, CS_MODE_64)
md.detail = True
if offset:
for i in md.disasm(code, offset):
print(i)
print("end")
输出:
@@@ offset=0x1000 code_ptr=0x400 code_end_ptr=0x24a00
<CsInsn 0x1000 [cc]: int3 >
<CsInsn 0x1001 [cc]: int3 >
<CsInsn 0x1002 [cc]: int3 >
<CsInsn 0x1003 [cc]: int3 >
<CsInsn 0x1004 [cc]: int3 >
<CsInsn 0x1005 [cc]: int3 >
<CsInsn 0x1006 [cc]: int3 >
<CsInsn 0x1007 [cc]: int3 >
<CsInsn 0x1008 [4c8bdc]: mov r11, rsp>
<CsInsn 0x100b [4881ec88000000]: sub rsp, 0x88>
...
<CsInsn 0x1bf4 [e847fdffff]: call 0x1940>
<CsInsn 0x1bf9 [eb0c]: jmp 0x1c07>
<CsInsn 0x1bfb [4c8d05d659cccc]: lea r8, [rip - 0x3333a62a]> <-- disassembly interrups immediately after 0x1c00,
<CsInsn 0x1c02 [cc]: int3 > <-- starts from the beginning of .text,
<CsInsn 0x1c03 [cc]: int3 >
<CsInsn 0x1c04 [cc]: int3 >
<CsInsn 0x1c05 [cc]: int3 >
<CsInsn 0x1c06 [cc]: int3 >
<CsInsn 0x1c07 [cc]: int3 >
<CsInsn 0x1c08 [4c8bdc]: mov r11, rsp>
<CsInsn 0x1c0b [4881ec88000000]: sub rsp, 0x88>
...
<CsInsn 0x255ee [cc]: int3 >
<CsInsn 0x255ef [cc]: int3 >
<CsInsn 0x255f0 [4883790800]: cmp qword ptr [rcx + 8], 0>
<CsInsn 0x255f5 [488d05d4290000]: lea rax, [rip + 0x29d4]> <-- and ends 0x400 bytes before it should
end
“默认情况下,Capstone 在遇到损坏的指令时会停止反汇编。”
尝试打开 SKIPDATA 模式
import pefile
from capstone import *
exe_file = '/home/user/TEST/notepad.exe'
pe = pefile.PE(exe_file)
# find .text section
offset = False
for section in pe.sections:
if section.Name == b'.text\x00\x00\x00':
offset = section.VirtualAddress
code_ptr = section.PointerToRawData
code_end_ptr = code_ptr + section.SizeOfRawData
print("@@@ offset=0x{:0x} code_ptr=0x{:0x} code_end_ptr=0x{:0x}".format(offset, code_ptr, code_end_ptr))
break
code = pe.get_memory_mapped_image()[code_ptr : code_end_ptr]
# start disassembling text section
md = Cs(CS_ARCH_X86, CS_MODE_64)
md.detail = True
md.skipdata = True # turn on skipdata mode
if offset:
for i in md.disasm(code, offset):
print(i)
print("end")