HOOK API(四)
—— 进程防终止
0x00 前言这算是一个实战吧,做的一个应用需要实现进程的防终止保护,查了相关资料后决定用HOOK API的方式实现。起初学习HOOK API的起因是因为要实现对剪切板的监控,后来面对进程保护这样一个需求时,综合各方资料并自己动手实现HOOK OpenProcess() 和 TerminateProcess() 来从调用层实现进程的防终止。下面将进一步介绍实现的过程,也算是对学习的一个总结与实战。
主要参考:
0x01 实现思路大体的HOOK API的实现思路在前面几篇相关文章中已经讲过。大致可分为以下步骤:1.确定要HOOK的API原型,并参照原型定义自己的API。2.在DLL中实现自己的API,并使用新的API入口地址替换原API地址实现HOOK,利用jmp xxxx 指令实现重定向。其中可以利用GetProcAddress()获取系统的API地址,通过WriteProcessMemory将自己写的API地址替换掉原API地址。3.利用鼠标钩子将自己的DLL注入到目标进程中。
我们这里要实现进程的防终止,设计到的API有两个,分别是OpenProcess() 和 TerminateProcess(),这两个API在Kernel32.dll中。如果只HOOK 其中一个API是不可行的,若只HOOK OpenProcess(),那么任务管理器将无法获取到受保护进程的信息,进而会出错。若只HOOK TerminateProcess也是不可行的,因为一个进程的句柄在本进程与其他进程中是不一样的,因此若是你不知道自己进程在其他进程中的句柄那将无法HOOK TerminateProcess。
本事例采用的方案是,同时HOOK OpenProcess()和TerminateProcess(),在OpenProcess中获取自己的受保护进程在其他进程中的调用句柄,然后再TerminateProcess进程监控,如果发现有进程调用TerminateProcess并且所借宿的对象是自己要保护的进程,那么就给出禁止关闭的提示窗口。
OpenProcess()是打开进程,而TerminateProcess()是结束进程,在调用TerminateProcess()结束进程时,必然会先调用OpenProcess()进程打开进程句柄。以下是这两个API的原型:
HANDLE OpenProcess(
DWORD dwDesiredAccess, //渴望得到的访问权限(标志)
BOOL bInheritHandle, // 是否继承句柄
DWORD dwProcessId // 进程标示符
);
BOOL TerminateProcess(
HANDLE hProcess, //进程句柄
UINT uExitCode //进程终止码
);
0x02 HOOL DLL的实现 MonitorDll中的MonitorDll.h源码:
// MonitorDll.h : MonitorDll DLL 的主头文件 // #pragma once #ifndef __AFXWIN_H__ #error "在包含此文件之前包含"stdafx.h"以生成 PCH 文件" #endif #include "resource.h" // 主符号 // CMonitorDllApp // 有关此类实现的信息,请参阅 MonitorDll.cpp // class CMonitorDllApp : public CWinApp { public: CMonitorDllApp(); // 重写 public: virtual BOOL InitInstance(); int ExitInstance(); DECLARE_MESSAGE_MAP() };
// MonitorDll.cpp : 定义 DLL 的初始化例程。 // #include "stdafx.h" #include "MonitorDll.h" #ifdef _DEBUG #define new DEBUG_NEW #endif /* 全局变量 */ // 共享变量 #pragma data_seg("Share")
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70525.html
- 上一篇:win7保护眼睛的颜色设置方法
- 下一篇:C#学习笔记二(函数高级参数)