http://www.ollydbg.de/Loaddll.htm
refer to : http://bbs.pediy.com/showthread.php?s=&threadid=40211
调试DLL
by oooooooo
原创。02/28/2007 ver1.0
译者按: (In the debugging process, most of the time the crucial functions are resided in the DLL instead of an independent exe file. So the understand of the debugging DLL file is very important. In the article, the debugging procedure is updated to Windows XP SP2. )
实例1: MessageBox函数
实例 2: wsprintf 函数
详文及源码
ollydbg1.10可以调试独立的DLL. Windows 无法直接调用DLL,ollydbg 利用loaddll.exe间接调用 DLL.这个程序保存在压缩包里。如果你正尝试打开动态链接库文件, ollydbg会自动调用loaddll.exe 并且传递动态链接库文件名作为参数.
借助 loaddll,你可以调用由动态链接库输出的函数.我会通过在user32.dll 中的Windows' API wsprintf函数MessageBox函数来 演示这一功能.
实例1: MessageBox函数
1象调用普通可执行文件一样调用DLL, OllyDbg 发出警告:
5. 填写各个参数. 这一dialog对话框支持多达10 个参数. 参数是任何不使用寄存器的有效表达式。如果操作数指向内存, 在参数右边的窗口会显示内存的内容。 loaddll.exe保存10个内存缓冲区, 每个1K 、从ARG1标记到Arg10 , 你可以自由使用. 另外,对话框 支持两个假名(pseudovariables): loaddll.exe生成的父窗口句柄<hwnd> 和loaddll 的实例句柄<hinst>. 为了方便,当你首次使用输出调用, ollydbg自动把他们添加到历史清单上.
MessageBoxW 需要4 个参数:
handle of owner window .父窗口句柄. 在这里,我们只需选择<hwnd>;
address of UNICODE text in message box .UNICODE的文本信息的地址. 选择Arg2. 右侧以十六进制展出内存内容. 缓冲区初始化为零. 右键选择点击"Text|UNICODE (32 chars)"。选择首字位,按Ctrl+E (或者选择"二进制|编辑""Binary|Edit"菜单). In the appearing window, type "Text in box" or any other text to display;在出现的窗口里输入"文本框"("Text in box")或任何其他文字;
address of UNICODE title of message box . UNICODE的消息框标题文本信息的地址.选Arg3,然后在内存写入UNICODE格式的消息框标题文本"Box title";
style of message box.消息框样式是一个组合mb_xxx常数. OllyDbg knows them, type here MB_OK|MB_ICONEXCLAMATION. OllyDbg 可以识别他们,这里输入MB_OK|MB_ICONEXCLAMATION .
6.设置寄存器变量. 在输出函数中很少使用寄存器变量. 不过,OllyDbg 同样支持寄存器变量。.
7.其他选项. Hide on call “对话框隐藏”意味着在执行函数时,对话框从屏幕上消失. 这个选项在执行需很长的时间,或如果你要设断点时很有用. 你也可以手动关闭对话框. 当被调用函数执行完比时, OllyDbg 会自动重启“Call export” 对话框. “Pause after call” 意味着当被调用函数执行完比后暂停执行应用程序.
如果一切正确的话会出现类似对话框:
3.填写变量列表.
第一变量是一个缓冲区. 选择 <Arg1> 并且改变内存格式为 ASCII (32 chars);
第二变量是格式串. 选择 <Arg2> 并且改变内存格式为 ASCII (32 chars); Select first character, press Ctrl+E (binary edit) and type format string in ASCII field;选择首字,按Ctrl+E(二进制编辑),在ASCII 区输入格式串类代码;
第三变量是一个十进制常数100. OllyDbg 通常假定十六格式. Decimal point at the end of the constant forces decimal;结尾小数点强制十进制数;
第四变量是十六常数.OllyDbg 接受任何形式:0x12345678,12345678h 或者干脆12345678;
4.按下Call按钮 调用函数. 如果一切正确,结果如下: