Ho ricevuto una risposta dal supporto di HexRays che ha una soluzione che non si basa sull'analisi della stringa C recuperata da GetType(ea)
.
Immaginiamo di iniziare con un prototipo di funzione:
int __cdecl main (int argc, const char ** argv, const char ** envp)
Questo è da un file ELF, x86 abi; le cose vengono passate sullo stack.
Quindi, posso fare quanto segue:
Python> da idaapi import * Python>tif = tinfo_t () Python>get_tinfo2 (qui (), tif) TruePython>funcdata = func_type_data_t () Python>tif.get_func_details (funcdata) TruePython>funcdata.size () 3Python>for i in xrange (funcdata.size ()): Python> print "of% d:% s) e type % (i, funcdata [i] .name, print_tinfo ('', 0, 0, PRTYPE_1LINE, funcdata [i] .type, '', ''), funcdata [i] .argloc.atype ()) Python>Arg 0: argc (di tipo int e di posizione: 1) Arg 1: argv (di tipo const char ** e di posizione: 1) Arg 2: envp (di tipo const char ** e di posizione: 1)
Nota che mi dice che il tipo di posizione è 1
, che corrisponde a "stack": https://www.hex-rays.com/products/ ida / support / sdkdoc / group ___ a_l_o_c __. html
Ora, supponiamo che io cambi il prototipo in questo:
.t ext: 0804ABA1; int __usercall main @ <eip> (int argc @ <eax>, const char ** argv @ <esp>, const char ** envp @ <edx>)
Tipo di posizione dell'argomento ora è 3
, che corrisponde a 'insideregister'.
(Quindi, dovrei usare reg1 ()
per recuperare il numero di registro effettivo da sapere in che cosa registra l'argomento viene passato)
Il merito va ad Arnaud di Hex Rays.