吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5468|回复: 17
收起左侧

[其他转载] 实现Win10下Delphi 10.3.1 inline hook 调试器法获取寄存器并修改

[复制链接]
bester 发表于 2019-9-6 22:29
本帖最后由 bester 于 2019-9-6 22:34 编辑

代码2分钟,Bug 5小时
用OD在MessageBoxA查看,获得的ESP+8的值为0019F448
QQ截图20190906220922.jpg

使用自写调试器获取到的值:
2.jpg
Delphi 源码:
[Delphi] 纯文本查看 复制代码
  if EXCEPTION_DEBUG_EVENT=de.dwDebugEventCode then    //判断是否为异常事件
   begin
    CopyMemory(Pointer(@excinfo),Pointer(@de.Exception),SizeOf(EXCEPTION_DEBUG_INFO));  //将调试结构中的异常结构复制出来
    if EXCEPTION_BREAKPOINT=excinfo.ExceptionRecord.ExceptionCode  then     //异常代码是否为断点异常
    begin
      if apiaddr=excinfo.ExceptionRecord.ExceptionAddress then                    //异常位置是否为api地址处       apiaddr=excinfo.ExceptionAddress
      begin
       WriteProcessMemory(deinfo.hProcess,apiaddr,pointer(@yuan),1,wd);  //将CC断点恢复成原来的字节 unhook
          //1、CONTEXT_DEBUG_REGISTERS,查询调式寄存器    {DR0-DR3(4个硬件断点所用) Dr6-Dr7}
          //
          //2、CONTEXT_FLOATING_POINT,查询浮点寄存器   { 387 state }
          //
          //3、CONTEXT_SEGMENTS,查询段寄存器       { DS, ES, FS, GS }
          //
          //4、CONTEXT_INTEGER,查询通用数据寄存器  { AX, BX, CX, DX, SI, DI }
          //
          //5、CONTEXT_CONTROL,查询控制寄存器组     { SS:SP, CS:IP, FLAGS, BP }
          //
          //6、CONTEXT_EXTENDED_REGISTERS,扩展寄存器组
          //
          //7、CONTEXT_FULL,CONTEXT_CONTROL+CONTEXT_SEGMENTS+ CONTEXT_SEGMENTS 三者合一
       GetThreadContext(deinfo.hThread,ctx);         //获得线程的上下文
       ShowMessage('当前寄存器Esp的值:'+IntToHex(ctx.Esp+8));   //这里可以对寄存器进行操作 可以读写等等
       ctx.Eip:=Integer(apiaddr)-1;//ctx.Eip-1;    //因为断在CC处,此时EIP会在当前CC处的地址+1的位置,故需要减一,否则一开始被CC覆盖的那个字节就不会被执行,会报错的
       SetThreadContext(deinfo.hThread,ctx); //设置线程的上下文
       ContinueDebugEvent(de.dwProcessId,de.dwThreadId,DBG_CONTINUE) ;   //继续等待是否有调试事件的产生
       Sleep(0);     //每个线程有20毫秒的时间片运行,用完则切换其他线程,当运行完时,在context结构中取出保存的第一个线程执行结束时的状态,继续执行
       //调用Sleep函数,可以释放当前线程的剩余时间片,即放弃当前线程执行的CPU时间片,也就是说,调用Sleep(0)函数后,CPU会立即执行其他线程
       //否则可能引发当调试器写入CC时与被调试程序同时调用api导致内存访问异常.

       //如果有需要继续hook,则在这里用WriteProcessMemory继续改CC
      end;
    end;
   end

免费评分

参与人数 4吾爱币 +8 热心值 +4 收起 理由
nshark + 1 + 1 佩服
CCStation + 2 + 1 求一份源码 573510720@qq.com 谢谢
冥界3大法王 + 2 + 1 我靠,这么好的东西怎么能错过多加分~~
苏紫方璇 + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

冥界3大法王 发表于 2019-12-5 07:22
本帖最后由 冥界3大法王 于 2019-12-5 07:24 编辑

@bester
亲爱的楼楼,这个怎么玩耍?
Checking project dependencies...
Compiling Project2.dproj (Debug, Win32)
[dcc32 Error] Unit1.pas(29): E2003 Undeclared identifier: 'de'
[dcc32 Warning] Unit1.pas(29): W1023 Comparing signed and unsigned types - widened both operands
[dcc32 Error] Unit1.pas(29): E2029 'THEN' expected but identifier 'dwDebugEventCode' found
[dcc32 Error] Unit1.pas(31): E2003 Undeclared identifier: 'excinfo'
[dcc32 Error] Unit1.pas(31): E2029 ')' expected but identifier 'Exception' found
[dcc32 Error] Unit1.pas(32): E2066 Missing operator or semicolon
[dcc32 Warning] Unit1.pas(32): W1021 Comparison always evaluates to False
[dcc32 Error] Unit1.pas(32): E2029 'THEN' expected but identifier 'ExceptionRecord' found
[dcc32 Error] Unit1.pas(34): E2003 Undeclared identifier: 'apiaddr'
[dcc32 Warning] Unit1.pas(34): W1023 Comparing signed and unsigned types - widened both operands
[dcc32 Error] Unit1.pas(34): E2029 'THEN' expected but identifier 'ExceptionRecord' found
[dcc32 Error] Unit1.pas(36): E2003 Undeclared identifier: 'deinfo'
[dcc32 Error] Unit1.pas(36): E2029 'END' expected but ',' found
[dcc32 Error] Unit1.pas(63): E2029 '.' expected but 'END' found
[dcc32 Warning] Unit1.pas(63): W1011 Text after final 'END.' - ignored by compiler
[dcc32 Fatal Error] Project2.dpr(5): F2063 Could not compile used unit 'Unit1.pas'
Failed
Elapsed time: 00:00:00.6

