Assembly 如何将字符串地址与程序集、机器代码堆叠

Assembly 如何将字符串地址与程序集、机器代码堆叠,assembly,executable,code-injection,dll-injection,Assembly,Executable,Code Injection,Dll Injection,为了了解代码注入是如何工作的,我正在修改mineswipper.exe。简单地说,我希望扫雷艇在启动前显示一个消息框。因此,我在可执行文件中找到一个“洞穴”,然后定义要在messagebox中显示的字符串并调用messagebox。当然,另外,我必须更改可执行文件的模块入口点处的值,并首先将其指向我的附加代码,然后继续它自己的代码。 所以在山洞里我做什么 "hello starbuck",0 push 0 //arg4 of MessageBoxW function push the addr

为了了解代码注入是如何工作的,我正在修改mineswipper.exe。简单地说,我希望扫雷艇在启动前显示一个消息框。因此,我在可执行文件中找到一个“洞穴”,然后定义要在messagebox中显示的字符串并调用messagebox。当然,另外,我必须更改可执行文件的模块入口点处的值,并首先将其指向我的附加代码,然后继续它自己的代码。 所以在山洞里我做什么

"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中的地址1定义了
MessageBoxW
,而
call MessageBoxW
后面的指令位于地址2 我没有写
callmessageboxw
,而是写
calladdress2-address1

所以我的问题是,如何将字符串的地址推送到堆栈中? 例如,如果我通过ollydbg进行这些更改,我会给出“hello starbuck”的即时地址进行推送,并且它会工作。但在重新加载可执行文件或在ollydbg之外启动它之后,它自然会失败,因为即时地址会发生变化

提前感谢,, 伊吉特

编辑:现在出现这个问题是因为每次打开exe时模块入口点的高位字都会改变。因此,为了查看其他字符串是如何被推送到堆栈的,我做了以下操作:

我在代码中找到了“销毁画布”字符串。地址: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”

所以我认为一定有什么东西组织了这些“更新代码”的过程。我不知道,也许这和搬迁表有关


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

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

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

您的解决方案:

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

对于字符串“Hello”,您应该写“H.e.l.l.o”,点为00h。确保此字符串的末尾至少有00h00h00h(3 X 0) 另外,请确保在调用msgbox时使用dword ptr[] 呼叫德沃德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_.”)

在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部分中,将解释如何用自己的消息替换exe中现有的(未使用的)字符串,以及如何使用自定义函数调用它

在本文的第2部分中,对文本部分和字符串以及如何引用它们进行了解释

这将为您提供大量信息,以便开始重新设置windows应用程序的版本

作为有关逆转windows游戏的奖励教程:
(freecell)

您的解决方案:

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

对于字符串“Hello”,您应该写“H.e.l.l.o”,点为00h。确保此字符串的末尾至少有00h00h00h(3 X 0) 另外,请确保在调用msgbox时使用dword ptr[] 呼叫德沃德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_.”)

在01004A5F,您注入代码:

01004A5F PUSH 0
01004A61 PUSH winmine_.01004A5F
01004A66 PUSH winmine_.01004A5F
01004A6B PUSH 0
01004A6D CALL DWORD PTR[010010B8] ;msgbox
并添加在输入点添加跳转时删除的原始代码
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...