我平时工作很忙,也很少有空闲时间上看雪论坛。我在看雪论坛里面文章发表的很少,几只有几篇,我也很少回答别人的问题。我的很多朋友都这样问我问题:我整理了一下,无非就以下几种问题:
(1)怎么样在64位的Windows7操作系统下实现进程保护? 
(2)我在网络上搜索了很多天,我根本就找不到64位进程保护的文章啊!
(3)公司的项目很急,领导让我实现64位系统下的进程保护,这要怎么做啊?
(4)为什么网络上给的文章都是32位的啊?
(5)为什么64位的Windows系统不能Hook SSDT啊?

本文是在Windows 7的64位操作系统下来实现进程保护。 这里只给出核心代码的实现方式,用来保护Calc.exe(计算器)程序,不能够被任务管理器来结束。

很多时候,网络上的进程保护例子都是针对Windows 的32位操作系统的, 基本上也都是告诉你如何Hook SSDT。 进程保护的实现,快而有效的方法基本上都是去Hook ZwTerminateProcess或者ZwOpenProcess等。 而这些技术都被人用烂了。你知道的,在百度或Google上随便一搜索Hook SSDT这样的关键字,就会出来非常多的文章告诉你怎样做。

我这里要告诉大家的是: 如何在 64位的Windows系统上保护进程,使得进程不被Windows自带的任务管理器给结束掉。

我们知道,在64位的Windows7系统下,驱动程序要有数字证书必须要签名, 并且驱动程序不能够去Hoook SSDT、GDT等等 ,因为这会引发BSOD, 其根本原因就是PatchGuard组件在保护着64位操作系统的内核。

首先,我们一起来看一看WDK文档里面对ObRegisterCallbacks()的主要描述:

The ObRegisterCallbacks routine registers a list of callback routines for thread and process handle operations.

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

CallBackRegistration 
A pointer to an OB_CALLBACK_REGISTRATION structure that specifies the list of callback routines and other registration information.

RegistrationHandle 
A pointer to a variable that receives a value that identifies the set of registered callback routines. The caller passes this value to the ObUnRegisterCallbacks routine to unregister the set of callbacks.

我们可以看见,有一个对应的ObUnRegisterCallbacks函数,以及其他的说明。

其实保护进程,也就是修改结构体POB_PRE_OPERATION_INFORMATION里面对应的成员值了。

在代码中一般都是:

PVOID obHandle;//定义一个void*类型的变量,它将会作为ObRegisterCallbacks函数的第2个参数。

NTSTATUS ProtectProcess(BOOLEAN Enable)
{
  
  OB_CALLBACK_REGISTRATION obReg;
  OB_OPERATION_REGISTRATION opReg;

memset(&obReg, 0, sizeof(obReg));
  obReg.Version = ObGetFilterVersion();
  obReg.OperationRegistrationCount = 1;
  obReg.RegistrationContext = NULL;
  RtlInitUnicodeString(&obReg.Altitude, L"321000");

memset(&opReg, 0, sizeof(opReg)); //初始化结构体变量

//下面 请注意这个结构体的成员字段的设置
  opReg.ObjectType = PsProcessType;
  opReg.Operations = OB_OPERATION_HANDLE_CREATE|OB_OPERATION_HANDLE_DUPLICATE;

opReg.PreOperation = (POB_PRE_OPERATION_CALLBACK)&preCall; //在这里注册一个回调函数指针

obReg.OperationRegistration = &opReg; //注意这一条语句

return ObRegisterCallbacks(&obReg, &obHandle); //在这里注册回调函数
}

现在好了,到这里为止,我们已经用上了ObRegisterCallbacks函数了。事情有了一个好的开始,接着马上就要讲实现了。 在这里,我希望你再次打开WDK帮助文档,当然还是有关ObRegisterCallbacks函数的帮助。
我们首先注意上面代码的一条语句:
opReg.PreOperation = (POB_PRE_OPERATION_CALLBACK)&preCall; //在这里注册一个回调函数指针

