首页
社区
课程
招聘
[求助]intel的参考手册也看过了,可是设置的硬件断点就是不生效?
发表于: 2005-11-7 15:18 7099

[求助]intel的参考手册也看过了,可是设置的硬件断点就是不生效?

2005-11-7 15:18
7099
我在写一个小型的调试器,不过不是做调试用,是想做内存布丁。但是我设置的硬件执行断点从来就没有被断下来过。
intel的参考手册和John Robbins的Debug Application上的资料我都对照过了,也没有发现什么问题。
下面是部分代码,delphi写的,请各位大侠指正:
    if DebugActiveProcess(Debuggee.dwProcessId) then
        begin
        while WaitForDebugEvent(DebugEvent,INFINITE) do
            begin
            case DebugEvent.dwDebugEventCode of
                CREATE_PROCESS_DEBUG_EVENT :  
                    begin                     
                    ThreadContext.ContextFlags := CONTEXT_CONTROL;         
                    GetThreadContext(DebugEvent.CreateProcessInfo.hThread,ThreadContext);

                    ThreadContext.Dr0 := SomeDebugPoint1;
                    ThreadContext.Dr1 := SomeDebugPoint2;
                    ThreadContext.Dr6 := 0;
                    ThreadContext.Dr7 := $105;  //$105 : 100000101,LE=1, L1=1, L0=1
                    ThreadContext.ContextFlags := CONTEXT_CONTROL;
                    if not SetThreadContext(DebugEvent.CreateProcessInfo.hThread,ThreadContext) then
                        begin
                        ShowMessage('SetThreadContext failed!');
                        end;
                    mDebugContinue := DBG_CONTINUE;
                    end;
                EXCEPTION_DEBUG_EVENT :
                    begin
                    case DebugEvent.Exception.ExceptionRecord.ExceptionCode of
                        STATUS_SINGLE_STEP :
                            begin
                            //do something in here       
                            end;       
                        else
                            //do something else in here
                        end;
                    end;
                end;
            end;
        end;

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

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
自己顶一下,希望那些在论坛精华里写过DRx寄存器的使用的大侠出手啊!
2005-11-7 16:28
0
雪    币: 270
活跃值: (176)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
3
加密解密内幕里面有个例子代码,改改就能用
2005-11-7 18:02
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
多谢,先去看看
2005-11-7 18:22
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
最初由 ikki 发布
加密解密内幕里面有个例子代码,改改就能用


请问是第3章的那个例子吗?

我现在的问题和那个不太一样啊,那个问题是说CreateProcess时直接设置调试标志,但那个时候进程的主线程还没有运行过,所以TEB没有建立的情况,需要通过NtContinue做跳板。
我现在是CreateProcess并且运行起来以后DebugActiveProcess,应该没有这个问题的啊。
2005-11-7 19:24
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
6
DebugActiveProcess还能收到CREATE_PROCESS_DEBUG_EVENT吗?
2005-11-7 21:32
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
最初由 ForEver 发布
DebugActiveProcess还能收到CREATE_PROCESS_DEBUG_EVENT吗?

可以的,包括CRATE_THREAD_EVENT都可以收到。这个我已经测试过了,而且我的程序在SetThreadContext成功后,然后再GetThreadContext对比,DrX的值也是正确的。所以我就很苦恼不知道是什么地方出错了,我已经调试了2天了
2005-11-7 21:46
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
自己再顶顶,希望大侠们出手啊
2005-11-8 10:27
0
雪    币: 243
活跃值: (205)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
9
我在REATE_PROCESS_DEBUG_EVENT处下断挺好用啊。

program Loader;

uses
  JwaWinType,
  JwaWinNt,
  JwaWinBase,
  JwaWinUser;

{$R *.res}

const
  VictimName = 'test.exe';
  MemPos: DWORD = $44e3ee;
  RegFlag: DWORD = 0;

var
  si: STARTUPINFO;
  pi: PROCESS_INFORMATION;

function SimpleExtractFilePath(f: String): String;
var
  i: integer;
begin
  for i := Length(f) downto 1 do
    if f[i] = '\' then Break;
  result := copy(f, 0, i);
end;

procedure CreateVictimProcess(Path: String);
var
  DbgEvent: TDebugEvent;
  DbgParam: DWORD;
  DbgContext: TContext;
