运行简单示例时 Capstone 反汇编程序的奇怪行为

问题描述 投票:0回答:1

我玩了 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

IDA Pro拆解(供参考): enter image description here

assembly reverse-engineering disassembly capstone
1个回答
0
投票

“默认情况下,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")
© www.soinside.com 2019 - 2024. All rights reserved.