背景

随着Windows PG保护的出现,过去内核挂钩inline hook的时代逐渐远去,hook OpenProcess的日子也一去不复返了。那么,如果想在Windows操作系统上不那么轻易的被结束掉(这里主要考虑不在r3被结束,都在内核还干不掉你),有没有什么方法?

常见方式

通常情况下如果是在r0,注册一个ObRegisterCallbacks回调,对PROCESS_TERMINATE权限进行限制,就能解决别人调用TerminateProcess结束进程的情况。

if (pOperationInformation->Operation == OB_OPERATION_HANDLE_DUPLICATE)
{if (pOperationInformation->Parameters->DuplicateHandleInformation.OriginalDesiredAccess & PROCESS_TERMINATE)pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess &= ~PROCESS_TERMINATE;if (pOperationInformation->Parameters->DuplicateHandleInformation.OriginalDesiredAccess & PROCESS_DUP_HANDLE)pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess &= ~PROCESS_DUP_HANDLE;
}if (pOperationInformation->Operation == OB_OPERATION_HANDLE_CREATE)
{if (pOperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess & PROCESS_TERMINATE)pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess &= ~PROCESS_TERMINATE;if (pOperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess & PROCESS_DUP_HANDLE)pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess &= ~PROCESS_DUP_HANDLE;
}

但是,对进程的运行原理有个基本了解的同学都知道,进程只是分配了一个'车间'的资源,最后还是线程去工作,结束掉你的线程,你的进程一样说再见,所以还得加上线程的限制,这样别人使用terminateThread也结束不了你的线程。

if (pOperationInformation->Operation == OB_OPERATION_HANDLE_DUPLICATE){ if (pOperationInformation->Parameters->DuplicateHandleInformation.OriginalDesiredAccess & THREAD_TERMINATE)pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess &= ~THREAD_TERMINATE;}if (pOperationInformation->Operation == OB_OPERATION_HANDLE_CREATE){if (pOperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess & THREAD_TERMINATE)pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess &= ~THREAD_TERMINATE;}

上述描述的都是常见进程的保护手段,当然还有一些属性是可以进行修改的,比如THREAD_SUSPEND_RESUME,暂停你的线程,只要把你暂停了,就算没有结束你,你的进程不是一样的没法工作;还有就是PROCESS_VM_OPERATION,修改你的进程内存,制造一个异常,如果进程中没有hand,进程就会崩溃,从而导致进程死掉,当然还有很多的方法。这里不详细的展开,因为这不是本次想叙述的重点。

Win7 窗口进程保护

大多数同学都用过任务管理器,可能有的同学注意到,任务管理有两种结束进程的方式,第一种是在应用程序中去结束任务,这里出现的任务都是窗口程序。

第二种就是在进程中找到对应的进程去结束。

第一种方式和第二种方式有什么区别?通过对taskmgr(任务管理器)的简单逆向,不难发现

任务管理器先调用了endtask,之后在调用 SendMessageTimeoutW往目标窗口发送了一个WM_CLOSE的消息,通知程序关闭窗口(Win10 有一点变更)

关于消息的拦截,这里简单说明一下,不能使用WH_CALLWNDPROC消息钩子去拦截,虽然能够获取到消息,但是这里并不能删除和替换这个消息,这个消息依然会被窗口回调函数所获取。所以这里可以通过替换窗口回调函数过滤掉WM_CLOSE消息,使用GetWindowLongA和SetWindowLongA进行替换。

EndTask的实现

该函数只是将消息发送到csrss进程中

endtask在winsrv.dll中实现,csrss会去加载这个dll。其中需要注意的是ReportHangInternal

ReportHangInternal函数调用WersvcSendMessage,通过rpc的方式,发送异常到\\KernelObjects\\SystemErrorPortReady对象。

\\KernelObjects\\SystemErrorPortReady对象被wersvc.dll所注册,这是windows的一个服务。在服务收到异常的时候会创建一个werfault.exe进程,并且提示你是否立刻结束这个进程(能够到达这里的前提是我们处理了WM_CLOSE消息,此时才会出现异常)

