首页
社区
课程
招聘
[求助]如何自己写个程序,给某个EXE下断点,
发表于: 2008-12-13 13:47 6544

[求助]如何自己写个程序,给某个EXE下断点,

2008-12-13 13:47
6544
如何自己用C写个程序,给某个EXE下断点,
1.如何下断点,是指令 int 3 (CC) 吗?
2.如何知道程序运行到了断点处?程序处理后还要恢复,继续运行下去的。

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

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
123456
2008-12-13 13:57
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
将要中断地方的指令修改成int 3.并且将原来的机器吗保存起来。
当程序运行到int 3时,自动中断下来。
OD就是这么工作的。
2008-12-13 20:51
0
雪    币: 193
活跃值: (26)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
4
前提是你自己的程序需要使用一套的调试指令 让程序中断到调试环境里
不然 直接写CC 程序会死掉
2008-12-13 20:54
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
5
用带有DEBUG_PROCESS标志的参数去调用CreateProcess,新创建的进程就以你的进程为调试器。在发生异常时,操作系统会首先通知调试器,调试器可以选择处理异常,或交给子进程自行处理,如果子进程的SEH链没有找到异常处理函数,则调试器会再得到一个通知。

这便是Win32调试器的基本原理,OD也是一样。

下断点的一般方法就是用0XCC替换原来的指令,当程序执行这条指令时便会引发一个“调试断点异常”,调试器便得到处理异常的控制权。进行完必要的操作,要让程序继续执行,就把原来的指令字节写回,然后ContinueDebugEvent即可。
2008-12-13 21:26
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
网上找到一段程序

        DEBUG_EVENT   DBEvent;
        STARTUPINFO   sif={0};
        sif.cb=sizeof(sif);
        PROCESS_INFORMATION   pi={0};
       
        BOOL   STOP=0;

        CreateProcess(NULL, _T("notepad.exe"),NULL,NULL,NULL,
                DEBUG_PROCESS|DEBUG_ONLY_THIS_PROCESS,NULL,NULL,&sif,&pi);
        do{
                WaitForDebugEvent(&DBEvent,INFINITE);
                DWORD   dwState=DBG_EXCEPTION_NOT_HANDLED;
        switch(DBEvent.dwDebugEventCode)
        {
                case   EXCEPTION_DEBUG_EVENT:
                        {
                                switch(DBEvent.u.Exception.ExceptionRecord.ExceptionCode)
                                {
                                case     EXCEPTION_BREAKPOINT:
                                        {
//是不是在这里处理?
                                                dwState=DBG_CONTINUE;
                                                break;
                                        }
                                }                 
                                break;
                        }
                case   EXIT_PROCESS_DEBUG_EVENT:
                        {   
                                STOP=TRUE;
                                break;
                        }
        }                  
                if(!STOP)
                {ContinueDebugEvent(pi.dwProcessId,pi.dwThreadId,dwState);}
        }while(!STOP);
2008-12-14 13:01
0
雪    币: 304
活跃值: (82)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
7
看下一块三毛钱的那篇精华。
2008-12-15 08:43
0
雪    币: 211
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
如果是下一个条件断点如何去做呢?

例如我在CreateFile 函数上下一个断点,也就是说原理上将函数入口的机器码改成int 3,这个动作可以在程序加载完后实现,但断点事件发生后,我根据参数判断是否满足我的断点条件,满足当然好办,将int 3恢复成保存的机器码,但如何不满足,继续运行那么恢复后的机器码什么时候再修改成 int 3呢?
2008-12-15 12:56
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
if语句可以
2008-12-15 12:58
0
雪    币: 164
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
网上有很多Loader模板,仔细研究看看就明白了
2008-12-16 18:51
0
雪    币: 204
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
强,学习一下~~
2008-12-16 19:31
0
游客
登录 | 注册 方可回帖
返回
//