从 Ghidra 列表窗口中提取信息

逆向工程 拆卸 吉德拉
2021-06-25 09:15:47

我编写了一个脚本,它使用 ghidra 中的此代码从 PE 中提取所有汇编代码

instructionList = []
for instr in currentProgram.getListing().getInstructions(True):
    instructionList.append(instr)

但问题是,更改了汇编代码中的所有 .DLL 调用。例如,如果列表窗口显示

CALL        dword ptr [->MSVCRT.DLL::signal] 

我得到的输出是

CALL dword ptr [EBP + -0x14]

有没有办法完全按照列表​​窗口中的方式获取汇编代码

2个回答

因此,答案在 OP 的票 #1994 中提供,只是将其转移到这里供未来的寻求者使用:

from ghidra.program.model.listing import CodeUnitFormat, CodeUnitFormatOptions
codeUnitFormat = CodeUnitFormat(CodeUnitFormatOptions(CodeUnitFormatOptions.ShowBlockName.ALWAYS,CodeUnitFormatOptions.ShowNamespace.ALWAYS,"",True,True,True,True,True,True,True))

instructionList = []
for instr in currentProgram.getListing().getInstructions(True):
    instructionList.append(codeUnitFormat.getRepresentationString(inst))

我在阅读这篇文章后想到了这个,但找不到办法让它整洁干净

只是记录思考过程,因为 pawel 创建了一个很好的答案

>>> inst = currentProgram.listing.getCodeUnitAt(currentAddress)
>>> print (inst,inst.getReferencesFrom()[1])
(CALL qword ptr [0x1c0007050], ->NTOSKRNL.EXE::EtwRegister)

编辑一个正则表达式替代黑客是我在放弃它之前的想法,如下所示

>>> re.sub("\[.*\]",'['+inst.getReferencesFrom()[1].toString()+']',inst.toString())
    u'CALL qword ptr [->NTOSKRNL.EXE::EtwRegister]'