x64下进程保护HOOK
x64(32)下的进程保护回调.
一丶进程保护线程保护
1.简介以及原理
以前我们讲过.SSDT 可以做很多事情.比如可以防止进程被结束
其实到了x64下.你也可以HOOK SSDT.只不过你需要过一下PatchGuard
但是在你过不了PG的情况下.其实操作系统也给你提供了回调进行保护.
这个回调 也可以称作 对象钩子(OBject)
这个回调主要函数则是 ** ObRegisterCallbacks() **
其实关于回调函数.去查询MSDN即可. 以前博客也有说过.只不过现在
想重新写一下.
MSDN: https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/wdm/nf-wdm-obregistercallbacks
这个函数其实就是不断的填写结构体即可. 根据MSDN说明去填写.
函数其实特别简单.参数1就是一个结构体,你去填写. 参数2就是一个句柄.当你卸载的时候会使用.
结构体中会包含一个结构体. 主要是为了你可以一次设置多个回调.
新的结构体只不过是指定你要监控的类型以及回调函数地址.
唯一重点就是 在x64下.因为你没驱动签名的驱动则不能使用这些操作系统提供的回调.例如还有的 (PsSetCreateProcessEx) 等等.
但是没事.因为国外早有人逆向出来为什么不能使用.而我们只需要设置一个标志即可.
只需要在程序入口处.添加代码即可.
如下:
PLDR_DATA_TABLE_ENTRY ldr;
ldr = (PLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection;
ldr->Flags |= 0x20;//加载驱动的时候会判断此值。必须有特殊签名才行,增加0x20即可。否则将调用失败
结构体定义如下:
typedef struct _LDR_DATA_TABLE_ENTRY {
LIST_ENTRY64 InLoadOrderLinks;
LIST_ENTRY64 InMemoryOrderLinks;
LIST_ENTRY64 InInitializationOrderLinks;
PVOID DllBase;
PVOID EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
ULONG Flags;
USHORT LoadCount;
USHORT TlsIndex;
PVOID SectionPointer;
ULONG CheckSum;
PVOID LoadedImports;
PVOID EntryPointActivationContext;
PVOID PatchInformation;
LIST_ENTRY64 ForwarderLinks;
LIST_ENTRY64 ServiceTagLinks;
LIST_ENTRY64 StaticLinks;
PVOID ContextInformation;
ULONG OriginalBase;
LARGE_INTEGER LoadTime;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
这里注意的大小即可.32位下.使用LIST_ENTRY32即可.
此时按照我们结构体进行填写.安装驱动即可.
至于回调怎么写.自己查看MSDN看一下就明白了.你自己写你自己的回调函数即可.
如下:
函数声明放到了Driver.h中.自己定义的头文件中.不影响.
1.2 代码
#include "Driver.h"
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegPath)
{
ULONG iCount = 0;
NTSTATUS ntStatus;
PLDR_DATA_TABLE_ENTRY ldr;
ldr = (PLDR_DATA_TABLE_ENTRY)pDriverObj->DriverSection;
ldr->Flags |= 0x20;
pDriverObj->DriverUnload = DriverUnLoad;
/*ntStatus = InitDeviceAnSybolicLinkName(pDriverObj);
if (!NT_SUCCESS(ntStatus))
{
return ntStatus;
}
ntStatus = InitDisPatchFunction(pDriverObj);
if (!NT_SUCCESS(ntStatus))
{
return ntStatus;
}*/
InitHook();
return STATUS_SUCCESS;
}
//我们的回调函数
OB_PREOP_CALLBACK_STATUS MyObjectCallBack(
PVOID RegistrationContext,
POB_PRE_OPERATION_INFORMATION OperationInformation
)
{
DbgPrint("1111\r\n");
return STATUS_SUCCESS;
}
PVOID g_ObjHandle;
VOID InitHook()
{
//进行HOOK 回调钩子写法.
OB_OPERATION_REGISTRATION oper; //你的回调函数以及类型都放在这个结构体中,可以是结构体数组.
OB_CALLBACK_REGISTRATION CallbackRegistration;
CallbackRegistration.Version = OB_FLT_REGISTRATION_VERSION; //版本号
CallbackRegistration.OperationRegistrationCount = 1;//下几个钩子,也就是结构体数组个数
RtlUnicodeStringInit(&CallbackRegistration.Altitude, L"600000");//给个UNICODEstring表明您是干啥的
CallbackRegistration.RegistrationContext = NULL; //当你的回调函数到的时候参数是什么.由这里给出
CallbackRegistration.OperationRegistration = &oper; //钩子结构体类型设置.
//为钩子结构体赋值
oper.ObjectType = PsProcessType; //进程操作的类型.当进程操作回来. PsThreadType则是线程操作
oper.Operations = OB_OPERATION_HANDLE_CREATE; //操作的类型是将要打开.以及将要重复
oper.PreOperation = MyObjectCallBack; //有两个指针,前指针跟后指针.意思分别是 进程创建之前通知你还是之后
oper.PostOperation = NULL;
ObRegisterCallbacks(&CallbackRegistration,&g_ObjHandle);
}
VOID UnHook()
{
ObUnRegisterCallbacks(g_ObjHandle);
}

1.3注意的问题
编写代码的时候会发生蓝屏.原因是你设置前指针后.后指针需要设置为NULL
因为如果是进程保护的话. 当创建进程的时候则会遍历对象数组.依次调用.
而你的前指针会调用.而后指针没有设置为NULL.而是一个垃圾值所以就会引发蓝屏.
这个是个需要注意的.
二丶丶回调函数写法
2.1 遇到的问题.
关于回调函数中.我们相看访问权限.但是发现却没有.
MSDN只是告诉你什么是什么.我们要怎么知道.
首先先列出
#define PROCESS_TERMINATE (0x0001) // winnt
#define PROCESS_CREATE_THREAD (0x0002) // winnt
#define PROCESS_SET_SESSIONID (0x0004) // winnt
#define PROCESS_VM_OPERATION (0x0008) // winnt
#define PROCESS_VM_READ (0x0010) // winnt
#define PROCESS_VM_WRITE (0x0020) // winnt
// begin_ntddk begin_wdm begin_ntifs
#define PROCESS_DUP_HANDLE (0x0040) // winnt
// end_ntddk end_wdm end_ntifs
#define PROCESS_CREATE_PROCESS (0x0080) // winnt
#define PROCESS_SET_QUOTA (0x0100) // winnt
#define PROCESS_SET_INFORMATION (0x0200) // winnt
#define PROCESS_QUERY_INFORMATION (0x0400) // winnt
#define PROCESS_SET_PORT (0x0800)
#define PROCESS_SUSPEND_RESUME (0x0800) // winnt
然后查找WRK可以看得到.

然后我们可以单独在回调中写代码了.
2.2 回调代码
NTKERNELAPI
UCHAR * PsGetProcessImageFileName(__in PEPROCESS Process);
OB_PREOP_CALLBACK_STATUS MyObjectCallBack(
PVOID RegistrationContext,
POB_PRE_OPERATION_INFORMATION OperationInformation
)
{
PEPROCESS pProcess = NULL;
UCHAR *pszName = NULL;
pProcess = (PEPROCESS)OperationInformation->Object;
pszName = PsGetProcessImageFileName(pProcess);
//判断标志是否要打开进程
if (OperationInformation->Operation == OB_OPERATION_HANDLE_CREATE)
{
//获取名字匹配
if (strstr(pszName, "calc"))
{
KdPrint(("%s \r\n", pszName));
//判断是不是结束
if ((OperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess
& PROCESS_TERMINATE) == 1)
{
//如果是我们的.则设置DesiredAccess权限.去掉结束权限.
OperationInformation->Parameters->CreateHandleInformation.DesiredAccess
= ~PROCESS_TERMINATE;
return STATUS_UNSUCCESSFUL;
}
}
}
return STATUS_SUCCESS;
}

x64下进程保护HOOK的更多相关文章
- Win7 x64下进程保护与文件保护(ObRegisterCallbacks)
进程保护部分参考 http://bbs.pediy.com/showthread.php?t=168023 进程保护,在任务管理器不能结束进程 #ifndef CXX_PROTECTPROCESSX6 ...
- 64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 )
64位下Hook NtOpenProcess的实现进程保护 + 源码 (升级篇 ) [PS: 如果在64位系统下,出现调用测试demo,返回false的情况下,请修改Hook Dll的代码] glhH ...
- 【Hook技术】实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展
[Hook技术]实现从"任务管理器"中保护进程不被关闭 + 附带源码 + 进程保护知识扩展 公司有个监控程序涉及到进程的保护问题,需要避免用户通过任务管理器结束掉监控进程,这里使用 ...
- [转载] 关于Win7 x64下过TP保护的一些思路,内核层过保护,驱动过保护
首先特别感谢梦老大,本人一直没搞懂异常处理机制,看了他的教程之后终于明白了.在他的教程里我学到了不少东西.第一次在论坛发帖,就说说Win7 x64位下怎么过TP保护.如果有讲错的地方,还望指出.说不定 ...
- 进程隐藏与进程保护(SSDT Hook 实现)(二)
文章目录: 1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ri ...
- SSDT Hook实现内核级的进程保护
目录 SSDT Hook效果图 SSDT简介 SSDT结构 SSDT HOOK原理 Hook前准备 如何获得SSDT中函数的地址呢 SSDT Hook流程 SSDT Hook实现进程保护 Ring3与 ...
- 进程隐藏与进程保护(SSDT Hook 实现)(三)
文章目录: 1. 引子: 2. 获取当前系统下所有进程: 3. 服务管理(安装,启动,停止,卸载): 4. 应用程序和内核程序通信: 5. 小结: 1. 引子: 关于这个 SSDT Hook 实现进程 ...
- Windows 下针对python脚本做一个简单的进程保护
前提: 大家运行的脚本程序经常会碰到系统异常关闭.或被其他用户错杀的情况.这样就需要一个进程保护的工具. 本文结合windows 的计划任务,实现一个简单的进程保护的功能. 利用py2exe生产 ex ...
- 通过SSDT HOOK实现进程保护和进程隐藏
---恢复内容开始--- 首先,我要说一件很重要的事,本人文采不好,如果哪里说的尴尬了,那你就尴尬着听吧...... SSDT HOOK最初貌似源于Rookit,但是Rookit之前有没有其他病毒使用 ...
随机推荐
- C#实现服务器间文件同步
using System.IO; /// <summary> /// 远程登陆服务器 /// </summary> /// <param name="remot ...
- Android 8.0的平台上,应用不能对大部分的广播进行静态注册
引言在Android 8.0的平台上,应用不能对大部分的广播进行静态注册,也就是说,不能在AndroidManifest文件对有些广播进行静态注册,这里必须强调是有些广播,因为有些广播还是能够注册的. ...
- [Windows] - Windows/Office纯绿色一键激活工具及方法
瘟到死网上有很多一件键激活工具(如KMS),但许多带毒或报毒.这里给出一个纯绿色命令行一键激活,及自已搭建激活服务器的方法. KMS现在算法都是公开的了,可以自行在网上找到,这里不详述. 使用命令行一 ...
- ASP.NET SignalR 系列(九)之源码与总结
1.SignalR 1.0与2.0有些不同,以上篇章均只支持2.0+ 2.必须注意客户端调用服务端对象和方法时的大小写问题 3.客户端上的方法不能重名 4.IE7及以下的,需要增加json的分析器,分 ...
- JavaScript---正则使用,日期Date的使用,Math的使用,JS面向对象(工厂模式,元模型创建对象,Object添加方法)
JavaScript---正则使用,日期Date的使用,Math的使用,JS面向对象(工厂模式,元模型创建对象,Object添加方法) 一丶正则的用法 创建正则对象: 方式一: var reg=new ...
- 16、css实现div中图片占满整个屏幕
<div class="img"></div> .img{ background: url("../assets/image/img.png&qu ...
- Java 面向对象—杂项(方法不能重写,修饰符,变量)
一.哪些方法不能被重写? 1.final 修饰的不能重写 2.static 修饰的不能重写 3.private 修饰的,因为私有的在子类中不可见 4.如果跨包的话,修饰符缺省的也不能被重写,因为缺省的 ...
- 为什么MES系统要定制化?看这三家汽车供应商的苦恼
很多企业对于为什么要对MES系统进行选择和定制化很不理解,今天,小编通过一个故事给大家进行阐述—— 故事背景: 汽车电子行业的三家企业A,B,C. A是整车厂一级供应商,主要产品为汽车电子配电盒. B ...
- Xorequ(BZOJ3329+数位DP+斐波那契数列)
题目链接 传送门 思路 由\(a\bigoplus b=c\rightarrow a=c\bigoplus b\)得原式可化为\(x\bigoplus 2x=3x\). 又异或是不进位加法,且\(2x ...
- Fiddler抓websocket协议的包,用jmeter做并发测试
1.Fiddler: 左边为ws请求url.右边为请求数据,响应数据 jmeter: