64位内核第二讲,进程保护之对象钩子

         64位内核第二讲,进程保护.

一丶什么是保护.

什么是保护. 比如我们安装了xxx杀毒软件.那么此时你用任务管理器关闭.是关闭不了的.原因是内核已经做了保护.

那么去掉保护的前提就是你要给自己的软件做保护.

比如我们给计算器做保护. 例如下图.

做保护.以前的病毒作者.都是想要退出xxx杀毒软件. 什么方法都能做. 所以杀软为了防止这一情况发生,直接把打开进程的API进行HOOK即可.

但是别忘了.还可以拷贝句柄.所以杀软防不住.只能在内核做保护.

二丶给软件添加保护熟悉API和结构体

给软件添加保护很简单. 也是调用API进行操作.

API:

  ObRegisterCallbacks  注册进程和线程处理回调

NTSTATUS ObRegisterCallbacks(IN POB_CALLBACK_REGISTRATION  CallBackRegistration,OUT PVOID  *RegistrationHandle);

第一个是个结构体,我们想要进行的操作都放在这个结构中

第二个是个二级指针,我们给一个即可

 

结构体:

typedef struct _OB_CALLBACK_REGISTRATION {__in USHORT  Version;                  //版本号__in USHORT  OperationRegistrationCount;       //回调个数. 可以一次蹙着多个回调. 和最后一个参数绑定的. 如果一次注册多个.则最后一个参数需要给数组保存,最后参数是一个结构体.__in UNICODE_STRING  Altitude;            // 指定的驱动程序的Uncode字符串. 可以看WDK文档给.__in PVOID  RegistrationContext;           // 回调函数的参数.如果你给可以在这里给.__in OB_OPERATION_REGISTRATION  *OperationRegistration;//回调函数信息结构体,如果个数有多个,你需要定义为数组.
} OB_CALLBACK_REGISTRATION, *POB_CALLBACK_REGISTRATION;

 

结构体中回调函数结构体.

typedef struct _OB_OPERATION_REGISTRATION {__in POBJECT_TYPE  *ObjectType;        //对象的类型.你注册回调函数的类型 PsProcessType 和 PsThreadType 分别是进程回调和线程回调.__in OB_OPERATION  Operations;         //注册回调的操作方式, 一个是创建进程. 一个是拷贝进程句柄.  OB_OPERATION_HANDLE_CREATEA  ,OB_OPERATION_HANDLE_DUPLICATE __in POB_PRE_OPERATION_CALLBACK  PreOperation;//创建之前回调函数的地址,在这里给. 每一个回调都包含什么信息在这个结构体中给出.__in POB_POST_OPERATION_CALLBACK  PostOperation;//创建之后回调函数的地址. 和上面不一样,一个是创建之前,你的回调回来,一个是创建之后你的回调函数回来.
} OB_OPERATION_REGISTRATION, *POB_OPERATION_REGISTRATION;

 

回调函数原型

 

