Otázka:
Detekce rekurzivních funkcí v IDA
Dominik Antal
2014-01-20 18:49:03 UTC
view on stackexchange narkive permalink

Jak mohu detekovat / označit rekurzivní funkce v IDA?

Triviální metodou by bylo zkontrolovat seznam volání každé funkce a pokud se sama volá, pak je rekurzivní. Rád bych vložil komentář nebo nějaký indikátor, který by mi pomohl rozlišit tyto funkce.

Dva odpovědi:
pnX
2014-01-21 14:24:01 UTC
view on stackexchange narkive permalink

Chybí mi 9 bodů reputace, takže bohužel nemohu komentovat skvělou odpověď od w_s. ;)

Pro úplnost je popsaný koncept v teorii grafů známý jako „Tarjanův algoritmus“ pro hledání silně propojených komponent.

Wikipedia má pěknou animaci, která pomáhá při provádění těchto kroků. Tarjan's Algorithm

Pro studium je zde další (formálnější) implementace Pythonu, je to ten, který jsem použil pro hledání smyček ve funkcích v IDAscope, ale je snadno přizpůsobitelný pro hledání rekurzivních funkcí.

Osobně si myslím, že váš nápad je víc než komentář, stejně si zaslouží být odpovědí. Takže se nemusíte cítit špatně. :)
a teď máte své reputační body a můžete komentovat :)
w s
2014-01-20 20:54:29 UTC
view on stackexchange narkive permalink

Není to triviální úkol. Můžete to udělat relativně snadno, pokud neberete v úvahu nepřímá volání (například virtuální funkce v C ++) a volání z jiné funkce, jako je tato:

  int f () {g () ;} int g () {f ();}  

Může to být mnohem komplikovanější, pokud je jedna z vašich funkcí v jiné binární podobě (například dll). Existují tedy dva způsoby, jak to udělat, statický a dynamický způsob.

Rekurzivní procházení sestavy - přístup statické analýzy

Měli byste napsat skript v IDAPython, který předává funkci a rekurzivně zpracovává každé volání. Pokud najdete aktuální funkci ve shromážděném zásobníku, funkce je rekurzivní.

Velmi jednoduchá varianta vypadá takto:

  # Nezkontroloval jsem to, používejte opatrně, pozor na chyby v tomto codeimport idautilsimport idcimport idaapidef handle_function (func_start): globální zásobník, pokud func_start v zásobníku: tisk "Toto je rekurzivní funkce", hex (func_start), název (func_start) pro x v zásobníku: tisk "\ t", hex (x ) # zde vložte své přejmenování, mělo by to být idc.MakeName návrat stack.append (func_start) pro h v idautils.FuncItems (func_start): pro r v idautils.XrefsFrom (h, 0): if r.type == fl_CF nebo r.type == fl_CN: print hex (h), "-->", hex (r.to) if r.to == func_start: # Sem vložte také přejmenování pro jednoduchý rekurzivní tisk "Je to jednoduchá rekurzivní funkce, která volá sám přímo "návrat else: handl e_function (r.to) stack = stack [: - 1] pro f v idautils.Functions (): stack = [] handle_function (f)  

zarážka analýza - přístup dynamické analýzy

Napište skript v IDAPython, který rozpozná všechny prology funkcí a odfiltruje všechny funkce, které nic neříkají. Na každý shromážděný prolog vložte bod přerušení a spusťte program. Pokaždé, když se program zastaví, analyzujte zásobník programu pomocí IDAPython, abyste našli funkci, na které jste v zásobníku zastaveni. Pokud ji najdete, funkce je rekurzivní.



Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...