查找数据或代码的交叉引用(又称 xrefs)非常重要,因为它们提供了某些数据的使用位置或函数的调用位置。

Names

获取当前 IDA Pro 数据库中所有命名过的地址及其对应的名称。这个函数非常有用,尤其是在逆向工程中需要获取程序中所有已命名的符号(如函数、全局变量等)的时候。

# 获取所有命名地址和名称
for address, name in idautils.Names():
    print(f"地址: 0x{address:X}, 名称: {name}")

get_name_ea_simple

通过符号名称获取其对应的有效地址(EA)。

这在你想要通过名称查找函数或全局变量的地址时特别有用。

# 指定你感兴趣的函数或符号名称
symbol_name = "main"  # 将此处的 "main" 替换为你要查找的符号名称

# 获取符号的有效地址
ea = idc.get_name_ea_simple(symbol_name)

CodeRefsTo

CodeRefsTo 是 IDAPython 中一个非常有用的函数,用于获取指向特定地址的代码引用。

这在反汇编和逆向工程中非常常用,因为它可以帮助你找出哪些代码位置调用或跳转到了某个特定的地址,比如一个函数的入口地址。

import idautils
import idc

def main():
    # 假设你想查找对某个函数(比如 "target_function")的所有代码引用
    function_name = "target_function"
    
    # 获取函数的起始地址
    function_start_ea = idc.get_name_ea_simple(function_name)
    
    if function_start_ea == idc.BADADDR:
        print(f"未找到函数 '{function_name}'")
        return

    print(f"函数 '{function_name}' 的起始地址: 0x{function_start_ea:X}")
    print("该函数的代码引用地址:")

    # 使用 CodeRefsTo 获取所有指向函数起始地址的代码引用
    for ref in idautils.CodeRefsTo(function_start_ea, 0):
        print(f"引用地址: 0x{ref:X}")

if __name__ == "__main__":
    main()

对于函数来说,将输出的结果,与“X”键的结果比较,可以看到是一致的。

CodeRefsFrom

用于获取从特定地址出发的所有代码引用。这在逆向工程中非常有用,因为它可以帮助你识别从某个位置开始的所有调用、跳转或其他代码引用的目标地址。这样,你可以更好地理解程序的控制流和调用关系。

没想通什么情况下返回列表会有多个值。问了下gpt,说是ea为函数的起始地址的时候,会返回该函数引用的其他函数。但是实际测试并没有。

可能是哪里有问题,反正先理解吧。

CodeRefsTo 与 CodeRefsFrom 是对应的。

参数解释:

  1. ea (必需):