点击立即结束之后werfault.exe进程通过setevent将消息告诉wersvc.dll服务,对应的是svchost进程。

wersvc.dll服务会再次尝试结束掉进程。

最后简单梳理一下流程,taskmgr告诉csrss有一个窗口程序不关闭(当前窗口回调被hook,过滤了WM_CLOSE的消息),csrss接收之后往wersvc服务继续发消息,wersvc创建一个werfault.exe,werfault.exe在创建一个窗口告诉用户是否关闭程序,werfault.exe将结果告诉wersvc,wersvc最后尝试结束进程。

在此次流程中我们只需要先hook窗口的回调函数,接着添加ObRegisterCallbacks回调,处理TerminateProcess和terminateThread就能完成保护。

程序的保护

其实,还有一种方式进行保护,(运行程序的时候记得用管理员身份打开)那就是把当前进程设置为受保护进程,当进程死掉的时候就蓝屏,多的话不说,看下面的代码,其实RtlSetProcessIsCritical的实现也很简单,有兴趣的可以拿ida看一下,但是如果你用任务管理器结束窗口试试看,不会触发蓝屏?(想想为什么,多试试)。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>typedef NTSTATUS(__cdecl* PRTLSETPROCESSISCRITICAL)(IN BOOLEAN NewValue, OUT PBOOLEAN OldValue OPTIONAL, IN BOOLEAN NeedBreaks);BOOLEAN EnableDebugPrivilege()
{HANDLE hToken = NULL;LUID debugPrivilegeValueLuid = { 0 };TOKEN_PRIVILEGES tokenPrivilege = { 0 };if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))return FALSE;if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &debugPrivilegeValueLuid)){CloseHandle(hToken);return FALSE;}tokenPrivilege.PrivilegeCount = 1;tokenPrivilege.Privileges[0].Luid = debugPrivilegeValueLuid;tokenPrivilege.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;if (!AdjustTokenPrivileges(hToken, FALSE, &tokenPrivilege, sizeof(tokenPrivilege), NULL, NULL)){CloseHandle(hToken);return FALSE;}return TRUE;
}BOOLEAN BSODCriticalProtect()
{if (!EnableDebugPrivilege())return FALSE;HMODULE  hNtdllMod = GetModuleHandleA("ntdll.dll");if (!hNtdllMod)return FALSE;PRTLSETPROCESSISCRITICAL pRtlSetProcessIsCritical;pRtlSetProcessIsCritical = (PRTLSETPROCESSISCRITICAL)GetProcAddress(hNtdllMod, "RtlSetProcessIsCritical");if (!pRtlSetProcessIsCritical)return FALSE;NTSTATUS status = pRtlSetProcessIsCritical(TRUE, NULL, FALSE);printf("你结束我你试试  status: %x\n", status);system("pause");status = pRtlSetProcessIsCritical(FALSE, NULL, FALSE);printf("别现在不行 status: %x\n", status);return TRUE;
}int main(void)
{BSODCriticalProtect();system("pause");return 0;
}

