我反汇编了一个破解我,我想用WINAPI SetDlgItemText()取代一个空的空间,它带有三个参数。
我成功地添加了三个&#34; push&#34;但是当我尝试汇编call <JMP.&USER32.SetDlgItemTextA>
时,OllyDbg用红色Unknown module
说道我
上面几行使用了相同的指令(通过软件,我自己没有组装)
如何解决此错误并调用SetDlgItemText?二进制复制 - 二进制粘贴并不能解决问题(跳转到代码的不同部分,可能是因为我对操作码造成了一些麻烦)<登记/>
这是一个截图(full size):
EDIT1:我在地址0x00401460找到了JMP功能。所以我用它替换了它,立即用ollydbg用call <JMP.&USER32.SetDlgItemTextA>
字符串替换它。为什么不能这样做呢?
答案 0 :(得分:0)
在PE File Format中,通常使用导入地址表(IAT)来调用导入函数。此结构包含一个连续的地址指针列表,在加载二进制文件并解析导入时,Windows Loader将对其进行初始化。
在导入目录中,它们是关于导入的模块的信息,对于每个模块,函数名称和函数是否已导入。在加载过程中,此信息用于定位要导入的模块和函数,并使用导入函数的内存中的地址初始化IAT,该地址已加载到内存中(在常见的导入过程中)。
根据您已经拥有的问题,当您再次拨打SetDlgItemTextA
时,您需要做的是搜索二进制文件。该指令应该类似于CALL [address]
(例如:CALL [0x401634]
)或JMP [address]
(例如:JMP [0x401434]
),请注意是调用该地址中的地址,而不是调用到那个地址,是一个doble间接(很可能是OllyDB解析函数的名称并用名称替换这个地址),在这种情况下你可以读取指令的二进制表示的地址。您的调用将是相同的,指令的操作码可能必须是0xFF (Indirect CALL or JMP)
。
CALL or JMP
中的地址是Loader将使用导入函数的实际内存地址设置的导入函数的指针的地址。