假设我在IDA中具有以下功能:

int __usercall function<eax>(char* message<ebp>, unsigned int count<edi>)


使用IDAPython提取参数信息的最快方法是什么,这样我将得到以下信息:

[['char*', 'message', 'ebp'],['unsigned int','count','edi']]


它也不需要处理以下情况:

void *__usercall sub_4508B0@<rax>(void *(__usercall *function)@<rax>(int one@<eax>)@<rax>);


应该给我一些类似的信息:

[['void * ...', 'function', 'rax']]


#1 楼

我收到了HexRays支持的答复,该答复的解决方案不依赖于解析GetType(ea)检索到的C字符串。

让我们假设我们以一个函数原型开始:

int __cdecl main(int argc, const char **argv, const char **envp)


来自ELF文件x86 abi;东西传递到堆栈上。

然后,我可以执行以下操作:

Python>from idaapi import *
Python>tif = tinfo_t()
Python>get_tinfo2(here(), tif)
True
Python>funcdata = func_type_data_t()
Python>tif.get_func_details(funcdata)
True
Python>funcdata.size()
3
Python>for i in xrange(funcdata.size()):
Python>    print "Arg %d: %s (of type %s, and of location: %s)" % (i, funcdata[i].name, print_tinfo('', 0, 0, PRTYPE_1LINE, funcdata[i].type, '', ''), funcdata[i].argloc.atype())
Python>
Arg 0: argc (of type int, and of location: 1)
Arg 1: argv (of type const char **, and of location: 1)
Arg 2: envp (of type const char **, and of location: 1)


请注意,它告诉我位置类型为1 ,它对应于“堆栈”

https://www.hex-rays.com/products/ida/support/sdkdoc/group___a_l_o_c__.html

现在,让我们假设我将原型更改为:

.text:0804ABA1 ; int __usercall main@<eip>(int argc@<eax>, const char **argv@<esp>, const char **envp@<edx>)


然后:

Python>get_tinfo2(here(), tif)
True
Python>tif.get_func_details(funcdata)
True
Python>for i in xrange(funcdata.size()):
Python>    print "Arg %d: %s (of type %s, and of location: %s)" % (i, funcdata[i].name, print_tinfo('', 0, 0, PRTYPE_1LINE, funcdata[i].type, '', ''), funcdata[i].argloc.atype())
Python>
Arg 0: argc (of type int, and of location: 3)
Arg 1: argv (of type const char **, and of location: 3)
Arg 2: envp (of type const char **, and of location: 3)


参数位置类型现在为3 ,它对应于“ inside
寄存器”。

(然后,我必须使用reg1()来检索实际的
寄存器号,才能知道参数是什么寄存器
已通过)

贷记给Hex Rays的Arnaud。