关于win7下r3窗口进程保护的一些方式相关推荐

  1. Win7下查看端口进程

    Win7下 Fport 软件不起作用了,还是用命名了: cmd下: C:\Users\cyrus>netstat -nao 活动连接 协议 本地地址          外部地址        状 ...

  2. 教你在64位Win7系统下使用ObRegisterCallbacks内核函数来实现进程保护

    我平时工作很忙,也很少有空闲时间上看雪论坛.我在看雪论坛里面文章发表的很少,几只有几篇,我也很少回答别人的问题.我的很多朋友都这样问我问题:我整理了一下,无非就以下几种问题: (1)怎么样在64位的W ...

  3. Ring3下实现进程保护,不用hook

    今天在分析一款木马的时候,发现做了进程保护,没加驱动,也没做hook,能做进程保护,感觉非常奇怪,原来是这么一回事,mark一下吧! #include "stdafx.h"#inc ...

  4. x64下进程保护HOOK

    目录 x64(32)下的进程保护回调. 一丶进程保护线程保护 1.简介以及原理 1.2 代码 1.3注意的问题 二丶丶回调函数写法 2.1 遇到的问题. 2.2 回调代码 x64(32)下的进程保护回 ...

  5. Win7下连远程桌面 窗口 全屏 切换

    为什么80%的码农都做不了架构师?>>>    今天在win7下用远程桌面,不小心把桌面上面的还原按钮给点到了, 于是整个远程桌面就变成了本地机的一个窗口了,可以看见任务栏的那种 有 ...

  6. win7x64下实现进程保护

    以前没有PG的时候,相信绝大部分人都是用的SSDT HOOK 来进行进程保护的.等有了PG该怎么办呢?答案就是用微软提供的 ObRegisterCallbacks 函数. NTSTATUSObRegi ...

  7. Win7下Android开发环境搭建(8.19,8.24,9.30,10.21)

    [2013-10-21 20:06:55 - L9ThreeGong] Unable to resolve target 'android-10' [ 意思就是没有找到android_10,这里的10 ...

  8. 使用iso文件安装双系统linux,Win7下使用EasyBcd安装Ubuntu(iso文件)双系统

    Win7下使用EasyBcd安装Ubuntu(iso文件)双系统 一.准备工作(在win7下操作完成) 1.从官网www.ubuntu.com上下载镜像文件,大小接近700M. 2.下载并安装easy ...

  9. 进程隐藏与进程保护(SSDT Hook 实现)(三)

    文章目录: 1. 引子: 2. 获取当前系统下所有进程: 3. 服务管理(安装,启动,停止,卸载): 4. 应用程序和内核程序通信: 5. 小结: 1. 引子: 关于这个 SSDT Hook 实现进程 ...

最新文章

  1. tornado缓存技术
  2. PL/SQL 存储过程学习2 条件语句
  3. ActivityGroup 实现分页和自定义标签(内有GridView的点击背景样式的改变方法)
  4. 深入探究Spark -- Cluster Manger部署(最常用为YARN实现Task Scheduler)
  5. 开机显示c:\windows\windows32\config\system文件损坏或丢失的解决方法(收集)
  6. Web安全之Cookie劫持
  7. 微信淘宝等平台要互通!?腾讯阿里字节回应
  8. recycleviewitem 列表加载动画_2019年Q4动画数据报告 | 伍六七之最强发型师评论数破十万...
  9. 【重点 递归 动态规划 正则表达式匹配】LeetCode 10. Regular Expression Matching
  10. 使用Navicat for MySQL设置定时备份数据库和数据恢复
  11. Eclipse环境搭建-scala
  12. 分享抖音上热门技巧!短视频涨粉+运营攻略!
  13. EXcel用法——如何冻结前两行,如何删除筛选的行
  14. 英语单词听力测试软件,英语单词发音软件
  15. 212.样本量和测序深度的Alpha多样性稀释曲线
  16. 绿色软件在Windows10中设置开机自启方法
  17. windows 查看端口号
  18. JavaScript-function函数
  19. Cesium之鼠标事件绑定和移除
  20. android 苹果 换机,苹果12怎么一键换机安卓?iPhone12一键换机功能操作步骤

热门文章

  1. git本地无法上传到远程的问题解决方法
  2. 生产者消费者问题——管程法
  3. python使用pandas读取excel绘制柱状图,折线图,饼状图
  4. 低代码,虽然有点毒瘤,但管用就好
  5. android手机 无电池开机,手机无法开机的6种解决方法
  6. gps芯片接收GPS数据分析
  7. Introducing Swift(Swift介绍及其API)
  8. 【CentOS】CentOS7最小安装版 VMware Tools安装
  9. excel文件需要双击两次才能打开,解决方案
  10. 2014儒豹浏览器的前行之路