在IDA Pro里改字节或改指令时,很多人最容易误会的一点,是以为自己一改数据库,磁盘上的原始程序就已经跟着变了。Hex-Rays官方文档对这件事写得很明确,IDA默认修改的是“载入到数据库里的输入文件镜像”,并不会立刻改动原始输入文件;真正落到文件层面,官方给了两条路,一条是先导出difference file这类补丁文件,再交给外部工具应用,另一条是直接用【Apply patches to input file】把补丁写回输入文件。也就是说,“导出补丁文件”和“生成新程序”本来就是两种不同处理方式。
一、IDA Pro怎么导出补丁文件
IDA Pro怎么导出补丁文件,重点不是先找导出按钮,而是先把补丁真正写进数据库里的输入镜像。Hex-Rays官方把这部分放在【Edit】→【Patch core】下面,并明确说明可做的修改包括改byte、改word,以及在IBM PC处理器上直接汇编指令。只有前面这些改动已经进了数据库,后面才谈得上导出差异补丁。
1、先在【Edit】→【Patch core】里完成补丁修改
官方文档里,Patch core的入口下有【Patch byte or word】和【Assemble...】两类核心动作。前者适合直接改字节,后者适合在支持的处理器环境下把指令重新汇编进数据库。做完这一步以后,IDA记录的是“原始值”和“当前值”的差异,这也正是后面导出补丁文件的基础。
2、确认你改的是数据库镜像,不是磁盘原文件
Hex-Rays官方强调得很直接,IDA never modifies the input file,默认只改载入数据库里的输入文件镜像。这个认知很重要,因为它解释了为什么很多人改完以后,在系统目录里重新打开原文件,发现内容并没有变化。不是改动丢了,而是还没走到真正导出或写回那一步。
3、导出补丁文件走difference file这条线
官方说明里写到,你可以create a difference file,然后再用external tool去应用这些补丁。这就是“导出补丁文件”的官方思路,也就是先把改动整理成差异文件,而不是直接改磁盘上的程序本体。对需要留存补丁记录、给别人复用,或者不想直接碰原始文件的场景,这条路更合适。
4、补丁字节输入时要注意格式
如果你在【Patch byte or word】里一次输入多个字节,官方也给了明确格式要求。输入项可以是数字、字符串、Unicode字符串,或者用问号表示忽略可变字节。这个细节的意义在于,补丁本身不是只能一字节一字节敲,正确利用输入格式,能让导出前的补丁整理更稳。
二、IDA Pro补丁修改后怎么生成新程序
IDA Pro补丁修改后怎么生成新程序,真正关键的不是再去“导出一次”,而是把已经写进数据库的补丁真正回写到输入文件。Hex-Rays官方在Patch core页面里给了明确入口,也就是【Apply patches to input file...】。这一步做完以后,之前停留在数据库镜像里的改动,才会真正落到文件层。
1、先走【Apply patches to input file...】
官方文档对这个命令的定义非常直接,就是“把之前打过补丁的字节应用回输入文件”。也就是说,如果你的目标是拿到一个已经被改过的可执行文件,而不是只保留一份补丁描述,那么核心动作就是这一步,不是停在Patch byte或Assemble本身。
2、生成“新程序”前最好先准备文件副本
虽然官方文档重点写的是“应用回输入文件”,但从工作流程上看,若你不想覆盖原始样本,实际更稳的做法是先备份或复制一份输入文件,再对副本执行【Apply patches to input file...】。这样最后得到的就是补丁后的新程序文件,而原始文件仍然留作对照。这个做法和官方“默认不改原文件,只有显式应用才改”的逻辑是一致的。
3、需要恢复原始内容时可以用Restore
Hex-Rays官方还特别说明了,如果在【Apply patches to input file...】里选中【Restore】选项,那么应用回输入文件的就会是原始字节,而不是当前补丁字节。这个细节很有用,因为它说明这条入口不只是“写补丁”,也是“撤回补丁”的文件级通道。
4、调试状态下补丁还可能同时改内存
官方文档提醒,如果在debugger active的状态下调用补丁命令,IDA会修改内存和数据库;若数据库里没有对应补丁字节,则只会改进程内存。放到“生成新程序”这个问题上,含义就是:调试期看到程序行为变了,不等于磁盘文件已经生成了新版本;最后仍然要回到文件级的【Apply patches to input file...】。
三、IDA补丁文件和新程序该怎么分开用
IDA补丁文件和新程序该怎么分开用,这一步不是简单重复前两段,而是要把两种产物的用途真正分清。Hex-Rays官方页面已经把思路摆得很清楚:difference file更像“描述改了什么”,而apply patches to input file更像“把改动真正写进二进制”。前者偏记录和复用,后者偏交付和运行。把这两层混在一起,后面最容易出现的就是补丁有了,但程序没变;或者程序变了,却没留下差异记录。
1、要留审计记录时优先导出补丁文件
如果你关心的是“改了哪些地址、哪些字节”,或者需要把补丁交给别的流程去统一应用,那么difference file这条线更合适。因为官方已经明确写到,差异文件就是给external tool应用用的,它天然更适合做变更记录。
2、要直接运行测试时优先生成新程序
如果你的目标是尽快验证补丁后的程序行为,比如重新运行、重新调试、重新比对功能,那么更适合直接走【Apply patches to input file...】。因为这一步才会把数据库里的改动真正落回文件,让你拿到一个能直接运行的修改后程序。
3、两种结果最好同时保留
更稳的实务做法,通常不是二选一,而是同时保留差异补丁和补丁后的程序文件。这样前者负责说明“改了什么”,后者负责验证“改完以后程序怎么跑”。这个分工虽然是流程建议,但完全建立在Hex-Rays官方给出的两条路径之上。
4、最后一定回到文件层核对
因为IDA默认改的是数据库镜像,所以不论你最终选择导出difference file,还是应用补丁生成新程序,最后都要回到文件层去核对产物。只要这一步没做,很多“我明明改了怎么没生效”的问题都会反复出现。
总结
IDA Pro怎么导出补丁文件,核心是先在【Edit】→【Patch core】里把补丁改进数据库镜像,再走difference file这条线导出差异。IDA Pro补丁修改后怎么生成新程序,核心则是用【Apply patches to input file...】把已经修改过的字节真正写回文件。把这两条路径分开以后,补丁文件和补丁后的程序就不会再混成一件事,后面的验证和留档也会清楚很多。
