我需要通过idapython脚本获取挂起指令,即不在dll中的任何函数下的指令?当通过 IDA pro 看到时,它有棕色可供选择。
如何使用 IDApython 获取 dll 的挂起指令
逆向工程
蟒蛇
dll
2021-06-30 17:06:50
2个回答
此命令将查找 ScreenEA() 旁边的挂起指令的地址并打印它。
import idaapi
import idc
addr = idaapi.find_not_func(ScreenEA(), 1)
if addr != idc.BADADDR:
print "0x%08x : %s" % (addr, idc.GetDisasm(addr))
else:
print "Hanging instruction not found"
要打印加载的二进制文件中的所有挂起指令,请执行以下操作:
import idaapi
import idc
addr = idaapi.find_not_func(0, 1)
while addr != idc.BADADDR:
print "0x%08x : %s" % (addr, idc.GetDisasm(addr))
addr = idaapi.find_not_func(addr, 1)
print "No more hanging instruction found"
天真的解决方案是迭代代码中的每条指令并检查它是否在函数内部。
使用萨克
for line in sark.lines():
if not line.is_code:
# The line is not a code line, so we skip it.
continue
if sark.is_function(line.ea):
# Line is inside a function, skip it.
continue
# The line is code outside a function. Print it.
print line
使用标准的 IDAPython
import idaapi
import idc
def iter_all_lines():
start = idaapi.cvar.inf.minEA
end = idaapi.cvar.inf.maxEA
item = idaapi.get_item_head(start)
while item < end:
yield item
item += idaapi.get_item_size(item)
def iter_hanging_lines():
for line in iter_all_lines():
if not idaapi.isCode(idaapi.getFlags(line)):
# The line is not a code line, so we skip it.
continue
if idaapi.get_func(line):
# The line is inside a function, skip it.
continue
# The line is code outside a function. Yield it.
yield line
for line in iter_handing_lines():
print "[{:08X}] {}".format(line, idc.GetDisasm(line))
其它你可能感兴趣的问题