IDAPython:如何获取函数参数值

逆向工程 艾达 蟒蛇
2021-07-03 22:33:57

我总是编写临时代码来获取传递给函数调用的值,例如查找函数的外部参照,然后回溯反汇编以查找某些特定的 MOV 或 PUSH 指令。例如,在以下示例中:

.text:080488B1                 push    [ebp+gid]
.text:080488B4                 push    [ebp+gid]       ; gid
.text:080488B7                 call    setregid

我会找到设置regid的外部参照,然后找到“推送指令”。或者,在下一个示例中:

LOAD:FFFFFFFF824047A4                 mov     rdi, exec_map
LOAD:FFFFFFFF824047AC                 mov     esi, 40400h
LOAD:FFFFFFFF824047B1                 call    kmem_alloc_wait

我会找到 kmem_alloc_wait 的外部参照,然后在调用之前找到设置到寄存器 RDI、RSI、RDX、RCX 的值......对于每个新处理器,我将不得不重新编写我的代码来处理特定的调用该 CPU 或 VM 的约定。但是,我确信必须有某种正确的方法以与 CPU 无关的方式从 IDAPython 获取函数调用的参数值。

那么,您知道有什么方法可以从不依赖解析反汇编的 IDAPython 中获取传递给函数调用的值吗?

1个回答

回答我自己的问题:我向 Hex-Rays 发送了一封电子邮件,并在几分钟内得到了答复。答案是使用idaapi.get_arg_addrs().

例如,给定以下代码:

LOAD:FFFFFFFF82491188                 mov     rdi, offset unk_FFFFFFFF832EF148 ; a1
LOAD:FFFFFFFF8249118F                 mov     rsi, rbx        ; a2
LOAD:FFFFFFFF82491192                 xor     edx, edx        ; a3
LOAD:FFFFFFFF82491194                 xor     ecx, ecx
LOAD:FFFFFFFF82491196                 xor     r8d, r8d
LOAD:FFFFFFFF82491199                 call    _sx_xlock_hard

通过运行 idaapi.get_arg_address(0xFFFFFFFF82491199) 它将按照调用函数时给出的顺序返回 3 个参数的地址:

Python>print map(hex, idaapi.get_arg_addrs(here()))
['0xffffffff82491188L', '0xffffffff8249118fL', '0xffffffff82491192L']