进来想用int 3对dll进行一下断点调试,dllmain如下:
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox(0, "null", "null", MB_OK);
__asm int 3
CreateThread(NULL,255,(LPTHREAD_START_ROUTINE)setupCallBack,NULL,NULL,NULL);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
发现问题:
执行程序(不是调试)此dll加载时:成功进入DLL_PROCESS_ATTACH,但是没有在执行__asm int 3时报错,而是直接跑飞。。到了未定义内存区域(开始怀疑是dll没有加载上,使用360管理工具检测,发现进程此DLL显示已加载)。
使用OD调试时:发现程序可以正常运行(没有跑飞),然后检测执行时跑飞的区域,发现这里实际是dll模块领空,而且是有意义代码请牛人指点迷津!不胜感激!
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
MessageBox(0, "null", "null", MB_OK);
__asm int 3
CreateThread(NULL,255,(LPTHREAD_START_ROUTINE)setupCallBack,NULL,NULL,NULL);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
发现问题:
执行程序(不是调试)此dll加载时:成功进入DLL_PROCESS_ATTACH,但是没有在执行__asm int 3时报错,而是直接跑飞。。到了未定义内存区域(开始怀疑是dll没有加载上,使用360管理工具检测,发现进程此DLL显示已加载)。
使用OD调试时:发现程序可以正常运行(没有跑飞),然后检测执行时跑飞的区域,发现这里实际是dll模块领空,而且是有意义代码请牛人指点迷津!不胜感激!
1.
case DLL_PROCESS_ATTACH:
MessageBox(0, "null", "null", MB_OK);
这个消息框正常弹出,点击OK后直接报错
2.
程序报错后,使用winhex直接检测进程内存空间,搜索DLL代码内容,但是查找不到,也就是dll的内容没有进入内存
用int3中断的时候,应该用一个进程加载这个进程,设置调试寄存器,才能控制住调试。否则有没有提示框出现都是中断不了。
这么长时间过去了,忘记了这个帖子,各位真是抱歉!
这里我考虑了下,由于我的这个DLL文件是加载到别人的exe中,当然如果是系统对int3进行的默认处理,即弹出报错框,这时肯定是正常的,不过假如exe在这里自己设置了异常处理的话,应该这个int3会被exe捕获(这里我不能确定,有空一定会好好看看SEH和int?机制,然后回复上来),也许会被忽略,只是下面的代码无法继续运行了,此时估计会产生内存泄露了,现象就是显示dll加载成功(获取一个exe中加载的所有dll的代码还没有关注,这里也就说不出啥了,有空看完,同时回复上来),而实际却没有成功
如下:
1: #include <stdio.h>
2: #include <afx.h>
3: //
4: void main()
5: {
00401010 55 push ebp
00401011 8B EC mov ebp,esp
00401013 6A FF push 0FFh //push -1这里重点
00401015 68 30 C7 41 00 push offset __ehhandler$_main (0041c730)
0040101A 64 A1 00 00 00 00 mov eax,fs:[00000000]
几乎每个有SEH应用的部分都有对ebp-4的使用,这个局部变量的意义实际上是记录try的层级的作用,也就决定了这个异常是否会被catch捕获。