我对组装完全不熟悉。我正在为可执行文件编写补丁来修复图形问题。特别是我需要将窗口的dwExStyle参数从0更改为00020000.原始指令的十六进制代码是
6A 00 (push 0)
当我试图将其改为
时68 00 00 02 00 (push 00020000)
可执行文件已停止运行,我收到访问冲突错误。如何在不搞乱可执行文件的情况下编辑push命令的参数? 提前致谢
编辑:执行整个代码来调用函数:
:0055935D 6A00 push 00000000
:0055935F 56 push esi
:00559360 6A00 push 00000000
:00559362 6A00 push 00000000
:00559364 68F9010000 push 000001F9
:00559369 6886020000 push 00000286
:0055936E 6800000080 push 80000000
:00559373 6800000080 push 80000000
:00559378 6A00 push 00000000
:0055937A 683C565700 push 0057563C |
:0055937F 683C565700 push 0057563C
:00559384 6A00 push 00000000
* Reference To: USER32.CreateWindowExA, Ord:0059h
|
:00559386 FF1574B15600 Call dword ptr [0056B174]
正如您所看到的,调用的函数是来自Windows API的CreateWindowExA,它应该为所需的参数(窗口样式)设置dword
答案 0 :(得分:2)
如果您对此完全陌生:汇编是一种语言 - 二进制代码指令位于可执行文件中,从ASM文件编译。
如果必须修补二进制文件,则必须仔细检查指令指针的起始位置以及指令的参数开始和结束的位置,并仅修改可执行文件中的这些位。
坏消息是,如果你真的有
6A 00 (push 0)
这是一个推送字节参数,你不能直接用dword push 00020000替换它,
编辑:澄清一下,如果它真的是使用字节推送,那么它是某种C / C ++编译器优化,而且你可以做的事情并不多。
编辑2:操作数6A将立即字节推入堆栈,但堆栈指针仍为probably decremented by 4,所以这部分是我的回答很可能是错误的:& #34;同样接收参数的函数将假设一个字节从堆栈中出来,这将导致堆栈缓冲区不同步,并且访问冲突只是在拐角处等待。"
答案 1 :(得分:2)
如果在二进制文件中有一些可以安全覆盖的空间(查找一系列'0x90'没有操作指令),你可以编写指令来准备参数并在函数期望调用dwExStyle之前跳回。或者自己调用该功能并完全跳过原始功能。您将替换函数的第一个字节,使用对新插入指令的“跳转”指令进行修补。
答案 2 :(得分:1)
最初插入更多字节,您将所有指令从此地址移动到可执行文件的末尾几个字节,然后更改了所有跳转目标。
修补可执行文件并非易事,不适合初学者恕我直言。