begin   
  ZeroMemory(@si, SizeOf(STARTUPINFO));
  si.cb := SizeOf(STARTUPINFO);
  if not CreateProcess(PChar(Path), nil, nil, nil, False, CREATE_DEFAULT_ERROR_MODE, nil,
                       PChar(SimpleExtractFilePath(Path)), si, pi) then
  begin
    MessageBox(0, 'CreateProcess failed! ', 'Error!', 0);
    exit;
  end;
  if WaitForInputIdle(pi.hProcess, INFINITE) <> 0 then
  begin
    MessageBox(0, 'WaitForInputIdle failed! ', 'Error!', 0);
    exit;
  end;
  if not DebugActiveProcess(pi.dwProcessId) then
  begin
    MessageBox(0, 'DebugActiveProcess failed! ', 'Error!', 0);
    exit;
  end;            
  DbgContext.ContextFlags := CONTEXT_ALL;
  while WaitForDebugEvent(DbgEvent, INFINITE) do
  begin
    DbgParam := DBG_CONTINUE;
    case DbgEvent.dwDebugEventCode of
      CREATE_PROCESS_DEBUG_EVENT:
      (*
        对DebugActiveProcess附加debugee的情况,必须在CREATE_PROCESS_DEBUG_EVENT中,
        不可在第一个EXCEPTION_BREAKPOINT处设置硬件断点。这是试验出的结论,不知道为什么。
        没有试验deguber挂起debugee后设硬件断点情况。
       *)
      begin
        GetThreadContext(pi.hThread, DbgContext);
        DbgContext.Dr0 := MemPos;
        DbgContext.Dr7 := $101; //Dr7 flag:对dr0指向地址设运行中断
        SetThreadContext(pi.hThread, DbgContext);
      end;
      EXCEPTION_DEBUG_EVENT:
      begin
        case DbgEvent.Exception.ExceptionRecord.ExceptionCode of
          EXCEPTION_ACCESS_VIOLATION:
          begin
            DbgParam := DBG_EXCEPTION_NOT_HANDLED;
          end;
          EXCEPTION_SINGLE_STEP:
          begin
            begin
              GetThreadContext(pi.hThread, DbgContext);
              if DbgContext.Dr6 and 1 = 1 then
              begin  //触发了dr0断点
                MessageBox(0, 'Get it!', 'HWBP!', 0);
                GetThreadContext(pi.hThread, DbgContext);
                DbgContext.Dr0 := 0;  //取消硬件断点
                DbgContext.Dr7 := 0;
                SetThreadContext(pi.hThread, DbgContext);
              end
              else
                DbgParam := DBG_EXCEPTION_NOT_HANDLED;
            end;
          end;
        end;
      end;
      EXIT_PROCESS_DEBUG_EVENT:
      begin  //收工
        ContinueDebugEvent(DbgEvent.dwProcessId, DbgEvent.dwThreadId, DbgParam);
        Break;
      end;
    end;
    ContinueDebugEvent(DbgEvent.dwProcessId, DbgEvent.dwThreadId, DbgParam);
  end;
end;

var
  Victim: string;
begin
  Victim := SimpleExtractFilePath(ParamStr(0)) + VictimName;
  CreateVictimProcess(Victim);
  halt;
end.
2005-11-8 11:00
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
TO: ttui,
我已经在你发的贴里跟贴,麻烦再帮我看看了。谢了!
还有就是上次你用内存断点的那个我也没有写成功,汗啊!不过那次我是用朋友的帐号回贴的(就是那个demit...),下来我就想改为做硬件断点的,但还是不顺利,头痛啊!
2005-11-8 13:27
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
11
改变线程上下文后试试刷新一下指令缓存
2005-11-8 13:34
0
雪    币: 153
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
错误:
ThreadContext.ContextFlags := CONTEXT_CONTROL;     ???
要这样。
ThreadContext.ContextFlags := CONTEXT_DEBUG_REGISTERS;
2005-11-8 14:23
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
最初由 verybigbug 发布
错误:
ThreadContext.ContextFlags := CONTEXT_CONTROL; ???
要这样。
ThreadContext.ContextFlags := CONTEXT_DEBUG_REGISTERS;


OK,断到了。
是CONTEXT_DEBUG_REGISTERS,另外不要和CONTEXT_FULL一起用!
真象你的名字啊,我这是一个VeryBigBug
多谢!
2005-11-8 16:51
0
雪    币: 343
活跃值: (611)
能力值: ( LV9,RANK:810 )
在线值:
发帖
回帖
粉丝
14
又学一招
2005-11-8 19:10
0
游客
登录 | 注册 方可回帖
返回
//