有一款游戏在同一个汇编代码点上崩溃,我没有源代码,因此只需通过直接编辑exe文件来修复它。
根据反汇编程序,不断崩溃的地方位于地址0x00629115,指针地址访问,其中ECX指针处于未初始化的地址,超过50%的可能性为0x0(可能在C代码中使用未初始化的指针)。在该地址之前有一个JGE命令,如果比较成功,它会跳过崩溃的代码。
现在我要做的是将0x00629106的JGE命令修改为JMP命令,以便它总是跳过崩溃的代码。
但是我注意到如果我在十六进制编辑器中打开.exe文件并转到地址0x00629106,则二进制代码与反汇编程序中显示的内容不同。我想知道如何编辑exe二进制文件。
答案 0 :(得分:2)
可执行文件包含代码,但包含标题,段指针,......所以即使使用地址偏移量,也不能单独使用此地址来查找代码。
你必须找到一个与位置无关但可识别的指令字符串并搜索它(如果你找不到重定位的话),确保这是正确的/只有一次发生
确保您正在寻找与位置无关的代码或偏移校正将使匹配失败。
如果您的补丁代码比原始代码长,这将更难。您必须找到无用/未使用的代码或数据,在那里修补,并且bsr到该区域以保持可用的补丁字节大小。
另一个最后的难题:一些编辑使用可执行的打包程序来加密"他们的代码(因为解包程序没有正式存在,但是this one非常有效)或/并使其变小。
诀窍是:如果可执行文件不能很好地压缩7zip,那么它可能已经打包了。使用一些可执行的解包器来创建可运行但未解压缩的exe,并更改此版本(之后无需重新打包)。