我们在WDK帮助文档里面找到有关结构体OB_OPERATION_REGISTRATION的说明。我们在这个结构体里面找到 PreOperation结构体成员变量的帮助说明:

PreOperation 
A pointer to an ObjectPreCallback routine. The system calls this routine before the requested operation occurs.

我们不需要使用另外一个 成员变量--PostOperation 
PostOperation 
A pointer to an ObjectPostCallback routine. The system calls this routine after the requested operation occurs.

PostOperation成员不是我们关心的,我们不去讨论它。

好了,这下,你找到了 PreOperation的用法说明了。我们知道了PreOperation是一个函数指针,我们的进程保护程序就在这个函数指针里面进行。
我们再回过头来看上面的程序代码,ProtectProcess函数的实现。 我们刚才就注意到了opReg.PreOperation = (POB_PRE_OPERATION_CALLBACK)&preCall;
现在,我们来实现 preCall函数,代码如下:

OB_PREOP_CALLBACK_STATUS 
preCall(PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION pOperationInformation)
{
   HANDLE pid = PsGetProcessId((PEPROCESS)pOperationInformation->Object);
char szProcName[16]={0};
   UNREFERENCED_PARAMETER(RegistrationContext);
   strcpy(szProcName,GetProcessNameByProcessId(pid));
   if( !_stricmp(szProcName,"calc.exe") )
    {
        if (pOperationInformation->Operation == OB_OPERATION_HANDLE_CREATE)
        {
            if ((pOperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess & PROCESS_TERMINATE) == PROCESS_TERMINATE)
            {
                pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess &= ~PROCESS_TERMINATE;
            }
            if ((pOperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess & PROCESS_VM_OPERATION) == PROCESS_VM_OPERATION)
            {
                pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess &= ~PROCESS_VM_OPERATION;
            }
            if ((pOperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess & PROCESS_VM_READ) == PROCESS_VM_READ)
            {
                pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess &= ~PROCESS_VM_READ;
            }
            if ((pOperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess & PROCESS_VM_WRITE) == PROCESS_VM_WRITE)
            {
                pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess &= ~PROCESS_VM_WRITE;
            }
        }
    }
   return OB_PREOP_SUCCESS;
}

还有,在驱动卸载的时候,要调用ObUnRegisterCallbacks函数。像这样:
VOID 
Unload(IN PDRIVER_OBJECT DriverObject)
{
  UNREFERENCED_PARAMETER(DriverObject);
  DbgPrint("driver unloading...\n");

ObUnRegisterCallbacks(obHandle); //obHandle是上面定义的 PVOID obHandle;
}

代码就这样吗? 是的,这样就可以实现进程保护了。

另外,还需要注意绕过MmVerifyCallbackFunction函数
你只要在百度或Google上,搜索关键字-----绕过MmVerifyCallbackFunction。这会出来很多的文章供你参考。

NTSTATUS status = STATUS_SUCCESS;
  PLDR_DATA ldr;

// 绕过MmVerifyCallbackFunction。
  ldr = (PLDR_DATA)DriverObject->DriverSection;
  ldr->Flags |= 0x20;

