在逆向工程中,“修补文件”是什么意思?

逆向工程 修补 补丁反转 快手
2021-07-08 11:57:18

我一直在解决一些破解程序,我下载的每个文件,在“说明”中都说:“显然不允许打补丁”。这意味着什么?以及如何修补文件?

2个回答

以下引用来自unix.stackexchange

修补文件意味着修改它,其内涵是修改通常很小。

因此,修补可执行文件是一个更改其内容的过程,通常是为了更改其原始行为而执行的。

打补丁显然是不允许的,这意味着特定的crackme 的作者希望您在不修改其内容的情况下对其进行破解。例如,考虑一个简单的程序:

ask_user_for_password();
read_input();
if (isPasswordCorrect())
    printf(“Congratulations, you have cracked it!\n”);
else
    printf(“Wrong password! Try again!\n”);

当然,可以修补它,以便它始终打印“祝贺 [...]”消息,但是这个非常简单的破解程序的重点是实际以某种方式找到该密码(例如通过找到解密密钥)。

通常,要修补文件,您需要:

  1. 找到你要改变的地方/指令(也可能是jnzjz的@Axel穆尼奥斯说,但它可能是一个jmp包含要被执行以及代码中的位置)。
  2. 找出代表您想要放置在那里的指令机器代码是什么- 这可以通过首先编译用汇编编写的程序然后反汇编来完成。如果您正在研究 x86 架构,您也可以使用此站点
  3. 十六进制编辑器中打开二进制文件,找到要放置代码的偏移量,然后粘贴上一步中获得的机器代码。

术语“修补[二进制]”意味着修改指令集。例如,如果有条件跳转需要将一些内存设置为特定值,而不是修改内存,这可能是破解程序的目标,我可以简单地修补二进制文件以始终执行该跳转(通过更改从jnzjz)跳转的条件通过调试器打补丁很容易让我改变指令,保存新的二进制文件,然后运行它。

这里有更多信息。