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.
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.
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.
// Wywołanie dekompilatora: // * DecompileResults res = ifc.decompileFunction (func, 0, taskmonitor);
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 () # ... # ... # ...