进来想用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模块领空,而且是有意义代码请牛人指点迷津!不胜感激!

解决方案 »

  1.   

    还有一点补充:
    1.
    case DLL_PROCESS_ATTACH:
    MessageBox(0, "null", "null", MB_OK);
    这个消息框正常弹出,点击OK后直接报错
    2.
    程序报错后,使用winhex直接检测进程内存空间,搜索DLL代码内容,但是查找不到,也就是dll的内容没有进入内存
      

  2.   

    首先int 3指令会引发一个异常。当没有调试器时,由于没有捕获这个异常,所以会跑飞。当有调试器时,调试器会捕获异常处理链上未处理的异常,所以会断在这个位置等待调试者的下一步操作。
      

  3.   

    补充一点是,在调试器对代码下断点,就是利用int 3指令中断断点的位置
      

  4.   

    平时的int3一般都是会使执行的程序产生一个异常,然后提示框出现,但是现在的问题是程序跑飞了
      

  5.   

    不要在 DllMain 中实现 MessageBox,创建线程等操作,这样会导致很多问题的。
      

  6.   


    用int3中断的时候,应该用一个进程加载这个进程,设置调试寄存器,才能控制住调试。否则有没有提示框出现都是中断不了。
      

  7.   

    首先多谢楼上
    这么长时间过去了,忘记了这个帖子,各位真是抱歉!
    这里我考虑了下,由于我的这个DLL文件是加载到别人的exe中,当然如果是系统对int3进行的默认处理,即弹出报错框,这时肯定是正常的,不过假如exe在这里自己设置了异常处理的话,应该这个int3会被exe捕获(这里我不能确定,有空一定会好好看看SEH和int?机制,然后回复上来),也许会被忽略,只是下面的代码无法继续运行了,此时估计会产生内存泄露了,现象就是显示dll加载成功(获取一个exe中加载的所有dll的代码还没有关注,这里也就说不出啥了,有空看完,同时回复上来),而实际却没有成功
      

  8.   

    哈哈,今天晕晕乎乎的。。倒也是有个收获
    如下:
    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捕获。
      

  9.   

    对于dll的载入和dllmain中的int 3没有报错。。哎。。没想到只是对于dllmain的某个上层间接调用者使用了异常处理而已