如何使用IDA Pro查找新版本二进制文件中地址发生变动的函数?
基于IDA Pro的ELF .so函数跨版本地址追踪方案
一、自动识别所有版本间地址变动的函数
可以实现,最常用的方案是使用IDA配套的BinDiff对比工具,操作步骤如下:
- 分别对1.0、1.1版本的.so文件执行IDA完整自动分析,分析结束后保存各自的idb/i64数据库文件
- 在1.0版本的数据库界面打开BinDiff插件(新版IDA已内置,老版本需单独安装),选择
Diff Databases后导入1.1版本的数据库,等待对比完成 - 切换到BinDiff结果面板的
Functions标签页,所有函数的新旧地址、匹配相似度、地址偏移都会直接展示,筛选新旧地址不一致的条目即可得到全部地址发生变动的函数列表
如果没有安装BinDiff,也可以用简单的自制脚本实现:
分别在两个版本的IDA Python控制台执行命令导出函数地址表:
# 导出格式为 函数名: 十六进制地址 for func_ea in idautils.Functions(): print(f"{idc.get_func_name(func_ea)}: {hex(func_ea)}")
将两次导出的结果做对齐对比,即可快速找到相同函数名对应的地址差异。
二、通过旧版本地址查询新版本对应函数地址
根据你的场景,有多个可落地的方案:
场景1:函数保留公开符号(如示例中的Writer_Starting函数名未被剔除)
直接在新版本IDA中按快捷键Ctrl+L,搜索函数名Writer_Starting即可直接得到新地址,无需关联旧地址。
场景2:文件被strip无公开符号,仅持有旧地址0x3DA224
- BinDiff快速跳转:在旧版本数据库中跳转到
0x3DA224地址对应的函数,右键选择BinDiff->Jump to matched function in other DB,即可直接跳转到新版本对应函数的地址,匹配准确率可达95%以上 - 特征码搜索:提取旧地址对应函数前16~32字节的机器码作为特征,在新版本二进制中执行字节搜索,搜索时勾选忽略重定位项的选项,只要函数逻辑未修改就能直接定位到新地址
- 固定偏移计算:如果是小版本更新(如你的示例中地址仅偏移4字节),通常所有未修改函数的地址偏移是固定的,找一个两个版本中确认是同一个的函数算出偏移量,旧地址加上该偏移量即可直接得到新地址
注意:如果版本更新修改了函数实现、或者开启了代码混淆/加固,优先使用基于控制流图匹配的BinDiff方案,准确率远高于单纯的字节特征匹配。
内容的提问来源于stack exchange,提问作者ibrahem hossam
相关产品推荐
相关产品推荐

