我正在更改 minesweeper.exe 以了解代码注入的工作原理。简单地说,我希望扫雷器在开始之前显示一个消息框。因此,我在可执行文件中找到了一个“洞穴”,然后定义了要在消息框中显示的字符串并调用消息框。此外,当然,我必须更改可执行文件的模块入口点的值,并首先将其定向到我的附加代码,然后继续其自己的代码。所以我在山洞里做什么;
"hello starbuck",0
push 0 //arg4 of MessageBoxW function
push the address of my string //arg3, must be title
push the address of my string //arg2, must be the message
push 0 //arg1
call MessageBoxW
...
现在由于可执行文件中代码的内存地址每次加载到内存中都会改变,为了调用MessageBoxW函数,我给出了在导入地址表中定义MessageBoxW的地址的偏移量。例如,如果在 IAT 中的address1MessageBoxW
处定义,并且紧随其后的指令是在address2
而不是write ,我写.call MessageBoxW
call MessageBoxW
call address2 - address1
所以我的问题是,如何将字符串的地址推入堆栈?例如,如果我通过 ollydbg 进行这些更改,我会给出“hello starbuck”的直接地址以进行推送,并且它可以工作。但是在重新加载可执行文件或在 ollydbg 之外启动它之后,它自然会失败,因为直接地址发生了变化。
提前感谢,伊吉特。
编辑:现在发生这个问题是因为每次打开 exe 时模块入口点的高位字都会发生变化。因此,为了查看其他字符串是如何被推入堆栈的,我这样做了:
我在代码中找到了“Destroy Canvas”字符串。它位于地址:00403E44。在地址 0042878E 处,有一条指令PUSH 00403E44
(68 44 3E 40 00),这意味着指向字符串的指针被压入堆栈。然后我在UltraEdit中打开exe,找到对应的地址,就是00027D8E。在那里,它写的不是“68 44 3E 40 00”,而是“68 44 3E 00 01”。现在这意味着当 OllyDbg 加载 exe 时,它会更新这些代码;00 01 到 40 00。我查看了其他字符串,它们的推送指令也是如此。所以我想如果我在 UltraEdit 中写“68 DA 9A 00 01”而不是“68 DA 9A 40 00”来推送字符串,它也会被更新。但事实并非如此。之后我在 OllyDbg 中打开 exe 时,要推送的地址仍然是“01009ADA”。
所以我认为必须有一些东西来组织这些“更新代码”程序。也许它与重定位表有关,我不知道。
你认为也许我应该把这个作为另一个问题来问吗?