求Delphi完整的工程文件打包,谢谢。这么高级的玩法没有学过。

[Delphi] 纯文本查看 复制代码
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs,
  Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if EXCEPTION_DEBUG_EVENT = de.dwDebugEventCode then    //判断是否为异常事件
  begin
    CopyMemory(Pointer(@excinfo), Pointer(@de.Exception), SizeOf(EXCEPTION_DEBUG_INFO));  //将调试结构中的异常结构复制出来
    if EXCEPTION_BREAKPOINT = excinfo.ExceptionRecord.ExceptionCode then     //异常代码是否为断点异常
    begin
      if apiaddr = excinfo.ExceptionRecord.ExceptionAddress then                    //异常位置是否为api地址处       apiaddr=excinfo.ExceptionAddress
      begin
        WriteProcessMemory(deinfo.hProcess, apiaddr, pointer(@yuan), 1, wd);  //将CC断点恢复成原来的字节 unhook
        //1、CONTEXT_DEBUG_REGISTERS,查询调式寄存器    {DR0-DR3(4个硬件断点所用) Dr6-Dr7}
        //
        //2、CONTEXT_FLOATING_POINT,查询浮点寄存器   { 387 state }
        //
        //3、CONTEXT_SEGMENTS,查询段寄存器       { DS, ES, FS, GS }
        //
        //4、CONTEXT_INTEGER,查询通用数据寄存器  { AX, BX, CX, DX, SI, DI }
        //
        //5、CONTEXT_CONTROL,查询控制寄存器组     { SS:SP, CS:IP, FLAGS, BP }
        //
        //6、CONTEXT_EXTENDED_REGISTERS,扩展寄存器组
        //
        //7、CONTEXT_FULL,CONTEXT_CONTROL+CONTEXT_SEGMENTS+ CONTEXT_SEGMENTS 三者合一
        GetThreadContext(deinfo.hThread, ctx);         //获得线程的上下文
        ShowMessage('当前寄存器Esp的值:' + IntToHex(ctx.Esp + 8));   //这里可以对寄存器进行操作 可以读写等等
        ctx.Eip := Integer(apiaddr) - 1; //ctx.Eip-1;    //因为断在CC处,此时EIP会在当前CC处的地址+1的位置,故需要减一,否则一开始被CC覆盖的那个字节就不会被执行,会报错的
        SetThreadContext(deinfo.hThread, ctx); //设置线程的上下文
        ContinueDebugEvent(de.dwProcessId, de.dwThreadId, DBG_CONTINUE);   //继续等待是否有调试事件的产生
        Sleep(0);     //每个线程有20毫秒的时间片运行,用完则切换其他线程,当运行完时,在context结构中取出保存的第一个线程执行结束时的状态,继续执行
     //调用Sleep函数,可以释放当前线程的剩余时间片,即放弃当前线程执行的CPU时间片,也就是说,调用Sleep(0)函数后,CPU会立即执行其他线程
     //否则可能引发当调试器写入CC时与被调试程序同时调用api导致内存访问异常.

     //如果有需要继续hook,则在这里用WriteProcessMemory继续改CC
      end;
    end;
  end
end;

end.
 楼主| bester 发表于 2019-12-5 12:41
冥界3大法王 发表于 2019-12-5 07:22
@bester
亲爱的楼楼,这个怎么玩耍?
Checking project dependencies...

这个是部分源码,完整源码我等会发你
 楼主| bester 发表于 2019-9-6 22:39
上图ShowMessage的内容获取的是ESP+8的值,我那个提示内容写错了,注意下,看代码也可以看得出来 我加了8
冥界3大法王 发表于 2019-12-5 07:26
我靠,这么好的东西怎么能错过少加分~~
晕,打错了。
小菜一碟(自由) 发表于 2020-2-3 15:28
求完整源码,cangxin2017@vip.qq.com。谢谢
CCStation 发表于 2020-2-17 08:19
m_h 发表于 2020-3-13 11:10
求完整代码
710774265@qq.comqq.com
m_h 发表于 2020-3-13 11:10
。。。。为啥多了个qq.com ............ ...啥情况
ycs 发表于 2020-4-7 13:34
源码完整第发个上来试试。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 15:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表