教你在64位Win7系统下使用ObRegisterCallbacks内核函数来实现进程保护相关推荐

  1. Win764位系统下使用ObRegisterCallbacks内核函数来实现进程保护

    先发代码 参考了: https://bbs.pediy.com/thread-200048.htm forwardbob https://bbs.pediy.com/thread-168023-1.h ...

  2. 64位win7系统下安装USB下载器驱动FriendlyArm-usb-dnw-driver-的解决方案

    用win7+64位系统是没有友善之臂的usb驱动的,貌似是有国外给2440写过一个驱动,国外的一位高人给出了很巧妙的方法,我自己使用2440测试,是可以使用的. 其中是两个文件,基本思想是这样的,有一 ...

  3. win7 php mysql apache 64_教你在64位win7体系中设备apache+mysql+php情况.doc

    教你在64位win7体系中设备apache+mysql+php情况.doc 还剩 4页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 在 DOS 命令提 ...

  4. 计算机是否支持64位操作系统,教你查看自己的电脑是否支持64位win7系统的方法...

    问:我想要安装windows7的64位系统,但是听说有的电脑并不能装64位系统,不知道自己的电脑是否支持64位win7系统,能不能告诉我要如何查看自己的电脑是否支持64位win7系统呢? 答:如果电脑 ...

  5. 手把手教你在64位Win7下部署16位汇编学习环境

    实现方式是VirtualBox虚拟机+精简的32位xp系统.指导小白用,高手就直接跳过吧. 一.背景 初学者学习汇编语言通常是从16位汇编开始,但是现在的64位Win7系统明确表示不支持16位的程序. ...

  6. matlab 2010 win7 64位,64位WIN7系统怎么安装Matlab2010

    MATLAB时非常有用的工具软件,工作学习都离不开开,那么64位WIN7系统怎么安装Matlab2010呢?小编为大家分享了64位WIN7系统安装Matlab2010的方法,下面大家跟着学习啦小编一起 ...

  7. 解决32位Eclipse和64位Eclipse在64位win7系统上运行问题

    转载自:http://www.th7.cn/system/win/201407/63747.shtml 问题产生原因: 我的系统是64位win7系统,装的JDK也是64位,Eclipse也是64位版本 ...

  8. 64位Win7环境下,C#无法打开osk.exe解决方法

    64位Win7环境下,C#无法打开osk.exe,但是用cmd窗口明明可以正常打开osk.exe.将C#程序放在32位系统中,发现程序执行正常.网上搜索,没有找到解决方案. 经过实验,采用下面方法解决 ...

  9. OpenCV在64位Win7系统上开发环境的永久配置

    前言 唉,在忙毕设的事儿,好久没来耕耘了,地都荒了,,= = 最近因为要做毕设,要用到Opencv,所以就开始学了,查了一些网上的资料,就打算把从OpenCV的安装到新建OpenCV项目的步骤,完整的 ...

最新文章

  1. Json的序列化和反序列化
  2. Android 统一View样式,textview样式
  3. boost官方文档同步机制Synchronization mechanisms overview
  4. 微软 SQL Server 2016 迁移技术培训实验营
  5. android swf 文件播放器,swf播放器怎么用?swf播放器安卓版使用教程
  6. ajax的Provisional headers are shown
  7. 单片机8位共阴极数码管0~99自增
  8. php 数组 批量替换字符串,php数组替换字符串
  9. ADS designguide无法使用解决办法
  10. 20180301.实现功能:取消关注,移除粉丝
  11. matlab - 特殊矩阵、矩阵求值、稀疏矩阵
  12. WIN10系统中RSLink Classic用RS232连接PLC无法连接
  13. 零基础学习UI设计需要多长时间
  14. 压力传感器、称重传感器、电子秤模块-HX711人体称重模块应用及原理
  15. 测试opencl软件,OpenCL应用测试
  16. 怎样下载百度爱采购的图片
  17. 小米回应“被意大利机构罚款2176万元”;Win 12要来?曝微软调整Windows迭代节奏;Vite 3.0 发布|极客头条
  18. 【考研经验】2019年上岸同济大学软件学院考研择校/初试/复试经验分享!
  19. Android模糊搜索框实现
  20. 手机识别文字的软件有哪些?这有3个简单易用的软件

热门文章

  1. 获取节点及元素的代码
  2. [洛谷P2057][SHOI2007]善意的投票
  3. InfoQ专访网易云陈谔:用微服务体系满足企业数字化转型需求
  4. 2017-2018-2 20179209《网络攻防》第六周作业
  5. 演讲:创新思维框架(2016/北京/国家会议中心)
  6. 【51CTO学院三周年】写给自己的51cto
  7. SystemCenter2012SP1实践(16)私有云的第一个模板
  8. Go语言 goroutine
  9. 简单的实现购物车功能,还有不到位的地方,加油!!!
  10. js实现禁止右键 禁止f12 查看源代码