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

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

  1. 64位内核第一讲,和32位内核的区别

    64位内核第一讲,和32位内核的区别 双击调试配置请查看 连接: https://www.cnblogs.com/aliflycoris/p/5877323.html 一丶编译的区别. 首先,还是使用 ...

  2. linux 进程映射空间 libc,为什么不能在64位内核的32位Linux进程中映射(MAP_FIXED)最高虚拟页面?...

    尝试测试时是否允许访问跨越x86中零边界的内存?在Linux的用户空间中,我编写了一个32位测试程序,该程序试图映射32位虚拟地址空间的低和高页. 之后echo 0 | sudo tee /proc/ ...

  3. android5.1内核版本,Android-x86现已基于5.1.1 Lollipop:支持UEFI和64位内核

    由于采用了Linux 4.0.9内核,Android-x86 5.1 RC1也是首个支持64位内核的版本.此外,它还支持多点触控.UEFI启动.蓝牙.摄像头.以太网(仅HDCP).Wi-Fi.音频.以 ...

  4. mac开启64位内核

    sudo nvram boot-args="arch=x86_64" 查看是否是64位: 桌面左上角的小苹果,关于本机,更多信息,软件,64位内核,开启 在终端输入上面的命令就能开 ...

  5. AIX 64位内核与32位内核区别

    Q:怎么确定机器会运行 64 位内核?  A:运行 64 位内核要求 64 位硬件.对于 AIX 5.2,所有 IBM eServer pSeries 64 位硬件都能运行 64 位或 32 位内核. ...

  6. 16位汇编语言第二讲系统调用原理,以及各个寄存器详解

    16位汇编语言第二讲系统调用原理,以及各个寄存器详解 昨天已将简单的写了一下汇编代码,并且执行了第一个显示到屏幕的helloworld 问题? helloworld怎么显示出来了. 一丶显卡,显存的概 ...

  7. 1g的树莓派4b能做什么_树莓派4B(Raspbian)切换64位内核+简单性能测试

    首先说明两点: 1.目前来看来看(20200108测试,基于Raspbian 2019-09-26),是没有什么卵用的,切换之后性能不增反降,且软件兼容性不能得到保证. 2.教程来源于贴吧大佬,感谢大 ...

  8. 64位内核第三讲,Windbg的使用.以及命令

    目录 一丶驱动的调试. 1.线程 2.断点 3.内存查看命令 4.修改内存命令 5.栈相关操作命令 6.进程线程命令(内核命令) 一丶驱动的调试. 编写驱动免不了调试.所以这里介绍一下WinDbg的常 ...

  9. win7 64位 内核安全_Win7进入死亡倒计时,全国一半电脑要遭殃?

    你还在XP么? 曾经,月月鸟以为2010年还很遥远,没想到已经过去10年了.也以为2020年遥不可及,却忽然发现还有10天不到了. 除了青春外,似乎有些东西我们不能带到下一个10年. 没错,那就是Wi ...

最新文章

  1. Photoshop 混色模式学习
  2. Java 8 Lambda 表达式解析
  3. 深度学习(八)——fine-tuning, 李飞飞
  4. Android:DELETE_FAILED_INTERNAL_ERROR Error while Installing APKs
  5. 中小学招生强化就近入学;首次全女性太空行走取消;苹果付费新闻APP奔溃;NASA火星上发现鹅卵石;这就是今天的大新闻...
  6. WIN32 串口发送数据
  7. 电商促销海报PSD分层模板|创意合成,这样的设计越来越吃香!
  8. centos卸载不必要的程序_在RHEL / CentOS 7上禁用和删除不需要的服务最小安装
  9. swift的设计原则_iPhone12 的UI设计规范如何做?
  10. “技术需求”与“技术成果”项目之间关联度计算模型top1
  11. 19.docker attach
  12. 在termux中利用安卓的vulkan库加速NCNN
  13. jQuery京剧人物动画
  14. html自动写对联,html中的对联代码
  15. onenote打开闪退平板_win10系统下OneNote打不开或闪退怎么解决
  16. linpack测试软件,标准Linpack测试详细指南.pdf
  17. c语言动态开辟数组(一维与二维)
  18. 【每日三省吾身】常见Web漏洞基本原理
  19. 画直方图(hist)
  20. error: insufficient permission for adding an object...

热门文章

  1. java plus方法_Java.math.BigDecimal.plus()方法实例
  2. 计算机管理没有打印机列队,在Windows清除打印队列如果打印机被卡住,也没有打印输出...
  3. html监控用户在线与离线,HTML5判断设备在线离线及监听网络状态变化例子
  4. 双屏全屏跳回到主屏_双屏笔记本了解下?剪视频不要太好使
  5. C语言源代码展示:常用转换函数实现原理
  6. C语言学习趣事_你不知道的C语言应用
  7. mysql 排序 过滤_【MYSQL】-3 排序与过滤
  8. java向指定文件继续写内容_java 向指定文件写入内容(如文件存在,则先删除再创建;写入如目录不存在,则创建)...
  9. mysql密码高级_mysql高级操作
  10. python服务器搭建 实战_实战讲解:如何用Python搭建一个服务器