OB_PREOP_CALLBACK_STATUS ObjectPreCallback(__in PVOID  RegistrationContext,    //回调函数的参数,上面通过结构体给的.__in POB_PRE_OPERATION_INFORMATION  OperationInformation //进程或者线程创建的信息结构体);

  

进程或者线程信息结构体.

typedef struct _OB_PRE_OPERATION_INFORMATION {__in OB_OPERATION  Operation;    //句柄的操作类型, 是上面我们给的.union {__in ULONG  Flags;struct {__in ULONG  KernelHandle:1;__in ULONG  Reserved:31;};};__in PVOID  Object;        //对象指针,如果你给的是监控进程,那么这个对象就是EPROCESS,如果是线程,那么这个对象就是ETHREAD__in POBJECT_TYPE  ObjectType; //对象类型. 可能是PsThreadType 也可能是 PsProcessType__out PVOID  CallContext;__in POB_PRE_OPERATION_PARAMETERS  Parameters; //创建或者创建之后的参数信息结构体.
} OB_PRE_OPERATION_INFORMATION, *POB_PRE_OPERATION_INFORMATION;

 

参数信息结构体

typedef union _OB_PRE_OPERATION_PARAMETERS {__inout OB_PRE_CREATE_HANDLE_INFORMATION  CreateHandleInformation;        //创建句柄,则成员会给这个赋值__inout OB_PRE_DUPLICATE_HANDLE_INFORMATION  DuplicateHandleInformation;    //拷贝句柄,则给这个成员赋值.} OB_PRE_OPERATION_PARAMETERS, *POB_PRE_OPERATION_PARAMETERS;

  

创建句柄结构体

typedef struct _OB_PRE_CREATE_HANDLE_INFORMATION {__inout ACCESS_MASK  DesiredAccess;                        //创建的权限是什么. 如果我们给 0则没有任何权限,则进程不能创建.__in ACCESS_MASK  OriginalDesiredAccess;                     //原始的权限.
} OB_PRE_CREATE_HANDLE_INFORMATION, *POB_PRE_CREATE_HANDLE_INFORMATION;

 

拷贝句柄结构体信息

  __inout ACCESS_MASK  DesiredAccess;                      //权限,我们自己控制__in ACCESS_MASK  OriginalDesiredAccess;                   //原始权限__in PVOID  SourceProcess;                           //拷贝句柄的时候,源对象指针.__in PVOID  TargetProcess;                           //目的对象指针.
} OB_PRE_DUPLICATE_HANDLE_INFORMATION, * POB_PRE_DUPLICATE_HANDLE_INFORMATION;

 

结构体看着挺多,其实挺简单的.

 

三丶给软件添加权限保护代码.

代码直接拷贝编译就可以.我是使用的 WDK7600. 因为没有硬编码的方式.所以高版本WDK只要支持这些函数.就可以编译.

 

#include <ntddk.h>   //很多驱动的结构体函数的声明呀.都包含在这里面
#include <ntdef.h>#include <wdm.h>NTKERNELAPI
NTSTATUS
PsLookupProcessByProcessId(
__in HANDLE ProcessId,
__deref_out PEPROCESS *Process
);PVOID g_pRegistrationHandle;NTKERNELAPI
UCHAR * PsGetProcessImageFileName(__in PEPROCESS Process);EXTERN_C void InstallHook();
OB_PREOP_CALLBACK_STATUS  ObjectPreCallback(__in PVOID  RegistrationContext,
__in POB_PRE_OPERATION_INFORMATION  OperationInformation);OB_PREOP_CALLBACK_STATUS  ObjectPreCallback(__in PVOID  RegistrationContext,
__in POB_PRE_OPERATION_INFORMATION  OperationInformation)
{PEPROCESS Process;
UCHAR *pszImageName = NULL;#define PROCESS_PROTECT 0x1
Process = (PEPROCESS)OperationInformation->Object;
pszImageName = PsGetProcessImageFileName(Process);if (strstr(pszImageName, "calc") != NULL)
{if (OperationInformation->Operation == OB_OPERATION_HANDLE_CREATE){if((OperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess &PROCESS_PROTECT) == PROCESS_PROTECT){OperationInformation->Parameters->CreateHandleInformation.DesiredAccess&= ~PROCESS_PROTECT;}}if (OperationInformation->Operation == OB_OPERATION_HANDLE_DUPLICATE){if((OperationInformation->Parameters->DuplicateHandleInformation.OriginalDesiredAccess &PROCESS_PROTECT) == PROCESS_PROTECT){OperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess &=~PROCESS_PROTECT;}}}
return OB_PREOP_SUCCESS;
}void InstallHook()
{NTSTATUS status;OB_CALLBACK_REGISTRATION obReg;OB_OPERATION_REGISTRATION obOper;DbgPrint("begin protect calc");obOper.ObjectType = PsProcessType;obOper.Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;obOper.PreOperation = NULL;obOper.PostOperation = NULL;RtlInitUnicodeString(&obReg.Altitude, L"60000");obReg.Version = OB_FLT_REGISTRATION_VERSION;obReg.OperationRegistrationCount = 1;obReg.RegistrationContext = NULL;obOper.PreOperation = (POB_PRE_OPERATION_CALLBACK)&ObjectPreCallback; obReg.OperationRegistration = &obOper;status = ObRegisterCallbacks(&obReg, &g_pRegistrationHandle);DbgPrint("begin protect calc end");
}VOID  DriverUnLoad(PDRIVER_OBJECT pDriverObject);
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath)
{pDriverObject->DriverUnload = DriverUnLoad;DbgPrint("Load Driver Sucess");//InstallHook();
    InstallHook();//设置通讯的方式return STATUS_SUCCESS;
}//驱动卸载

