2

我正在更改 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 MessageBoxWcall MessageBoxWcall 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”。

所以我认为必须有一些东西来组织这些“更新代码”程序。也许它与重定位表有关,我不知道。

你认为也许我应该把这个作为另一个问题来问吗?

4

3 回答 3

1

您的解决方案:

您添加的字符串应该是 UTF-16。

对于字符串“Hello”,您应该写“Hello”,点为 00h。确保在这个字符串的末尾至少有 00h00h00h (3 X 0) 还要确保当你 cal msgbox 时你用 dword ptr[] CALL DWORD PTR DS:[10010B8] 调用它

详细说明:

在程序的最后,靠近 LoadLibrary 字符串(不是 unicode),以 UTF-16 添加字符串,即每个 ASCII 字符由 00h 分隔,并且 unicode 字符串终止至少为 00h00h(00h 由转储中的点表示ollydbg 的窗口)

在程序的入口点,你可能有这个:

01003E21 PUSH 70
01003E23 PUSH winmine_.01001390
01003E28 CALL winmine_.0100400C

通过双击 PUSH 70 行将其替换为 JMP 01004A5F:(不要写“winmine_。”)

01003E21 JMP winmine_.01004A5F
01003E26 NOP
01003E27 NOP
01003E28 CALL winmine_.0100400C

在 01004A5F 你注入你的代码:

01004A5F PUSH 0
01004A61 PUSH winmine_.01004A5F
01004A66 PUSH winmine_.01004A5F
01004A6B PUSH 0
01004A6D CALL DWORD PTR[010010B8] ;msgbox

并在入口点添加跳转时删除的原始代码,然后跳转回正常的程序执行:

01004A72 PUSH 70
01004A74 PUSH winmine_.01001390
01004A79 JMP winmine_.01003E28

要查找 MessageBoxW 的地址,请按 CTRL+N,您将获得已注册函数的有序列表。

至于字符串,它看起来像这样:

01004A58 UNICODE "Hello",0

享受。

原始帖子:当您在 exe 中注入字符串时,在 OllyDbg 中尝试右键单击反汇编窗口并搜索->所有参考文本字符串。在那里您应该能够找到您的字符串及其地址。

以下是您应该仔细阅读的2篇文章:

http://osix.net/modules/article/?id=633

在本文的第 2 部分中,解释了如何用自己的消息替换 exe 中现有的(未使用的)字符串,以及如何使用自定义函数调用它。

http://osix.net/modules/article/?id=758

在本文的第 2 部分中,有关于文本部分和字符串以及如何引用它们的说明。

这应该为您提供大量信息来开始反转 Windows 应用程序。

作为反转 Windows 游戏的奖励教程: http ://osix.net/modules/article/?id= 723 (freecell)

于 2011-01-02T04:15:57.907 回答
0

如果字符串嵌入在 EXE 中,则字符串的偏移量不应更改。它是作为资源加载还是动态分配还是什么?如果是后者,那么您需要推送动态创建的地址。但是静态字符串应始终使用相同的偏移地址加载。

于 2011-01-02T02:46:15.517 回答
0

我认为您需要先将地址发送到AX,然后再push ax

mov ax,OFFSET string1  ;or use LEA ax,string1
push ax

因此,要创建您的 MessageBox,您需要执行以下操作:

mov ax,16            ;16 = Critical Icon (for example)
push ax
lea dx,title
push dx
lea dx,text
push dx
mov ax,0              ;0 is like NULL for the window's handle
push ax
call MesssageBox...
于 2011-01-02T17:53:49.250 回答