这是一个很细节的问题,但还是想记录一下。
我们都知道,Ghidra有high level IR和low level IR的区别,high level的function是很容易获得所有的PCode Operation的,其文档为:
可以通过getPcodeOps获得,但是low level function中并没有相应的方法:
那应该怎么办呢?参考了一下师妹的代码,原来可以通过:Program的getListing()方法获得一个Listing对象,然后再通过Listing对象中的:
getInstructions(AddressSetView addrSet, boolean forward) |
---|
这个方法得到和一个function相关的Instructions的Iterator,我们看到这个方法的第一个参数是一个AddressSetView
对象,那么我们需要做的就是将Function和这个对象对应起来即可,看到Function的方法中:
这个方法是可以返回上面这个对象的。具体可以参考这里:Namespace
不过,我也不清楚为什么设计得这么绕!另外,C的博客现在自动转换链接太SB了,这个网站真的是一个没有任何品位和节操的网站。我就是用习惯了。
最后附上段示例代码:
import ghidra.app.script.GhidraScript;
import ghidra.program.model.listing.Function;
import ghidra.program.model.listing.FunctionIterator;
import ghidra.program.model.listing.Instruction;
import ghidra.program.model.listing.InstructionIterator;
public class PrintFuncIns extends GhidraScript {
public void run() throws Exception {
FunctionIterator functionManager = this.currentProgram.getFunctionManager().getFunctions(true);
for (Function function : functionManager) {
if(function.getName().equals("main")) {
InstructionIterator iter = currentProgram.getListing().getInstructions(function.getBody(), true);
for(Instruction ins : iter) {
System.out.println(ins.getMnemonicString());
int numOperands=ins.getNumOperands();
System.out.println(numOperands);
}
}
}
}
}
关于Instruction这个Interface的所有方法在这里:
https://ghidra.re/ghidra_docs/api/ghidra/program/model/listing/Instruction.html