Capstone:cs_disasm() 中“地址”参数的目的是什么?

逆向工程 C 反汇编者 顶石
2021-06-19 19:11:27

我正在尝试使用 C 语言中的 Capstone Disassembler。

在文档中,他们展示了该cs_disasm()函数的以下用法从这里

count = cs_disasm(handle, CODE, sizeof(CODE)-1, 0x1000, 0, &insn)

困扰我的事情是0x1000在文档(实际上是源代码)中它说:

@address:给定原始代码缓冲区中第一条指令的地址。

我真的不明白这到底是什么意思,因为根据我的理解,insn数组是动态分配和填充的,这就是指令所在的位置(或者它们是什么?)

为什么它是一个固定值0x1000这实际上是程序内存中的地址吗?(这不是供 C 程序使用的非法地址空间吗?)

提前致谢

1个回答

该地址是您要反汇编虚拟地址

例如你有一个相对跳跃

操作码将是0x74 {imm }其中{imm}是相对于当前地址的正方向或负方向

因此,如果当前地址是 0x1000,则从 0x1000向正方向{5} imm的相对跳转应该使您进入 0x1005

如果地址是 0x2000 它应该让你在 0x2005

这是当前行上的反汇编应该说明

jmp 0x1005 或 jmp 0x2005 等等

如果你不提供地址反汇编只会说jmp 5

这是一段类似的python代码

Python 2.7 (32-bit) interactive window [PTVS 15.6.18072.2-15.0]

>>> from capstone import *
>>> CODE = b"\x74\xd9"
>>> md = Cs(CS_ARCH_X86,CS_MODE_32)
>>> for i in md.disasm(CODE , 0x1000):
...     print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
... 
0x1000: je  0xfdb  <<<< (0x1000 - 0x25)

>>> for i in md.disasm(CODE , 0x25):
...     print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
... 
0x25:   je  0    <<<< (0x25 - 0x25)