首页
社区
课程
招聘
[求助]请开发调试器的高手,帮看一下
发表于: 2010-8-4 17:16 5188

[求助]请开发调试器的高手,帮看一下

2010-8-4 17:16
5188

在开发调试器中实现软断.

一个 0xcc
一个WaitForDebugEvent函数 即可

但要实现硬断  我又为此从脑子里“减肥”减了数十斤
请高手看一下,解一下谢谢

代码运行后..原int3可中断, 硬断不下.
代码从

unsigned char cOldByte;
unsigned char dwINT3code=0XCC;

ReadProcessMemory(hProcess,(LPVOID)0x77c1741e,&cOldByte,1,NULL);
WriteProcessMemory(hProcess, (LPVOID)0x77c1741e,&dwINT3code, 1,NULL);	

...............

while(WaitForDebugEvent(&stDe,INFINITE))
{...........

case EXCEPTION_DEBUG_EVENT:

 stThreadContext.ContextFlags = CONTEXT_CONTROL;
GetThreadContext(hThread,&stThreadContext);
hThread= SOpenThread(THREAD_ALL_ACCESS, TRUE, stDe.dwThreadId);
SuspendThread(hThread);

    
stThreadContext.Dr7 = stThreadContext.Dr7 | 0X301 ; //ONEDR0EVALUE
stThreadContext.Dr0 = 0x77c1741e;

SetThreadContext(hThread,&stThreadContext);//漏悼的

break;


补充:
我曾看过5个开源的小调试器;查过MSDN.但始终不明白怎么实现硬断 .
我觉得:
1,通过获取调试线程--2,挂起调试线程(为了安全)--3,设置调试线程Dr0~Dr3值地址---4,恢复调试线程

我的不明点:
1,怎么编写设置Dr0~Dr3的中断地址,数值类型(1,BYTE  2,DWORD 3,...),断点类型(1,内存读,2,内存写,3,exec) ??

恳求高手看一眼.打一字.

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 291
活跃值: (169)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
论坛上发的调试器代码,大多不行.我看一眼就丢了.其实调试部分很简单,就是:

设置调试线程Dr0~Dr3值地址,不过要初始化一下调试回调函数

AddVectoredExceptionHandler
RemoveVectoredExceptionHandler

你查查这两个函数的用法就知道了.
2010-8-4 18:50
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
高手就是不一样.
在哪些源码当中都没有调用过这两个函数。。大概他们科锐教的都是调用相同接口,原理构造..实现构造..

////////////我在网上查到的一些调用资料---也不知是不是这样调用---看来有空一定要好好看一下 ReactOS源码,我总是看不 懂一些牛人的发的代码。或思路..
        pPreRenderContinueAddress=reinterpret_cast<void*>(reinterpret_cast<ptrdiff_t>(pPreRender)+3);

        pHandler=AddVectoredExceptionHandler(0x1337,MyUnhandlerExceptionFilter);
               
        CONTEXT Context;
        Context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
        GetThreadContext(GetCurrentThread(), &Context);
        Context.Dr0=reinterpret_cast<DWORD>(pTick);
        Context.Dr1=reinterpret_cast<DWORD>(pKeyEvent);
        Context.Dr2=reinterpret_cast<DWORD>(pPostRender);
        Context.Dr3=reinterpret_cast<DWORD>(pPreRender);
        Context.Dr7=(1<<0)|(1<<2)|(1<<4)|(1<<6);   
        SetThreadContext(GetCurrentThread(), &Context);

////////////////
        CONTEXT Context;
        Context.ContextFlags =CONTEXT_DEBUG_REGISTERS;
        GetThreadContext(GetCurrentThread(), &Context);
        Context.Dr0=0;
        Context.Dr1=0;
        Context.Dr2=0;
        Context.Dr3=0;
        Context.Dr7=0;   
        SetThreadContext(GetCurrentThread(), &Context);

RemoveVectoredExceptionHandler(pHandler);
}
2010-8-4 20:41
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
还是不明白两楼所说函数的用法

AddVectoredExceptionHandler
RemoveVectoredExceptionHandler
2010-8-5 16:56
0
雪    币: 517
活跃值: (64)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
看一下这篇文章

http://bbs.pediy.com/showthread.php?t=107515
2010-8-5 22:24
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我搞好了。谢谢咯..之前我--因为这个写不好,所以无法中断
现贴出成功代码:
   总体我是看书搞好的,思路引用----《软件加密内幕》:内存补丁一文:

////

int DR0E=1;   //中断长度
int LEBPME=256;//断点类型

GetThreadContext(hThread,&Regs);
Regs.Dr0=0x77ba82b2;                                                                        
Regs.Dr7=LEBPME + DR0E; //这里特别需要注意------
SetThreadContext(hThread,&Regs);

///////
2010-8-6 00:04
0
游客
登录 | 注册 方可回帖
返回
//