VOID  DriverUnLoad(PDRIVER_OBJECT pDriverObject)
{ObUnRegisterCallbacks(g_pRegistrationHandle);DbgPrint("Unload MyDrive\n");
}

 

 

通过上面的代码,我们的计算器则会被保护.那么此时我们编译之后安装驱动那么软件就和刚开始那样,不能进行关闭进程了.

你如果关闭计算器,重新打开则打开不了了, 

如果你启动计算器之后,在安驱动,那么计算机就同上图所示,关闭不了了.

 

 

 四丶去掉保护.

去掉保护,那么我们就要逆向 设置对象回调的这个API了.

那么简单的演示则是用PChunter去掉.我们的程序就可以关闭了.

如果有时间,则逆向一下,找到数组. 找到表,抹掉即可.

去掉之后则可以退出了. 包括xxx杀毒.

 

代码下载地址: WDK7600 + Notepad++ +x64Check编译. 你可以使用Free编译.我没用.

链接:https://pan.baidu.com/s/1JDBnsznailhCw513pKsbsQ
提取码:3uhq

转载于:https://www.cnblogs.com/iBinary/p/8401469.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jpql hql_无需部署即可测试JPQL / HQL

jpql hql您是否曾经想在不完全部署应用程序的情况下测试JPQL / HQL&#xff1f; 我们今天在这里看到的是适用于任何JPA实现的简单解决方案&#xff1a;Hibernate&#xff0c;OpenJPA&#xff0c;EclipseLink等。 这篇文章中找到的基本源代码来自本书&#xff1a;“ Pro JPA 2&a…

eclipse 代码上传github 笔记

第一步 先share project 如图所示 第二步 如果所示 第三步 点击 下面的create 然后点击完成 第四步提交 第五步&#xff1a; 第六步&#xff1a; 转载于:https://www.cnblogs.com/a8457013/p/8410471.html

Keycloak SSO集成到jBPM和Drools Workbench中

介绍 单一登录&#xff08;SSO&#xff09;和相关令牌交换机制正在成为Web上不同环境中进行身份验证和授权的最常见方案&#xff0c;尤其是在迁移到云中时。 本文讨论了Keycloak与jBPM或Drools应用程序的集成&#xff0c;以便使用Keycloak上提供的所有功能。 Keycloak是用于浏…

接口 java性能_接口测试性能测试

接口测试 接口测试是测试系统组件间接口的一种测试&#xff0c;主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 原理 通过测试程序模拟客户端向服务…

Redis 小结

一、redis简介 redis是一款基于C语言编写的&#xff0c;开源的非关系型数据库&#xff0c;由于其卓越的数据处理机制&#xff08;按照规则&#xff0c;将常用的部分数据放置缓存&#xff0c;其余数据序列化到硬盘&#xff09;&#xff0c;大家也通常将其当做缓存服务器来使用。…

NetBeans Java EE技巧#1 –数据库中的实体类

NetBeans IDE是开发各种应用程序的绝佳选择。 具体来说&#xff0c;我每天都使用它来开发和维护Java EE应用程序。 在过去的几个发行版中&#xff0c;不仅Java EE的生产力提高了&#xff0c;而且NetBeans IDE还减少了开发应用程序的时间……使Java EE和NetBeans成为绝配&#x…

asp mysql添加数据_ASP:ado.net 实例向数据库添加数据。

我在这使用的是老师给的数据库1&#xff0c;web窗体设计。设计添加图书窗体&#xff0c;窗体属性有图书种类(下拉列表框控件)&#xff0c;图书名称&#xff0c;作者&#xff0c;编号&#xff0c;出版社&#xff0c;价格均为文本框&#xff0c;日期(第三方日期控件)&#xff0c;…

spring jmx_JMX和Spring –第1部分

spring jmx这是三篇文章的第一篇&#xff0c;这三篇文章将展示如何通过JMX支持为Spring应用程序赋能。 Maven配置 这是用于设置此示例代码的Maven pom.xml&#xff1a; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/20…

JAVA有percentile函数吗_Python numpy.percentile函数方法的使用

numpy.percentilenumpy.percentile(a, q, axisNone, outNone, overwrite_inputFalse, interpolationlinear, keepdimsFalse) [source]计算沿指定轴的数据的第q个百分位数。返回数组元素的第q个百分点。参数 &#xff1a;a &#xff1a;array_like输入数组或可以转换为数组的…

