Kérdés:
Intel PIN: Hogyan érhető el az INS objektum egy elemző funkcióból?
langlauf.io
2016-04-12 00:39:11 UTC
view on stackexchange narkive permalink

Egy tipikus PIN-kódrészlet így néz ki (a hivatalos kézikönyvből veszi át):

  // Ezt a funkciót minden utasítás végrehajtása előtt meghívják // kinyomtatja az IPVOID printip (VOID * ip) {fprintf (nyom, "% p \ n", ip); } // A Pin minden alkalommal meghívja ezt a függvényt, amikor új utasításra kerül sor , IARG_INST_PTR, IARG_END);}  

Csak nem tudom kitalálni, hogyan érhetem el a ins objektumot a printip (VOID * p) . A fordított irány könnyűnek tűnik, azaz az IP megszerzése a ins objektumból:

INS_Address (INS ins) (lásd itt)

Megpróbáltam átadni egy INS * ins mutatót a printip (VOID * ip, INS * ins) bemeneteknek a IARG_PTR-en keresztül , &ins , de ez akár casting hibákkal, akár szegmentálási hibákkal végződött.

Hogyan érhetem el a ins objektumot (type INS ) innen: elemző függvényen belül?

Mellékjegyzet: Rátértem erre a problémára, amikor minden végrehajtott utasításhoz megpróbáltam felhívni a INS_Disassemble (INS ins) kódot.

Kettő válaszokat:
Ta Thanh Dinh
2016-04-12 15:57:33 UTC
view on stackexchange narkive permalink

Megjegyezheti, hogy a printip egy funkciómutató, ezt a Pin belsőleg lustán hívja; ráadásul a ins egy automatikus változó (a veremből kerül át az utasítás ba). Következésképpen az &ins átadása a printip fájlba ( IARG_PTR -on keresztül), majd annak használata szegmentálási hibákhoz vezet.

A Pin deklarálja az INS kódot az INDEX osztálysablon specializálásával, mivel a következő nyilatkozatot a type_core.TLH mezőben figyelheti meg: p>

  / *! @ingroup INS_BASIC_APIHandle az INS * / typedef osztályhoz INDEX<6> INS;  

ahol az INDEX osztálysablon konstruktorai és hozzárendelési operátorai egyaránt alapértelmezettek. Tehát, elvileg ^^, mindig kijelölhetünk egy állandó változót, hogy megossza egy INS objektumot a műszerezés és az elemzés függvényei között, például:

  statikus INS per_ins; ... VOID utasítás (INS ins, VOID * v) {per_ins = ins; ...} ... VOID printip (VOID * ip) {INS_Disassemble (per_ins);}  

Ez a módszer nem működik, sajnos, ez egy példa a "jól beírt programokra" még mindig elromolhat "a C / C ++ ^^ fájlban. Mivel a Pin nem garantálja, hogy az INS típusú objektum által elérett belső változók állandóak legyenek az elemzési időben , a Az elemzési függvény ben az INS_Disassemble (per_ins) értelmetlen lehet.

Az Ön esetére előfordulhat, hogy nem kívánja felhívni a INS_Disassemble (ins) kód> minden egyes ins végrehajtásakor. Nincs szükségünk erre, ha például a ins egy hurokban van, akkor ezt a függvényt többször is meghívjuk (ugyanazokkal az ins kódokkal), hogy ugyanazt az eredményt kapjuk.

Az utasítások összes statikus információját (pl. ebben az esetben a ins szétszerelt formáját) instrumentation time ban kell megszerezni. Különösen az INS_Disassemble -t kell csak egyszer hívni egyes műszeres funkcióknál. A kívánt effektus elérésének egyik módja:

  static std :: unordered_map<ADDRINT, std :: string> str_of_ins_at; VOID utasítás (INS ins, VOID * v) {str_of_ins_at [INS_Address (ins) )] = INS_Disassemble (ins); ...} VOID printip (VOID * ip, ADDRINT addr) {std :: string ins_str = str_of_ins_at [addr]; ...}  
Köszönöm a részletes választ. Az „INS_Disassemble (ins)” elemet be akartam helyezni az elemzési funkcióba, hogy ellenőrizhessem (kézzel megnézve), hogy az elemzési funkció megfelelően működik-e. Ha az "INS_Disassemble (ins)" elemet az Instrumentation függvénybe helyezem, az "INS_Disassemble (ins)" kimenete elválik az elemzési függvény kimenetétől. Más szavakkal: Azt szerettem volna, ha az elemzési függvény kimenete az utasítással rendelkezik, hogy könnyen ellenőrizze, hogy helyes-e.
Igazad van, mindig megszerezhetjük az utasítás opkódját a "PIN_SafeCopy" és az "INS_Size" használatával, majd használhatunk bármilyen szétszerelő eszközt, pl. Capstone, vagy akár az Intel Xed-je.
Ó, sajnálom, töröltem a megjegyzésemet ezzel a megközelítéssel kapcsolatban, mert ötlete a húrok tárolására elegánsabbnak tűnt számomra.
De különben is, nagyszerű magyarázat arra, hogy mi folyik ezzel az "ins" objektummal.
Heiner Litz
2017-07-20 00:12:07 UTC
view on stackexchange narkive permalink

typedef osztály INDEX<6> INS; a type_core.TLH mezőben van megadva (a típusok nem típusok). A következő kód úgy működik, hogy szétszerelhetem az elemzés időpontjában.

  void disasmIns (ADDRINT tid, ADDRINT insarg) {INS ins; ins.q_set (insarg); std :: cout << "szétszerelés:" << INS_Disassemble (INS) << std :: endl;} VOID Instruction (INS ins, void * v) {INS_InsertCall (ins, IPOINT_BEFORE, (AFUNPTR) disasmIns, IARG_FAST_ANALYSIS_CALL, IARG_ADDRINT, ins.q (), IARG_END);}  


Ezt a kérdést és választ automatikusan lefordították angol nyelvről.Az eredeti tartalom elérhető a stackexchange oldalon, amelyet köszönünk az cc by-sa 3.0 licencért, amely alatt terjesztik.
Loading...