我试图从汇编代码中调用USER32.DLL函数。我在Ollydbg 2.01中启动了一个应用程序(calc.exe)。我选择calc.exe只是因为我知道它会加载USER32.DLL。

我看到的格式为:

MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, uType);
        hWnd=0 usually  "If this parameter is NULL, the message box has no owner window"
        uType = MB_OK =0 for OK button only


链接

我将4个值压入堆栈然后尝试在Olly中输入以下内容:

CALL DWORD PTR DS:[<&USER32.MessageBoxA>]


但是Olly不会汇编它,并给我错误消息“请指定模块”
(如在链接中)



我知道USER32.DLL已加载:

,我确实看到消息框过程在内存中


编辑:看来我不能使用Olly反汇编的确切语法。例如,calc.exe调用USER32.MessageBeep,但它是通过使用存储在00121420 =&USER32.MessageBeep的地址间接实现的。

00145C19  |.  FF15 20141200 CALL DWORD PTR DS:[<&USER32.MessageBeep> ; \USER32.MessageBeep


要让Olly创建双击并组装相同的指令:

CALL DWORD PTR DS:[00121420]


,然后出现

00145C19  |.  FF15 20141200 CALL DWORD PTR DS:[<&USER32.MessageBeep> ; \USER32.MessageBeep


。如果我能弄清楚如何键入标签USER32.MessageBeep而不是寻找它并复制/粘贴地址,那将是很好的选择。

在我们可以简单地调用之前,似乎还有更多的知识要知道。加载的DLL中的函数。当我看到人们在Olly中编辑补丁以从其他模块调用过程时,他们似乎只是在调用原始程序已经调用的过程,而对于带有MessageBoxA的USER32.DLL,我面临的另一个挑战是它不在内存中。尝试调用消息框时,结果很奇怪(它出现在后台,但不会让鼠标靠近它,并返回到90909090的奇怪地址-可能是由于下一条指令操作码所致)。也许这种奇怪的行为是由于它需要对消息框进行一些设置,而程序并未完成这些设置。

因此,对我的问题的答案可能取决于该程序是否已经由原始程序加载。在Blabbb的回答中,他/她使用notepad.exe而不是calc.exe。

我的问题也许变得更加专注,但是对我的问题的一个很好的答案可以解释如何加载其他模块,以及如何在Ollydbg中实现这一点。我仍在学习如何将PE应用程序加载到内存中,但是我想知道答案是否是在模块之间进行切换,我们不应该期望看到相对的CALL操作码E8(请参见下面的blabbb的注释),因为程序员不知道该地址是什么。 DLL过程将在内存中加载,并且在原始程序中,它们必须通过操作码FF15间接通过间接CALL。我认为这可能与“可能注册DLL函数?”的行为有关。在calc.exe中,似乎不能间接调用MessageBoxA(除非我也许用其地址在某个地方编辑内存)。但是,如果我停在已经加载到Olly的程序中,则应该能够汇编这些相对的CALL指令并调用该过程。

就calc.exe而言,我在内存的calc .text部分看到了一些但不是全部的USER32.DLL过程。看来程序通过此列表间接调用它们。例如,这里有一些USER32


使用calc.exe,在这里找不到MessageBoxA,但是如果我在USER32.DLL模块中查找其地址,然后选择名称(请参见下文)



我可以按名称排序,然后开始键入名称,以便它为我找到它



,然后组合调用7634FD1E

00148C40      6A 00         PUSH 0
00148C42      68 598C1400   PUSH 00148C59                            ; ASCII "cap"
00148C47      68 5D8C1400   PUSH 00148C5D                            ; ASCII "text"
00148C4C      6A 00         PUSH 0
00148C4E      E8 CB702076   CALL MessageBoxA




#1 楼

除非您说口译员的语言是通用的,否则名称是没有意义的。
如果有疑问,请选择二进制文件
使用call 12345678而不是call @lkfklsdf.skhfkhfasfhkasjfh
或学习语言

call DWORD [user32.MessageBoxA] 


,只需不到几分钟即可形成逻辑,而不是花几个小时在论坛中等待答复。

屏幕快照显示了呼叫语法的一些变化
/>在提出问题之前先进行探索和实验,

编辑

ff 15 is an indirect call 
e8 is a direct call 


如果dll已加载,则可以用E8调用
间接调用需要导入已解析的
,尽管间接调用已解析
,它将调用符号(虚假地址)指向的DWORD
行为,无论它是否计算或记事本,如果您注意到我正在ntdll地址空间上组装





评论


在寻找问题之前,我确实会花点时间尝试一些事情。如果我遇到麻烦和询问,也可能会帮助他人。当我完全弄清了答案后,如果没有人提供完全令人满意的答案,我将回答自己的问题。到目前为止,我意识到E8 = CALL的操作码与下一条指令地址有关,而FF15是间接调用。间接CALL通过已加载到进程内存中的地址进行。在那之后,我意识到程序必须已经加载了它,因为user32.messageboxA不适用于calc.exe,但是蜂鸣声却是

– Markbotix
16年1月31日在6:06



编辑以添加更多信息

– blabb
16年1月31日在16:17