我有以下IDA python脚本。它设置和删除对库函数的所有调用上的断点:

import idc
import idaapi
import idautils

def set_breakpoints():
    ea = idc.ScreenEA()
    for function_ea in idautils.Functions(idc.SegStart(ea), idc.SegEnd(ea)):
        if idc.GetFunctionFlags(function_ea) & FUNC_LIB:
            for ref in idautils.CodeRefsTo(function_ea, 0):
                    idc.AddBpt(ref)

def rem_breakpoints():
    ea = idc.ScreenEA()
    for function_ea in idautils.Functions(idc.SegStart(ea), idc.SegEnd(ea)):
        if idc.GetFunctionFlags(function_ea) & FUNC_LIB:
            for ref in idautils.CodeRefsTo(function_ea, 0):
                    idc.DelBpt(ref)

idaapi.add_hotkey("Alt-Z", set_breakpoints)
idaapi.add_hotkey("Alt-X", rem_breakpoints)


现在我想为导入的win api函数具有相同的功能(从“导入”选项卡),但我找不到任何表明该功能已导入的标志。也许有人可以指出我正确的方向去做。谢谢。

#1 楼

此代码段从
https://github.com/idapython/src/blob/master/examples/ex_imports.py

# -----------------------------------------------------------------------
# This is an example illustrating how to enumerate imports
# (c) Hex-Rays
#
import idaapi

def imp_cb(ea, name, ord):
    if not name:
        print "%08x: ord#%d" % (ea, ord)
    else:
        print "%08x: %s (ord#%d)" % (ea, name, ord)
    # True -> Continue enumeration
    # False -> Stop enumeration
    return True

nimps = idaapi.get_import_module_qty()

print "Found %d import(s)..." % nimps

for i in xrange(0, nimps):
    name = idaapi.get_import_module_name(i)
    if not name:
        print "Failed to get import module name for #%d" % i
        continue

    print "Walking-> %s" % name
    idaapi.enum_import_names(i, imp_cb)

print "All done..."


复制而来从枚举导入到设置断点的步骤很简单。

评论


请注意:.idata部分中的条目通常是指向目标功能的指针,而不是函数本身,因此在设置断点之前需要将它们取消引用。

–伊戈尔·斯科钦斯基♦
16-10-1在18:13