我有以下 IDA Python 脚本。当调用来自感兴趣的模块时,它旨在中断导入函数的第一条指令:
list = []
def set_cb(ea, name, ord):
global list
actual_ea = Dword(ea)
AddBpt(actual_ea)
list.append(actual_ea)
return True
def set_breakpoints():
global list
del list[:]
nimps = idaapi.get_import_module_qty()
for i in xrange(0, nimps):
idaapi.enum_import_names(i, set_cb)
def rem_cb(ea, name, ord):
actual_ea = Dword(ea)
DelBpt(actual_ea)
return True
def rem_breakpoints():
global list
del list[:]
nimps = idaapi.get_import_module_qty()
for i in xrange(0, nimps):
idaapi.enum_import_names(i, rem_cb)
def step_cb():
global list
minea = MinEA()
maxea = MaxEA()
while GetDebuggerEvent(WFNE_SUSP | WFNE_CONT, -1) > 0:
r_eip = GetRegValue("EIP")
if r_eip in list:
r_esp = GetRegValue("ESP")
caller = Dword(r_esp)
if (caller >= minea) and (caller < maxea):
break
else:
break
idaapi.add_hotkey("F3", set_breakpoints)
idaapi.add_hotkey("F5", rem_breakpoints)
idaapi.add_hotkey("F10", step_cb)
我调试了 dll,我只需要中断直接从这个 dll 发出的 win api 调用,而不是从 C 运行时库。但是MinEA,MaxEA函数返回整个程序中使用的最小和最大地址。我需要的是这样的:
ea = GetModuleByName("some.dll")
minea = ModuleStart(ea)
maxea = ModuleEnd(ea)
你知道这样的api吗?谢谢。