找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 13983|回复: 6

[开源] 利用Hook API函数OpenProcess与TerminateProcess来防止任务管理器结束进程

 火.. [复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2010-7-11 09:27:12 | 显示全部楼层 |阅读模式
利用Hook API函数OpenProcess与TerminateProcess来防止任务管理器结束进程
首先 声明一下 (此帖子为转载与网路,只是给汇编的朋友分享一下。由于本人不懂汇编 无法将此汇编转为易语言 所以请汇编高手把此方法转为易的! )

思路:其实比较简单,还是利用DLL,首写跟据API函数OpenProcess与TerminateProcess的结构自已编写两个与这两个API一样的函数,再利用GetProcAddress获取系统的那两个API函数入口地址,最后用WriteProcessMemory将你写的函数的地址替换掉原来系统的函数地址。这样所有调用这两系统API都将先执行你的函数。
如果只Hook其中一个函数比如只hook OpenProcess的话那么任务管理器将不能获取到你的进程信息那么会出错。如果只hook TerminateProcess那样也不行,因为一个进程的句柄在本进程与别的进程中是不一样的,所以如果你不知道自已进程在别人进程中的句柄那么是没办法hook TerminateProcess的。
本例中首先利用OpenProcess获取自已在别的进程中的句柄,然后hook TerminateProcess进程监控,如果发现有程序调用TerminateProcess并且所结束的对象正是自已,那么就给出提示窗口。
貌似讲了一大堆废话。。。还是看代码直接


  1. ------------------------------------------------调用部分
  2. unit Unit1;

  3. interface

  4. uses
  5. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  6. Dialogs, StdCtrls;

  7. type
  8. TForm1 = class(TForm)
  9. Button1: TButton;
  10. Button2: TButton;
  11. procedure Button1Click(Sender: TObject);
  12. procedure Button2Click(Sender: TObject);
  13. private
  14. { Private declarations }
  15. public
  16. { Public declarations }
  17. end;

  18. var
  19. Form1: TForm1;
  20. procedure StartHook(pid: DWORD); stdcall; external 'hookdll.dll';
  21. procedure EndHook; stdcall; external 'hookdll.dll';

  22. implementation

  23. {$R *.dfm}

  24. procedure TForm1.Button1Click(Sender: TObject);
  25. begin
  26. StartHook(GetCurrentProcessId);
  27. end;

  28. procedure TForm1.Button2Click(Sender: TObject);
  29. begin
  30. EndHook;
  31. end;

  32. end.
  33. -----------------------------------------------------------------------------------------

  34. DLL文件,全部实现都在这里
  35. --------------------- Hookdll.dpr
  36. library Hookdll;

  37. uses
  38. SysUtils,
  39. Classes,
  40. Windows,Dialogs,
  41. unitHook in 'unitHook.pas';


  42. const
  43. HOOK_MEM_FILENAME = 'tmp.hkt';
  44. var
  45. hhk: HHOOK;
  46. Hook: array[0..2] of TNtHookClass;

  47. //内存映射
  48. MemFile: THandle;
  49. startPid: PDWORD; //保存PID
  50. fhProcess: THandle; //保存本进程在远程进程中的句柄


  51. //拦截 OpenProcess
  52. function NewOpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; stdcall;
  53. type
  54. TNewOpenProcess = function (dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; stdcall;
  55. begin
  56. if startPid^ = dwProcessId then begin
  57. Hook[1].UnHook;
  58. Result := TNewOpenProcess(Hook[1].BaseAddr)(dwDesiredAccess, bInheritHandle, dwProcessId);
  59. fhProcess:=Result;
  60. Hook[1].Hook;
  61. exit;
  62. end;
  63. Hook[1].UnHook;
  64. Result := TNewOpenProcess(Hook[1].BaseAddr)(dwDesiredAccess, bInheritHandle, dwProcessId);
  65. Hook[1].Hook;

  66. end;

  67. function NewTerminateProcess(hProcess: THandle;uExitCode: UINT): BOOL; Stdcall;
  68. type
  69. TNewTerminateProcess = function (hProcess: THandle;uExitCode: UINT): BOOL; Stdcall;
  70. begin
  71. if fhProcess = hProcess then begin
  72. showmessage('不准关闭我!');
  73. result := true;
  74. exit;
  75. end;
  76. Hook[2].UnHook;
  77. Result := TNewTerminateProcess(Hook[2].BaseAddr)(hProcess, uExitCode );
  78. Hook[2].Hook;
  79. end;

  80. procedure InitHook; //安装 Hook
  81. begin
  82. Hook[1] := TNtHookClass.Create('kernel32.dll', 'OpenProcess', @NewOpenProcess);
  83. hook[2] := TNtHookClass.Create('kernel32.dll', 'TerminateProcess', @NewTerminateProcess);
  84. end;

  85. procedure UninitHook; //删除 Hook
  86. var
  87. I: Integer;
  88. begin
  89. for I := 0 to High(Hook) do
  90. begin
  91. FreeAndNil(Hook[I]);
  92. end;
  93. end;

  94. procedure MemShared();
  95. begin
  96. MemFile:=OpenFileMapping(FILE_MAP_ALL_ACCESS,False, HOOK_MEM_FILENAME); //打开内存映射文件
  97. if MemFile = 0 then begin
  98. MemFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,
  99. 4, HOOK_MEM_FILENAME);
  100. end;
  101. if MemFile <> 0 then
  102. //映射文件到变量
  103. startPid := MapViewOfFile(MemFile,FILE_MAP_ALL_ACCESS,0,0,0);
  104. end;

  105. //传递消息
  106. function HookProc(nCode, wParam, lParam: Integer): Integer; stdcall;
  107. begin
  108. Result := CallNextHookEx(hhk, nCode, wParam, lParam);
  109. end;

  110. //开始HOOK
  111. procedure StartHook(pid: DWORD); stdcall;
  112. begin
  113. startPid^ := pid;
  114. hhk := SetWindowsHookEx(WH_CALLWNDPROC, HookProc, hInstance, 0);
  115. end;

  116. //结束HOOK
  117. procedure EndHook; stdcall;
  118. begin
  119. if hhk <> 0 then
  120. UnhookWindowsHookEx(hhk);
  121. end;

  122. //环境处理
  123. procedure DllEntry(dwResaon: DWORD);
  124. begin
  125. case dwResaon of
  126. DLL_PROCESS_ATTACH: InitHook; //DLL载入
  127. DLL_PROCESS_DETACH: UninitHook; //DLL删除
  128. end;
  129. end;

  130. exports
  131. StartHook, EndHook;

  132. begin
  133. MemShared;

  134. { 分配DLL程序到 DllProc 变量 }
  135. DllProc := @DllEntry;
  136. { 调用DLL加载处理 }
  137. DllEntry(DLL_PROCESS_ATTACH);
  138. end.

  139. --------------------------- 单元unitHook.pas
  140. unit unitHook;

  141. interface

  142. uses
  143. Windows, Messages, Classes, SysUtils;

  144. type

  145. //NtHook类相关类型
  146. TNtJmpCode=packed record //8字节
  147. MovEax:Byte;
  148. Addr:DWORD;
  149. JmpCode:Word;
  150. dwReserved:Byte;
  151. end;

  152. TNtHookClass=class(TObject)
  153. private
  154. hProcess:THandle;
  155. NewAddr:TNtJmpCode;
  156. OldAddr:array[0..7] of Byte;
  157. ReadOK:Boolean;
  158. public
  159. BaseAddr:Pointer;
  160. constructor Create(DllName,FuncName:string;NewFunc:Pointer);
  161. destructor Destroy; override;
  162. procedure Hook;
  163. procedure UnHook;
  164. end;

  165. implementation

  166. //==================================================
  167. //NtHOOK 类开始
  168. //==================================================
  169. constructor TNtHookClass.Create(DllName: string; FuncName: string;NewFunc:Pointer);
  170. var
  171. DllModule:HMODULE;
  172. dwReserved:DWORD;
  173. begin
  174. //获取模块句柄
  175. DllModule:=GetModuleHandle(PChar(DllName));
  176. //如果得不到说明未被加载
  177. if DllModule=0 then DllModule:=LoadLibrary(PChar(DllName));
  178. //得到模块入口地址(基址)
  179. BaseAddr:=Pointer(GetProcAddress(DllModule,PChar(FuncName)));
  180. //获取当前进程句柄
  181. hProcess:=GetCurrentProcess;
  182. //指向新地址的指针
  183. NewAddr.MovEax:=$B8;
  184. NewAddr.Addr:=DWORD(NewFunc);
  185. NewAddr.JmpCode:=$E0FF;
  186. //保存原始地址
  187. ReadOK:=ReadProcessMemory(hProcess,BaseAddr,@OldAddr,8,dwReserved);
  188. //开始拦截
  189. Hook;
  190. end;

  191. //释放对象
  192. destructor TNtHookClass.Destroy;
  193. begin
  194. UnHook;
  195. CloseHandle(hProcess);

  196. inherited;
  197. end;

  198. //开始拦截
  199. procedure TNtHookClass.Hook;
  200. var
  201. dwReserved:DWORD;
  202. begin
  203. if (ReadOK=False) then Exit;
  204. //写入新的地址
  205. WriteProcessMemory(hProcess,BaseAddr,@NewAddr,8,dwReserved);
  206. end;

  207. //恢复拦截
  208. procedure TNtHookClass.UnHook;
  209. var
  210. dwReserved:DWORD;
  211. begin
  212. if (ReadOK=False) then Exit;
  213. //恢复地址
  214. WriteProcessMemory(hProcess,BaseAddr,@OldAddr,8,dwReserved);
  215. end;

  216. end.
复制代码
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-7-12 01:14:02 | 显示全部楼层
看着DELPHI就头晕...........
我就是嗷嗷叫的老马了......

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2010-7-12 11:37:50 | 显示全部楼层
此帖子为转载与网路,只是给汇编的朋友分享一下。由于本人不懂汇编 无法将此汇编转为易语言 所以请汇编高手把此方法转为易的!

这个涉及函数指针,估计易语言做不了。

1

主题

16

回帖

0

精华

初来乍到

积分
31
发表于 2010-7-17 14:50:00 | 显示全部楼层
据说不是E语言支持指针?

4

主题

5

回帖

1

精华

金牌会员

积分
1156
发表于 2010-12-20 22:57:44 | 显示全部楼层
这个玩意儿会让你听到 “咣咣的ERROR提示音” 发病期不确定...根据你系统运行程序的不明真相遗留 时而发病  时而安然无事... 这种倒退N年玩玩还是很不错的 ,如今的话 下两层做保护吧...

1

主题

16

回帖

0

精华

初来乍到

积分
31
发表于 2011-7-18 20:56:36 | 显示全部楼层
gam2046 发表于 2010-7-17 14:50
据说不是E语言支持指针?

过了一年 我又回来了、
当然我这么怂、现在看看依旧这么怂、

30

主题

693

回帖

0

精华

钻石会员

积分
2815
发表于 2015-4-1 14:46:06 | 显示全部楼层
delphi的语法试试最容易读懂的语法之一
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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