首页
社区
课程
招聘
一个关于DEBUG API的问题
发表于: 2006-12-2 20:45 5444

一个关于DEBUG API的问题

2006-12-2 20:45
5444
//用下面的代码来创建被调试程序,目标文件命名为a.exe

int main(int argc, char* argv[])
{
        __asm
        {
                PUSHAD        ;
                INT 3        ;
                PUSHAD        ;
        }
        return 0;
}

//下面的代码来创建调试程序

#include "stdio.h"
#include "windows.h"

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
       
        char szCommandLine[] = "a";
        STARTUPINFO si = { sizeof(si) };
        PROCESS_INFORMATION pi;
        si.dwFlags = STARTF_USESHOWWINDOW;
        si.wShowWindow = TRUE;               
                                       
        BOOL breturn= ::CreateProcess (
                NULL,               
                szCommandLine,               
                NULL,               
                NULL,                       
                FALSE,                       
                DEBUG_ONLY_THIS_PROCESS||CREATE_NEW_CONSOLE,       
                NULL,                       
                NULL,                       
                &si,
                &pi);
        if(!breturn)
        {
                ::MessageBox(NULL,"CREATE ERROR","",0);
                ::ExitProcess(-1);
        }
        DEBUG_EVENT DE;
        int i=0;
        do
        {
           ::WaitForDebugEvent(&DE,INFINITE);
           switch(DE.dwDebugEventCode)
           {
              case EXCEPTION_DEBUG_EVENT:
                       
                switch(DE.u.Exception.ExceptionRecord.ExceptionCode)
                                {
                                case EXCEPTION_BREAKPOINT:
                                               i++;
                                             if(i==2)
                                                   ::MessageBox(NULL,"EXCEPTION","",0);
                                             break;
                                }
                     break;
              case EXIT_PROCESS_DEBUG_EVENT:
                  ::MessageBox(NULL,"EXIT","",0);
                  ::ExitProcess(-1);
              case CREATE_PROCESS_DEBUG_EVENT:
                  ::MessageBox(NULL,"CREATED","",0);
                  break;
           }

       ::ContinueDebugEvent(
                     pi.dwProcessId,
                     pi.dwThreadId,
                     DBG_EXCEPTION_NOT_HANDLED);
        }
        while(1);
               
        return 0;
}

可是不知为什么总是会出现下面的提示


再就是我CreateProcess创建的进程为什么总是不显示控制台
路过的朋友帮我看看,先谢了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
2
版主帮我把帖子移到调试版块去吧,在这里我等的好累
2006-12-2 21:19
0
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
3
0x80000003异常应该是你a.exe中的int3引起的,而你的a.exe没有对异常进行处理,所以就弹那个异常对话框了
2006-12-2 23:09
0
雪    币: 331
活跃值: (56)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
4
应该是你没处理system break
你自己的Int3只能引起非法操作
2006-12-2 23:17
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
5
最初由 Isaiah 发布
应该是你没处理system break
你自己的Int3只能引起非法操作

如果我把被调试的程序找换成CMD.EXE照样还是弹出像那样的对话框,
那是么回事呢,
2006-12-2 23:53
0
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
ContinueDebugEvent(
                     pi.dwProcessId,
                     pi.dwThreadId,
                     DBG_EXCEPTION_NOT_HANDLED);

这不是9X/ME,NT下面返回DBG_EXCEPTION_NOT_HANDLED将导致OS的DEFAULT EXCEPTION HANDLER给你的程序下最后通牒(仍然有一次机会处理错误)
2006-12-3 00:32
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
7
那要怎么办,不管我想去调试什么程序都弹出那么个郁闷的对话框来,我是按照软件加密技术内幕上的来的,
我根本没有去处理被调试对象产生的异常,异常都让它们自已的异常处程序去处理了,我感觉好像是我的CreateProcess函数用错了,还是怎么回事,
2006-12-3 00:45
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
8
看来高人都深夜活动

  1.CREATE_PROCESS_DEBUG_EVENT:进程被创建.当被调试进程刚被创建(还未运行) 或我们的程

序刚以DebugActiveProcess捆绑到一个运行中的进程时该事件发生. 这是我们的程序应该获得

的第一个事件.

这个就是SYSTEM BREAK,系统断点,即使用调试器时会看到的ntdll!DbgBreakPoint

猜的,不过你可以试试增加一个例程处理CREATE_PROCESS_DEBUG_EVENT,看你的MESSAGEBOX先出来还是它的错误框先出来
2006-12-3 01:00
0
雪    币: 222
活跃值: (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
最初由 llydd 发布
那要怎么办,不管我想去调试什么程序都弹出那么个郁闷的对话框来,我是按照软件加密技术内幕上的来的,
我根本没有去处理被调试对象产生的异常,异常都让它们自已的异常处程序去处理了,我感觉好像是我的CreateProcess函数用错了,还是怎么回事,


被调试的程序处理不了系统断点的,出这个断点的时候程序还未完成加载,所以你不能那样调用ContinueDebugEvent
2006-12-3 09:59
0
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
10
前面回答错了。。。应该是这样的

当你以debug模式创建进程时系统会自动加入一个int3在入口点,因此你的程序要继续往下运行要判断出这个int3,即第1个int3应该让它
ContinueDebugEvent(pi.dwProcessId, pi.dwThreadId, DBG_CONTINUE)
2006-12-3 10:33
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
11
最初由 xIkUg 发布
前面回答错了。。。应该是这样的

当你以debug模式创建进程时系统会自动加入一个int3在入口点,因此你的程序要继续往下运行要判断出这个int3,即第1个int3应该让它
ContinueDebugEvent(pi.dwProcessId, pi.dwThreadId, DBG_CONTINUE)


谢谢xIkUg,果真如你所说,必须将第一个int3忽略,我在怀疑我的书是不是看PP里去了,
2006-12-3 13:17
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
12
再就是我CreateProcess创建的进程为什么总是不显示控制台
路过的朋友帮我看看,先谢了

STARTUPINFO si = { sizeof(si) };
除了cbsize的其他字段需要memset 0
2006-12-6 18:29
0
雪    币: 101
活跃值: (12)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
13
不好意思, 看错了。 上面的回答作废。
2006-12-6 18:33
0
游客
登录 | 注册 方可回帖
返回
//