首页
社区
课程
招聘
[己解决]编程处理硬件断点
发表于: 2008-3-21 16:49 5360

[己解决]编程处理硬件断点

2008-3-21 16:49
5360
偶在学下硬件断点.现在遇到个问题.请指点...

附加到进程后.设置硬件断点.能正常接收断点.但是会接收到线程的

EXCEPTION_ACCESS_VIOLATION异常.

请问.如何不接收该异常或屏蔽该异常.

谢谢....

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这么巧啊,我也遇到硬件断点的问题,遇到异常的时候ContinueDebugEvent 用DBG_EXCEPTION_NOT_HANDLED 应该就可以了。

我是新兵,发不了贴,借你的地方用下,楼主别怪阿,呵呵。
我的问题是硬件断点有效了,但是只要程序一经过硬件端点,马上断个不停,不只断了一次。
代码如下
#include "stdafx.h"
#include <windows.h>
#include <Tlhelp32.h>
#include <stdio.h>
#include <iostream>

#define PRO_TEST_ADDR  0x44D944
#define PRO_DR0_DATA   0x401

int _tmain(int argc, _TCHAR* argv[])
{
        HWND   hProWnd;
        DWORD  dwProID;
        HANDLE hProHandle;
        HANDLE hThreadHandle;
        DWORD  dwTheadID;

        hProWnd = FindWindow(NULL,"Form1");
        if (!hProWnd ){
                printf("查找窗体句柄失败\n");
                return 0;
        }

        dwTheadID  =  GetWindowThreadProcessId(hProWnd, &dwProID);
        if (!dwTheadID){
                printf("获取进程ID失败\n");
                return 0;
        }
        hThreadHandle   =  OpenThread( THREAD_ALL_ACCESS, FALSE, dwTheadID );
        if(!hThreadHandle){
                printf("获取线程句柄失败\n");
                return 0;
        }

        hProHandle  =  OpenProcess(PROCESS_ALL_ACCESS, FALSE , dwProID );
        if (!hProHandle){
                printf("打开进程句柄失败\n");
                return 0;
        }

        if (!DebugActiveProcess(dwProID)){
                printf("附加调试失败\n");
                return 0;
        }

        DEBUG_EVENT DebugEv;
        DWORD dwContinueStatus;
        while (TRUE){
                if (WaitForDebugEvent(&DebugEv , INFINITE)){
                        dwContinueStatus = DBG_EXCEPTION_NOT_HANDLED;
                        switch(DebugEv.dwDebugEventCode){

                                case EXCEPTION_DEBUG_EVENT:
                                {
                                        switch( DebugEv.u.Exception.ExceptionRecord.ExceptionCode){

                                                case EXCEPTION_SINGLE_STEP:
                                                {

                                                        dwContinueStatus = DBG_CONTINUE;
                                                        printf(" 硬件端点\n");
                                                        break;
                                                }
                                        }                       
                                       
                                        break;
                                }
                                case EXIT_PROCESS_DEBUG_EVENT:
                                        {
                                                return 0;
                                                break;
                                        }
                                case CREATE_PROCESS_DEBUG_EVENT:
                                {

                                        SuspendThread(hThreadHandle);

                                        CONTEXT Regs = {0};
                                        Regs.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS;
                                        GetThreadContext(hThreadHandle, &Regs);
                                        Regs.Dr0 = PRO_TEST_ADDR ;
                                        Regs.Dr7 =  PRO_DR0_DATA  ;
                                        SetThreadContext ( hThreadHandle ,&Regs );
                                       
                                       
                                        ResumeThread(hThreadHandle);
                                        break;
                                }

                        }
                        ContinueDebugEvent(DebugEv.dwProcessId, DebugEv.dwThreadId, dwContinueStatus);
                }
               
        }

        return 0;
}
2008-3-21 17:38
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我也用过这个.DBG_EXCEPTION_NOT_HANDLED 但一直不停的出来.

到后来都卡在这里了.
2008-3-21 17:47
0
雪    币: 451
活跃值: (78)
能力值: ( LV12,RANK:470 )
在线值:
发帖
回帖
粉丝
4
你在论坛搜索下DebugActiveProcess

貌似某个帖子里面说了CONTEXT_DEBUG_REGISTERS的问题
2008-3-21 18:10
0
雪    币: 19
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
找到原因了.

EXCEPTION_ACCESS_VIOLATION异常时.

查看u.Exception.ExceptionRecord.ExceptionAddress看是哪个地址读写访问出错.

用OD看出错地址就知道是哪个函数了.

谢谢各位.
2008-3-21 19:17
0
游客
登录 | 注册 方可回帖
返回
//