JS制作日历小事件和数码时钟--JavaScript实例集锦(初学)

运用JS的innerHTML&#xff0c;和for循环实现日历小部件内容和日期的转换。 <!DOCTYPE html> <html> <head><title>日历小部件</title><style type"text/css">*{padding: 0;margin:0;}.tab{width:220px;background: #ccc;height…

Django-认证系统

知识预览 COOKIE 与 SESSION用户认证 回到顶部COOKIE 与 SESSION 概念 cookie不属于http协议范围&#xff0c;由于http协议无法保持状态&#xff0c;但实际情况&#xff0c;我们却又需要“保持状态”&#xff0c;因此cookie就是在这样一个场景下诞生。 cookie的工作原理是&…

使用JBoss Fuse和OpenShift进行Cloud Native Camel骑行

红帽公司最近发布了一个微服务集成工具包&#xff0c;用于在OpenShift v3的Docker和Kubernetes环境中运行我们的微服务。 为了帮助人们更好地理解这一点&#xff0c;我将Rider Auto应用程序迁移到一组微服务中&#xff0c;该应用程序已经存在了一段时间&#xff0c;该应用程序用…

Spark1——介绍

1、Spark是什么 Spark是一个用来实现快速而通用的集群计算的平台。 2、Spark是一个大一统的软件栈 Spark项目包含多个紧密集成的组件。首先Spark的核心是一个对由很多计算任务组成的、运行在多个工作机器或者是一个计算集群上的应用进行调度、分发以及监控的计算引擎。 Spark的…

java按输入顺序输出_java 输入3个数a,b,c,按大小顺序输出的实例讲解

java 输入3个数a,b,c&#xff0c;按大小顺序输出的实例讲解题目&#xff1a;输入3个数a,b,c&#xff0c;按大小顺序输出。代码&#xff1a;import java.util.Scanner;public class lianxi34 {public static void main(String[] args) {Scanner s new Scanner(System.in);Syste…

Java 8中HotSpot选项的改进文档

Oracle的 Java 8 的HotSpot实现中引入的一些小但受欢迎的功能之一是在启动器的文档中添加了许多常见的HotSpot Java启动器 &#xff08; java &#xff09;选项/标志。 过去&#xff0c;即使是对某些相当常见的HotSpot JVM选项也感兴趣的开发人员 &#xff0c;不得不潜在地寻找…

sql server数据库课程设计分析

课题&#xff1a;能源管理收费系统 系统功能的基本要求&#xff1a; &#xff08;1&#xff09;用户基本信息的录入&#xff1a;包括用户的单位、部门、姓名、联系电话、住址 &#xff1b; &#xff08;2&#xff09;用户水、电、气数据的录入&#xff08;每个月的数据的录入&a…

[BZOJ4537][Hnoi2016]最小公倍数 奇怪的分块+可撤销并查集

4537: [Hnoi2016]最小公倍数 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1474 Solved: 521[Submit][Status][Discuss]Description 给定一张N个顶点M条边的无向图(顶点编号为1,2,…,n)&#xff0c;每条边上带有权值。所有权值都可以分解成2^a*3^b的形式。现在有q个询问&…

全新资源素材站源码 功能齐备 界面干净整洁

源码介绍 简单安装说明&#xff1a; 1、整站程序上传后台 2、然后导入数据库文件到数据库&#xff0c; 3、修改conf里面的conf的数据库名字及密码 4、配置伪静态 规则&#xff1a; location ~* \.(htm)$ { rewrite "^(.*)/(.?).htm(.*?)$" $1/index.php?$2…

jBPM和Drools工作台中的用户和组管理

介绍 本文讨论了一项新功能&#xff0c;该功能允许使用集成在jBPM和Drools Workbenches中的直观友好的用户界面来管理应用程序的用户和组。 用户和组管理 在安装&#xff0c;设置和使用此功能之前&#xff0c;本文讨论了一些以前的概念&#xff0c;需要进一步理解才能进一步使…

亿联本科java_厦门亿联2018面试题

一、选择器public class EqTest {public static void main(String[] args) {EqTest e new EqTest();}public EqTest() {String s "Java";String s2 "java";//if (s.equalsIgnoreCase(s2)){System.out.println("相等");} else {System.out.pri…