X-FREE的loader程序

这篇博客介绍了一种使用DEBUG_API调试X-FREE loader程序的方法,通过设置断点,修改内存中的指令和寄存器状态来实现对目标进程的调试。在调试过程中,当遇到退出事件或异常事件时,程序会进行相应的处理,确保调试过程的正常进行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

算法对我来说挺复杂,没那么多时间研究,等有空再说
写了个loader程序,顺便了解一下debug api,主要思路是在地址$42B425处,置ZF为1
代码是随手写的缺少很多检测
  1. program CPPIDE_LOADER;
  2. uses
  3.   Windows;
  4. {$R *.res}
  5. const
  6.   BP = $42B425;
  7.   int3 :DWORD = $CC;
  8. var
  9.   startinfo :STARTUPINFO;
  10.   pi:PROCESS_INFORMATION;
  11.   DBEvent:DEBUG_EVENT;
  12.   org_code :Byte;
  13.   num: Cardinal;
  14.   ctext : CONTEXT;
  15.   dwNewProt, dwOldProt:DWORD;
  16. begin
  17.   GetStartupInfo(startinfo);
  18.   if not CreateProcess('CPPIDE.exe',nil,nil,nil,False,DEBUG_PROCESS + DEBUG_ONLY_THIS_PROCESS,nil,nil,startinfo,pi) then //调试模式加载进程
  19.   begin
  20.     MessageBox(0,'不能加载CPPIDE.exe','错误',0);
  21.     Halt;
  22.   end;
  23.   while WaitForDebugEvent(DBEvent,INFINITE) do   //等待调试事件
  24.   begin           
  25.     if DBEvent.dwDebugEventCode = EXIT_PROCESS_DEBUG_EVENT THEN       //进程退出
  26.     begin
  27.       //MessageBox(0,'The debuggee exits','Win32 Debug Example no.1',mb_ok + MB_ICONINFORMATION);
  28.       ContinueDebugEvent(DBEvent.dwProcessId,DBEvent.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);
  29.       CloseHandle(pi.hProcess);
  30.       CloseHandle(pi.hThread);
  31.       Halt;
  32.     end
  33.     else if DBEvent.dwDebugEventCode = exception_debug_event then
  34.     begin
  35.       if DBEvent.Exception.ExceptionRecord.ExceptionCode =  exception_breakpoint then
  36.       begin
  37.         if Integer(DBEvent.Exception.ExceptionRecord.ExceptionAddress) <> BP then       //设置断点
  38.         begin
  39.          VirtualProtectEx(pi.hProcess,Pointer(BP),1, PAGE_EXECUTE_READWRITE, dwOldProt);
  40.          ReadProcessMemory(pi.hProcess,Pointer(BP),@org_code,1,num);
  41.          WriteProcessMemory(pi.hProcess,Pointer(BP),@int3,1,num);
  42.          VirtualProtectEx(pi.hProcess, Pointer(BP), 1, dwOldProt, dwNewProt);
  43.          //MessageBox(0,'',PAnsiChar(string(rtn)),0)
  44.         end
  45.         else
  46.         begin                                                   //$42B425处中断,修改ZF的值为1
  47.           WriteProcessMemory(pi.hProcess,Pointer(BP),@org_code,1,num);
  48.           ctext.ContextFlags := CONTEXT_FULL;
  49.           GetThreadContext(pi.hThread,ctext);
  50.           ctext.EFlags := ctext.EFlags or 64;                  //ZF置1(与二进制1000000或)
  51.           ctext.Eip := ctext.Eip - 1;                          //eip回到$42B425
  52.           SetThreadContext(pi.hThread,ctext);
  53.         end;
  54.         ContinueDebugEvent(DBEvent.dwProcessId,DBEvent.dwThreadId,DBG_CONTINUE);       //继续运行
  55.         Continue;
  56.       end;
  57.     end;
  58.     ContinueDebugEvent(DBEvent.dwProcessId,DBEvent.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);       //继续运行
  59.   end;
  60. end.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liuin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值