温故而知新-自构造api反hook
2019-10-07 13:37:42 Author: bbs.pediy.com(查看原文) 阅读量:145 收藏

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

3小时前 167

国庆在家翻  [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.

[培训]《安卓高级研修班》彻底搞定函数抽取型壳!现在报名得源码和安卓8.1脱壳机!10月20日深圳专场不见不散!


文章来源: https://bbs.pediy.com/thread-254893.htm
如有侵权请联系:admin#unsafe.sh