下一步,我们要设定栈中参数的个数。在这个例子中,不必做进行这个操作,因为OllyDbg已经知道了MessageBoxW函数的参数数量。但是,如果你愿意的话,也可以单击左边的复选框,改变成你认为合适的参数数量。
现在填写参数列表。这个对话框中支持至多10个参数. 参数可以是任何有效的表达式,而不必使用寄存器。如果操作数指向了内存,则参数右边的缓冲区窗口会显示内存中的数据。Loaddll.exe 有10个大小为1K的缓冲区,这些缓冲区被标记为Arg1 .. Arg10,,你可以方便自由的使用它们。另外,对话框还支持两个伪变量:由loaddll.exe创建的父窗口句柄<Hwnd>,以及loaddll的实例句柄<Hinst>。为了方便你的使用,在你第一次使用调用输出函数时,OllyDbg就已经将这两个伪变量加到了历史列表中去了。
MessageBoxW e函数需要4个参数:
l 父窗口句柄。 这里我们选择<Hwnd> ;handle of owner window. Here, we simply select <Hwnd>;
l 消息框标题的UNICODE文本的地址。选择Arg3并在Unicode式的内存中写上“Box title”;
l 消息框的风。使用常量MB_xxx进行组合.OllyDbg 可以识别这些常量。在这里我们键入:MB_OK—>MB_ICONEXCLAMATION。
这里不需要寄存器参数。
现在我们准备调用输出函数。选项“在调用时隐藏[Hide oncall]”意思是说,当函数运行时对话框将会从屏幕消失。当我们执行一个会运行很长时间的函数,或者设置了断点的时候,这个选项非常的有用。你也可以手动关闭对话框。当函数执行完毕后,OllyDbg会重新自动打开。“调用输出函数”对话框。选项“在调用后暂停[Pause after call]”意思是说,在执行完函数后,loaddll将会被暂停。
按“调用[Call]按钮”后,OllyDbg 会自动备份所有的内存、校验、参数、寄存器等信息。并隐藏对话框,然后调用 MessageBoxW 函数。和期望的一样,消息框在屏幕中出现了:
函数 MessageBoxW 不会修改参数。如果你调用的函数更新了内存,比如函数 GetWindowName,修改的字节将会在数据区里高亮。注意:EAX 返回为1,表示成功。
不幸的是,你不能通过这种方式调试OllyDbg的插件,插件关联到ollydbg.exe文件,Windows系统不能在同一个应用程序里加载并运行两个可执行文件。
二、解码提示[Decoding hints]
在某些情况下,分析器不能区分代码和数据。让我们看看下面的例子:
const char s[11] = "0123456789";
...for (i=0x30; i<0x3a; i) t[i—0x30]=s[i—0x30];
好的编译器将会将上面的代码优化成如下样子: e
for (i=0x30; i<0x3a; i)(t—0x30)=(s—0x30);
这里t—0x30 和 s—0x30 都是常量,并编译成如下形式:
MOV AL,[BYTE s_minus_30EBX]
MOV [BYTE t_minus_30EBX],AL
编译器也可能将常量字符串"0123456789"插入到执行代码中。在1.10版本中,我打算用寄存器的来决定是否的数据或代码。当遇到上面的命令,分析器将假定地址s_minus_30处包含字符数据。但事实上,可能那里是代码。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-41789-25.html
另外还有
被美国派兵直接从总统府捉回美国