Pytanie:
Wykres przepływu sterowania Ghidra
Benny
2019-03-18 01:28:24 UTC
view on stackexchange narkive permalink

Ostatnio używam Ghidry i nie znajduję interfejsu API, aby uzyskać wykres przepływu sterowania dla danej funkcji. Czy ktoś może mi pomóc?

Z góry dziękuję.

EDYCJA: różni się od poprzedniego pytania ( link), ponieważ proszę o API.

Możliwy duplikat [Jak wyświetlić CFG funkcji w Ghidrze?] (Https://reverseengineering.stackexchange.com/questions/20791/how-to-display-the-cfg-of-a-function-in-ghidra )
Redagowałem. Proszę o API, więc nie jest to duplikat.
Cześć i witaj w RE.SE! Czy mógłbyś bardziej szczegółowo określić, co chcesz zrobić z wykresami przepływu? Układ? Stwórz swój własny? Interfejs API jest dość obszerny http://ghidra.re/ghidra_docs/api/index-all.html
Cześć! Biorąc pod uwagę funkcję, muszę wyodrębnić jej CFG, aby policzyć jej krawędzie i węzły w celu obliczenia złożoności cyklicznej i innych metryk. Przeglądałem już dokumentację Ghidry, ale nie znalazłem tego, czego potrzebowałem.
Użyłem funkcji obliczCyclomaticComplexity do obliczenia złożoności cyklicznej, ale nie znalazłem interfejsu API do jawnego generowania wykresu przepływu sterowania, z którego mogę wyodrębnić węzły i krawędzie.
Jeden odpowiedź:
Mauricio Sanfilippo
2019-05-17 01:02:55 UTC
view on stackexchange narkive permalink

Szukam tego samego i na razie znalazłem klasę PcodeSyntaxTree mającą metodę o nazwie getBasicBlocks (), która zwraca tablicę elementów PcodeBlockBasic. Ta druga klasa ma metody takie jak getIn i getOut, które pobierają odpowiednio węzły przychodzące i wychodzące (podstawowe bloki). Myślę więc, że użycie tych metod powinno być interfejsem do programowej interakcji z CFG. Ale niestety nie dowiedziałem się jeszcze, jak zdobyć ten obiekt PcodeSyntaxTree, ale będę dalej badać.

Mam nadzieję, że to ci trochę pomoże!

linki: http : //ghidra.re/ghidra_docs/api/ghidra/program/model/pcode/PcodeSyntaxTree.html http://ghidra.re/ghidra_docs/api/ghidra/program/model/pcode/PcodeBlockBasic .html

PS .: Inną rzeczą, jaką możesz zrobić, jest przestudiowanie kodu metody obliczaniaCyclomaticComplexity, która korzysta z modeli BasickBlock, myślę, że prawdopodobnie to zrobię.

EDYCJA: myślę, że dobra wiadomość. Znalazłem klasę DecompleResults, która ma metodę getHighFunction (), która zwraca obiekt HighFunction. Klasa HighFunction rozciąga się na PcodeSyntaxTree, więc ma również metodę getBasicBlocks. Od tego momentu możesz iść dalej.

Klasa DecompileResults znajduje się w ghidra.app.decompiler, podobnie jak w DecompInterface, który ma metodę decompileFunction (), która zwraca obiekt DecompileResults.

Z https://github.com/NationalSecurityAgency/ghidra/blob/master/Ghidra/Features/Decompiler/src/main/java/ghidra/app/decompiler/DecompInterface.java:

  // Wywołanie dekompilatora: // * DecompileResults res = ifc.decompileFunction (func, 0, taskmonitor);  

links: https: //github.com/NationalSecurityAgency/ghidra/blob/master/Ghidra/Features/Decompiler/src/main/java/ghidra/app/decompiler/DecompInterface.java

https : //ghidra.re/ghidra_docs/api/ghidra/app/decompiler/DecompileResults.html https://ghidra.re/ghidra_docs/api/ghidra/program/model/pcode/HighFunction.html

EDYCJA 2:

Mogę sobie wyobrazić coś takiego (w Pythonie api):

  import ghidra.app.decompiler as decompinterface = decomp.DecompInterface () # decompileFunction (function, timeout, monitor) # zgodnie z w dokumentacji funkcja jest obiektem Function, limit czasu wynosi int, # a monitor jest ARGUMENTEM OPCJONALNYM typu TaskMonitor. # Jednak nie mówi nic o wartości domyślnej dla tego argumentu # i pominięcie argumentu w wywołaniu powoduje błąd.results = interface.decompileFunction (func, 0, taskMonitor) hf = results.getHighFunction () bbList = hf.getBasicBlocks () # ... # ... # ...  
Świetnie, bardzo mi pomogłeś, bardzo dziękuję!
Nie ma za co! btw, znalazłem inną przydatną informację, sprawdź tę odpowiedź w zgłoszonym problemie: https://github.com/NationalSecurityAgency/ghidra/issues/444#issuecomment-484287997 Używam tego modelu blokowego, ponieważ nie mogłem się zorientować ale jak poprawnie utworzyć i skonfigurować instancję klasy DecompInterface
@MauricioSanfilippo wykonał powyższy kod za Ciebie. Użyłem TaskMonitor.DUMMY jako trzeciego parametru i przekazałem Function objrct, ale nic nie zostało zdemontowane. Znalazłeś rozwiązanie?
@hEShaN Nie, nie mogłem wymyślić, jak używać DecompInterface. Ale zdecydowałem się na podejście SimpleBlockModel, które działało dobrze i wydaje się być jeszcze prostsze. Możesz przeczytać https://github.com/NationalSecurityAgency/ghidra/issues/444#issuecomment-484287997 Utworzyłem kilka skryptów, aby uzyskać i przejść przez wykres, mogę się nimi z tobą podzielić, jeśli chcesz. Jest to głównie doraźne, ale zadziałało, może możesz je ulepszyć, jeśli nie działają dla Ciebie tak, jak obecnie
Dziękuję Ci bardzo. Czy masz link do tych skryptów. Dzięki jeszcze raz!


To pytanie i odpowiedź zostało automatycznie przetłumaczone z języka angielskiego.Oryginalna treść jest dostępna na stackexchange, za co dziękujemy za licencję cc by-sa 4.0, w ramach której jest rozpowszechniana.
Loading...