HookAPI技术评论
声明:本次评论是www.haohiw.cn站的站长个人的对HookAPI技术的个人评论!
大家好我在(www.pudn.com)网上下载到一个"进程保护HookOpenProcess"Delphi源代码,在下载时我已经
注意到下面有一些说明:“详细说明:利用hook openprocess实现防止任务管理器结束的方法,但是只能
实现防止任务管理器,其他的防不住-Hook openprocess use Task Manager to prevent the realization
of the end of the method, but can only achieve the Task Manager to prevent other防不住”为什
么这个实例却只能防止Windows任务管理器结束任务?我把这个源代码看了个遍,也做了系列的检测,发现
了几点重要原因!
一、代码不足的原因:
1.
function MyOpenProcess(dwDesiredAccess: DWORD; bInheritHandle:
BOOL; dwProcessId: DWORD): THandle; stdcall;
const
INPMCLASS = 'TfrmCannotKill';
var
nSize :Cardinal;
Hwnds: HWND;
AppProID: DWORD;
begin {不足够的条件!dwDesiredAccess = PROCESS_TERMINATE
这个条件只能针对于一般的任务管理器使用的结束任务句柄
也就是说当 dwDesiredAccess = 1 时,才进行判断结束的
是否为TfrmCannotKill窗体的应用程序,如果是就返回0的
句柄,实现任务管理器无法结束该任务。}
if dwDesiredAccess = PROCESS_TERMINATE then
begin {PROCESS_TERMINATE = 1}
Hwnds := FindWindow(INPMCLASS, nil);
if Hwnds <> 0 then
begin
GetWindowThreadProcessId(Hwnds, @AppProID);
if dwProcessId = AppProID then
begin
Result := 0;
Exit;
end;
end;
end;
WriteProcessMemory(ProcessHandle, BaseAddress, @OldProc, 8, nSize);
Result := OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
WriteProcessMemory(ProcessHandle, BaseAddress, @NewPorc, 8, nSize);
end;
上面就是其中的一段代码,不足的地方也就是只判断dwDesiredAccess = PROCESS_TERMINATE,我用了一下
windows优化大师自带的任务管理器进行了测试,很容易就结束了它的进程,难道说它就这么垃圾?其实windows
优化大师任务管理器并非用到PROCESS_TERMINATE = 1这种结束方式!根据我的测试windows优化大师任务管理器
用的却是2035711这个句柄。
修改后:
function MyOpenProcess(dwDesiredAccess: DWORD; bInheritHandle:
BOOL; dwProcessId: DWORD): THandle; stdcall;
const
INPMCLASS = 'TfrmCannotKill';
var
nSize :Cardinal;
Hwnds: HWND;
AppProID: DWORD;
begin
if (dwDesiredAccess = PROCESS_TERMINATE) or (dwDesiredAccess = 2035711) then
{有人也会想到用PROCESS_ALL_ACCESS可以直接判断所有的访问,
但是最后“if dwProcessId = AppProID then” 还能够相等吗?所以不能用PROCESS_ALL_ACCESS}
begin
Hwnds := FindWindow(INPMCLASS, nil);
if Hwnds <> 0 then
begin
GetWindowThreadProcessId(Hwnds, @AppProID);
if dwProcessId = AppProID then
begin
Result := 0;
Exit;
end;
end;
end;
WriteProcessMemory(ProcessHandle, BaseAddress, @OldProc, 8, nSize);
Result := OpenProcess(dwDesiredAccess, bInheritHandle, dwProcessId);
WriteProcessMemory(ProcessHandle, BaseAddress, @NewPorc, 8, nSize);
end;
修改后的确Windows优化大师任务管理器和taskmgr任务管理器都无法结束该任务了,但是最大的缺点不在这里!
二、Hook技术不足
这是其中的一部分代码:
procedure HookProc(nCode, wParam, lParam: LongWORD);stdcall;
begin
if not Bol then
CallNextHookEx(DLLHook, nCode, wParam, lParam);
end;
{ 状态挂钩 }
function InstallHook(MainHandle: HWND): Boolean; stdcall;
begin
DLLHook := SetWindowsHookEx(WH_GETMESSAGE, @HookProc, Hinstance, 0);
Result := DLLHook <> 0;
end;
{ 卸载挂钩 }
procedure UnHook; stdcall;
begin
UnHookAPI;
UnhookWindowsHookEx(DLLHook);
end;
procedure MyDLLHandler(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH: HookAPI;
DLL_PROCESS_DETACH: UnHook;
end;
end;
这种挂钩方式存在很多的不足!
1、不能映射到一般的System系统进程当中。不相信可以用这个VB编写的提升进程权限到system权限的程序来提升下
taskmgr.exe(在提升它时请先关闭它),看看能不能终止这种进程保护方式!因为Hook根本就没能注入到system权限
的taskmgr.exe进程中!你也可以测试用金山词霸鼠标移动到提升权限后的窗体程序上面的英文,还能不能翻译?这
种 Hook方式就如同金山词霸的最简单的Hook来进行翻译鼠标获取到的字符方法一样。
(VB编写的提升进程权限到system权限可到这里下载http://www.haohiw.cn/)
2、不能映射到杀毒软件的普通用户方式的进程当中,更何况是以系统方式运行的杀毒软件进程呢?原因:就算是
普通的进程但是它却有和系统进程一样高的权限,甚至更高。你可以用江民杀毒软件自带的进程查看工具,看看
这些普通用户的模块列表和系统进程的模块列表,还有进程查看工具自身的模块列表,就知道那些进程可以轻松
的终止你的进程了。
本次对Hook技术的评论并非是鼓励编程人员开发病毒,而是作为一次技术性的探讨,