Domanda:
Estrazione di argomenti da IDA
Zach Riggle
2015-05-12 02:54:57 UTC
view on stackexchange narkive permalink

Supponiamo di avere la seguente funzione in IDA:

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

Qual è il modo più veloce per estrarre le informazioni sull'argomento usando IDAPython, in modo tale da ottenere quanto segue:

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

Non che debba anche gestire situazioni come:

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

Il che dovrebbe darmi qualcosa sulla falsariga di:

  [['void *. .. "," function "," rax "]]  
Una risposta:
Zach Riggle
2015-05-12 21:28:36 UTC
view on stackexchange narkive permalink

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>) 

Python>get_tinfo2 (qui (), tif) TruePython>tif.get_func_details (funcdata) TruePython>for i in xrange (funcdata.size ()): Python> print "Arg% d:% s (di tipo% s) e di% location (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: 3) Arg 1: argv (di tipo const char ** e di posizione: 3) Arg 2: envp (di tipo const char ** e di posizione: 3)

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.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...