直接从反汇编代码编辑 exe 二进制文件
Edit exe binary directly from disassembly code
有一款游戏总是在同一个汇编代码点崩溃,我没有源代码,所以只能直接编辑exe文件来修复它。
根据反汇编程序,不断崩溃的地方是地址 0x00629115,具有指针地址访问,其中 ECX 指针位于未初始化的地址,超过 50% 的机会是 0x0(可能在 C 代码中使用未初始化的指针) .在该地址之前有一个 JGE 命令,如果比较成功则跳过崩溃代码。
现在我要做的是将 0x00629106 处的 JGE 命令修改为 JMP 命令,以便它始终跳过崩溃代码。
但是我注意到,如果我在十六进制编辑器中打开 .exe 文件并转到地址 0x00629106,则二进制代码与反汇编程序中显示的不同。我想知道我应该如何编辑 exe 二进制文件。
可执行文件包含代码,但包裹着 headers、段指针...所以即使有地址偏移,您也不能单独使用此地址来查找您的代码。
你必须找到一个 position-independent 可识别的指令字符串并搜索它(如果有重定位你将找不到它),确保这是正确的/只有一次。
确保您正在寻找 position-independent 代码,否则偏移校正将导致匹配失败。
如果你的补丁代码比原始代码长,这会更难。您必须找到 useless/unused 代码或数据,在那里打补丁,然后 bsr 到该区域以保持可用的补丁字节大小。
另一个最后的困难: 一些编辑器使用可执行的加壳器来"encrypt"他们的代码(因为官方不存在解压程序但是this one非常有效) or/and 变小。
诀窍是:如果可执行文件不能用例如 7zip 很好地压缩,那么它可能被打包了。使用一些可执行的解包器创建可运行但解包的exe,并更改此版本(之后无需重新打包)。
有一款游戏总是在同一个汇编代码点崩溃,我没有源代码,所以只能直接编辑exe文件来修复它。
根据反汇编程序,不断崩溃的地方是地址 0x00629115,具有指针地址访问,其中 ECX 指针位于未初始化的地址,超过 50% 的机会是 0x0(可能在 C 代码中使用未初始化的指针) .在该地址之前有一个 JGE 命令,如果比较成功则跳过崩溃代码。
现在我要做的是将 0x00629106 处的 JGE 命令修改为 JMP 命令,以便它始终跳过崩溃代码。
但是我注意到,如果我在十六进制编辑器中打开 .exe 文件并转到地址 0x00629106,则二进制代码与反汇编程序中显示的不同。我想知道我应该如何编辑 exe 二进制文件。
可执行文件包含代码,但包裹着 headers、段指针...所以即使有地址偏移,您也不能单独使用此地址来查找您的代码。
你必须找到一个 position-independent 可识别的指令字符串并搜索它(如果有重定位你将找不到它),确保这是正确的/只有一次。
确保您正在寻找 position-independent 代码,否则偏移校正将导致匹配失败。
如果你的补丁代码比原始代码长,这会更难。您必须找到 useless/unused 代码或数据,在那里打补丁,然后 bsr 到该区域以保持可用的补丁字节大小。
另一个最后的困难: 一些编辑器使用可执行的加壳器来"encrypt"他们的代码(因为官方不存在解压程序但是this one非常有效) or/and 变小。
诀窍是:如果可执行文件不能用例如 7zip 很好地压缩,那么它可能被打包了。使用一些可执行的解包器创建可运行但解包的exe,并更改此版本(之后无需重新打包)。