【问题标题】:Edit exe binary directly from disassembly code [duplicate]直接从反汇编代码编辑exe二进制文件[重复]
【发布时间】:2017-01-03 01:36:37
【问题描述】:

有一个游戏总是在同一个汇编代码点崩溃,我没有源代码,所以唯一的方法是直接编辑 exe 文件来修复它。

根据反汇编程序的说法,不断崩溃的地方是地址 0x00629115,具有指针地址访问,其中 ECX 指针位于未初始化的地址,超过 50% 的机会为 0x0(可能在 C 代码中使用未初始化的指针)。在该地址之前有一个 JGE 命令,如果比较成功则跳过崩溃代码。

现在我要做的是将 0x00629106 处的 JGE 命令修改为 JMP 命令,以便它始终跳过崩溃代码。

但是我注意到,如果我在十六进制编辑器中打开 .exe 文件并转到地址 0x00629106,则二进制代码与反汇编程序中显示的不同。我想知道我应该如何编辑 exe 二进制文件。

【问题讨论】:

  • 搜索几个相邻的字节,并确保它们在代码中只找到一次。

标签: windows assembly binary exe disassembly


【解决方案1】:

可执行文件包含代码,但包含标头、段指针……所以即使有地址偏移,您也不能单独使用此地址来查找代码。

您必须找到一个与位置无关但可识别的指令字符串并搜索它(如果有重定位,您将找不到它),确保这是正确的/只出现一次。

确保您正在寻找与位置无关的代码,否则偏移校正将导致匹配失败。

如果您的补丁代码比原始代码长,这将更难。您必须找到无用/未使用的代码或数据,在那里打补丁,然后 bsr 到该区域以保持可用的补丁字节大小。

另一个最后的困难:一些编辑器使用可执行打包器来“加密”他们的代码(因为解包程序并不正式存在,但this one 非常有效)或/并使其更小。

诀窍是:如果可执行文件不能用 7zip 很好地压缩,那么它可能已经打包。使用一些可执行解包器创建可运行但解包后的exe,并更改此版本(无需重新打包)。

【讨论】:

  • 谢谢,在十六进制编辑器中搜索代码有效,实际地址似乎是 0x00229106,相差 400000 字节...我不知道为什么反汇编程序实际上认为它位于 0x00629115比实际地址大几英里;负长度的标头?
  • 或者这是内存中的实际物理地址。您不能相信这一点,除非您自己手动将段加载到内存中/从系统加载器访问该信息。保持简单,只搜索字节:)
  • @cr001:文件未映射到虚拟地址 0x00000000 的内存中,因为我们希望 NULL 指针取消对错误的引用,而不是命中文件的第一个字节。有一个关于在给定代码地址的 Windows PE 可执行文件中找到正确偏移量的问题;我会看看能不能找到它并将这个问题标记为重复。
  • @cr001:找到了。 Neitsa 的回答非常详细。但是,如果搜索一个唯一的代码字节序列有效,那可能会更容易!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 2011-09-05
  • 1970-01-01
  • 2018-03-25
  • 2012-05-17
  • 2012-12-26
  • 2015-09-28
相关资源
最近更新 更多