IDA Pro数据库不是“保存”,而是把你的逆向智慧刻进硬盘
你有没有过这样的经历:连续三天蹲在router_firmware.bin里,终于定位到那个藏在层层混淆中的WiFi密钥解密函数,刚重命名成decrypt_wifi_key_v2、写完三行关键注释,手一抖关掉了IDA——结果弹出“是否保存数据库?”时点了“否”?或者更糟:笔记本突然黑屏,再开机,router.i64打开后,函数名变回了sub_4012A0,注释全空,连结构体定义都消失了?
这不是IDA Pro的bug。这是你还没真正理解——.i64不是文件,是你分析过程的数字分身;自动保存不是功能,而是一套精密的状态固化协议。
那个被所有人忽略的真相:.i64根本不是“反汇编结果”的存储
翻开IDA官方文档,它说“.i64 is a database file”。但这句话极具误导性。如果你把它当成SQLite或PostgreSQL那样的通用数据库,就注定踩坑。
真实情况是:.i64是一个专为逆向语义建模定制的内存镜像持久化层。它不存“指令”,它存的是IDA内核对指令的认知状态。
比如,当你在地址0x4012A0按下N键,输入check_wifi_psk,IDA做的远不止是改一个字符串:
- 它更新了该地址关联的
func_t对象的name字段; - 在全局符号表(
names)中插入一条ea → "check_wifi_psk"映射; - 触发交叉引用索引重建,确保所有调用它的
call指令能立刻在Xrefs To窗口中显示; - 若该函数被标记为
library function,还会同步刷新类型库(.til)绑定; - 最后,把这一整套变更打包成一个事务块(transaction chunk),通过WAL(Write-Ahead Logging)机制刷入磁盘。
所以,.i64里没有一行汇编代码。它只有一张张高度压缩的B+树页:
-func_tree:按起始地址索引所有函数对象;
-xref_tree_v3(IDA 9.0+):用三级哈希+位图加速百万级引用查询;
-cmt_tree:将注释按EA(Effective Address)