首页
论坛
专栏
课程

[原创]温故而知新-自构造api反hook

2019-10-7 08:40 1304

[原创]温故而知新-自构造api反hook

2019-10-7 08:40
1304
国庆在家翻  [2019国庆礼物]《看雪论坛精华16》
传送门: https://bbs.pediy.com/thread-254820.htm

里面都是整理后的精华文章,看着很爽很过瘾


 翻到一个前辈的文章有个兴趣点
 所以深入分一下 [自己构造ZwSetContextThread,和ZwGetContextThread]
  传送门: https://bbs.pediy.com/thread-202048.htm


经过原理分析,调试 ,用delphi7编译.win10测试ok
考虑到还有用处然后封装成一个函数SetKernelFunBind.
直接上码

program Project2;

uses
  Windows;

procedure SetKernelFunBind(TargetModule, TargetProc: string; MyProc: pointer);
var
  OldProtect: longword;
  KerFunProc: pointer;
  ret: dword; addr: Integer; jmp: Byte;
begin
  //api地址
  KerFunProc := GetProcAddress(LoadLibrary(pchar(TargetModule)), pchar(TargetProc));

  //如果被断直接退吧
  if byte(KerFunProc^) = $CC then Exit;

  //修改MyProc的内存保护方式
  VirtualProtect(MyProc, 10, PAGE_EXECUTE_READWRITE, OldProtect);

    //复制系统api函数的前5字节覆盖到本地
  WriteProcessMemory($FFFFFFFF, MyProc, KerFunProc, 5, ret);

   //谢入跳转数据   修改本地函数执行流程
  jmp := $E9;
  WriteProcessMemory($FFFFFFFF, pointer(longword(MyProc) + 5), @jmp, 1, ret);
  addr := longword(KerFunProc) - longword(MyProc) - 5;
  WriteProcessMemory($FFFFFFFF, pointer(longword(MyProc) + 5 + 1), @addr, 4, ret);

    //恢复保护方式
  VirtualProtect(MyProc, 10, OldProtect, OldProtect);
end;

function msgbox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
begin
  MessageBoxA(0, '要上班啦!', 0, 0);
   //因为SetKernelFunBind判断CC断点,所以这里也可以做一下简单的端点检测
end;

begin
  msgbox(0, '国庆快乐', 0, 0); //这里尚未绑定api函数,所以只会弹出 要上班啦!
  SetKernelFunBind('user32.dll', 'MessageBoxA', @msgbox); //绑定函数msgbox到系统api函数的MessageBoxA
  msgbox(0, '国庆快乐', 0, 0); //以MessageBoxA来执行参数,弹出  国庆快乐
end.



[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

上传的附件:
最新回复 (2)
nqxcwl 2019-10-7 10:13
2
0
打破0回复~~
kagayaki 2019-10-9 11:29
3
0
感谢分享
游客
登录 | 注册 方可回帖
返回