OllyDbg打API断点失败,求指点!!!

jamseyang 2011-08-29 04:19:02
使用OllyDbg加载EXE后,在左下角的命令窗口输入bp MessageBoxA,然后按F9执行程序,弹出消息框,但是没有被OllyDbg断下。请问各位大虾应该怎么下API断点,最好能详细。(PS:不要告诉我使用字符串参考和当前模块中的名称,谢谢!)
代码如下:

#include <windows.h>
#include <stdio.h>
typedef int (WINAPI *PMessageBox)(
HWND hWnd, // handle to owner window
LPCTSTR lpText, // text in message box
LPCTSTR lpCaption, // message box title
UINT uType // message box style
);

int main(int argc, char* argv[])
{
char szText[128] = "HelloWorld!";
char szCaption[10] = "Hi";
PMessageBox MsgBox = (PMessageBox)GetProcAddress(LoadLibrary("User32.dll"), "MessageBoxA");
if (MsgBox)
{
MsgBox(NULL, szText, szCaption, 0);
}
else
{
printf("MsgBox is NULL\n");
}
return 0;
}

...全文
440 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jamseyang 2011-08-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 c_losed 的回复:]

引用 11 楼 jamseyang 的回复:

引用 10 楼 jamseyang 的回复:

我又调试了下,在GetProcAddress下断点,获取MessageBoxA的地址是7791EA71,
然后在OllyDbg的命令窗口输入bpx 7791EA71回车,发现无法进入这个断点,求指点,谢谢。

把bpx 7791EA71换成bp 7791EA71可以进入断点了,请问这两个……
[/Quote]
谢谢,我知道区别了。

请问bpx 7791EA71不行,那么我怎么下断点才能在Call MessageBoxA的时候断下呢?
jamseyang 2011-08-30
  • 打赏
  • 举报
回复
关于OD调试,大家有什么好的方法可以指教下!
jamseyang 2011-08-30
  • 打赏
  • 举报
回复
谢谢大家,问题已解决。
说下我的方法:
1、先在GetProcAddress下断点,获取到MessageBoxA的地址,在User领空的MessageBoxA出下断点A
2、程序中所有调用MessageBoxA都会在断点A处中断
3、在OD右下角可以看到“CALL 到 MessageBoxA 来自 XXXX”这样的信息
4、记录下所有XXXX
5、重新开始调试,在所有XXXX的地址处下断点
c_losed 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jamseyang 的回复:]

引用 10 楼 jamseyang 的回复:

我又调试了下,在GetProcAddress下断点,获取MessageBoxA的地址是7791EA71,
然后在OllyDbg的命令窗口输入bpx 7791EA71回车,发现无法进入这个断点,求指点,谢谢。

把bpx 7791EA71换成bp 7791EA71可以进入断点了,请问这两个有什么区别呀?
[/Quote]
区别如下
jamseyang 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jamseyang 的回复:]

我又调试了下,在GetProcAddress下断点,获取MessageBoxA的地址是7791EA71,
然后在OllyDbg的命令窗口输入bpx 7791EA71回车,发现无法进入这个断点,求指点,谢谢。
[/Quote]
把bpx 7791EA71换成bp 7791EA71可以进入断点了,请问这两个有什么区别呀?
jamseyang 2011-08-29
  • 打赏
  • 举报
回复
我又调试了下,在GetProcAddress下断点,获取MessageBoxA的地址是7791EA71,
然后在OllyDbg的命令窗口输入bpx 7791EA71回车,发现无法进入这个断点,求指点,谢谢。
jamseyang 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 stjay 的回复:]

引用 5 楼 jamseyang 的回复:

引用 3 楼 stjay 的回复:

exe是控制台程序,并未引入User32.dll
是动态加载的
OllyDbg载入exe后,还没有User32.dll,所以bp MessageBoxA根本就找不到MessageBoxA的地址

谢谢你的回复,请问
1、如果是动态加载的应该怎么下断点
2、如果是MFC中成员函数MessageB……
[/Quote]
谢谢你的热心回复。
1、LoadLibraryW下断,直到相应的模块加载进来,再下API断点
我试试了下,发现不行,不知道你有试过没有?
stjay 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jamseyang 的回复:]

引用 3 楼 stjay 的回复:

exe是控制台程序,并未引入User32.dll
是动态加载的
OllyDbg载入exe后,还没有User32.dll,所以bp MessageBoxA根本就找不到MessageBoxA的地址

谢谢你的回复,请问
1、如果是动态加载的应该怎么下断点
2、如果是MFC中成员函数MessageBox怎么下断点
[/Quote]

1.一般是加壳才会这么干,或者使用低版本SDK编写造成(头文件没相应的API)
LoadLibraryW下断,直到相应的模块加载进来,再下API断点
2.MFC导出函数貌似只有编号,这个忘记怎找对应的函数名
stjay 2011-08-29
  • 打赏
  • 举报
回复
关于OllyDbg的一些技巧
可以去看雪论坛学习
vrace 2011-08-29
  • 打赏
  • 举报
回复
先在 LoadLibraryA 断下来,然后再断 MessageBoxA 试试呢
jamseyang 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 stjay 的回复:]

exe是控制台程序,并未引入User32.dll
是动态加载的
OllyDbg载入exe后,还没有User32.dll,所以bp MessageBoxA根本就找不到MessageBoxA的地址
[/Quote]
谢谢你的回复,请问
1、如果是动态加载的应该怎么下断点
2、如果是MFC中成员函数MessageBox怎么下断点
c_losed 2011-08-29
  • 打赏
  • 举报
回复
这个下MessageBoxW好像也不行吧
看lz的做法 等于动态获取MessageBoxA的地址 然后自己重新改变下名字
所以下断点无效...
断点只能下LoadLibrary或GetProcAddress
stjay 2011-08-29
  • 打赏
  • 举报
回复
exe是控制台程序,并未引入User32.dll
是动态加载的
OllyDbg载入exe后,还没有User32.dll,所以bp MessageBoxA根本就找不到MessageBoxA的地址
jamseyang 2011-08-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]

用的是MessageBoxW呢?
[/Quote]
谢谢你的回复,是MessageBoxA。
ouyh12345 2011-08-29
  • 打赏
  • 举报
回复
用的是MessageBoxW呢?

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