我看到的格式为:
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