Windows安全中心(病毒和威胁防护)的注册

文章目录

  • Windows安全中心(病毒和威胁防护)的注册
    • 1. 简介
    • 2. WSC注册初探
    • 3. WSC注册原理分析
    • 4. 关于AMPPL
    • 5. 参考

Windows安全中心(病毒和威胁防护)的注册

本文我们来分析一下Windows安全中心(Windows Security Center简称WSC)的注册原理,以及其中的一些比较有意思的技术性问题。

1. 简介

通常情况下,如果我们安装了一些第三方的安全软件之后,就会接管Windows的安全服务(Windows Defender);这里主要的原因大概是防止系统安全软件太多,导致Windows性能下降。可以看到如下:
在这里插入图片描述

以火绒为例,可以看到当系统安装了火绒安全软件之后,在Windows 安全中心的病毒和威胁防护就可以看到注册的安全软件信息了。

当系统注册了第三方安全软件之后,Windows Defender防病毒服务就停止了;这是Windows为第三方安全软件提供的一个入口,但是目前市面上很大安全软件还比不上Windows自带的Defender,也是比较讽刺。

那么怎么样才能将自己的安全软件注册到Windows安全中心呢?大致的步骤如下:

  1. 成为MVI会员。
  2. 微软提供一个内部的私有接口。
  3. 提供相关签名证书。

通过上面流程,我们就可以开发自己的安全软件,并且将自己的安全软件注册到WSC种。那么有没有办法可以绕过上面这些呢?这就是本文需要分析的技术性知识点。

2. WSC注册初探

WSC如果被注册成功之后,可以通过命令get-wmiObject -namespace root\SecurityCenter2 -class AntiVirusProduct来查询相关信息,结果如下:

> get-wmiObject  -namespace root\SecurityCenter2 -class AntiVirusProduct__GENUS                  : 2
__CLASS                  : AntiVirusProduct
__SUPERCLASS             :
__DYNASTY                : AntiVirusProduct
__RELPATH                : AntiVirusProduct.instanceGuid="{D68DDC3A-831F-4fae-9E44-DA132C1ACF46}"
__PROPERTY_COUNT         : 6
__DERIVATION             : {}
__SERVER                 : DESKTOP-1SIKOAK
__NAMESPACE              : ROOT\SecurityCenter2
__PATH                   : \\DESKTOP-1SIKOAK\ROOT\SecurityCenter2:AntiVirusProduct.instanceGuid="{D68DDC3A-831F-4fae-9E44-DA132C1ACF46}"
displayName              : Windows Defender
instanceGuid             : {D68DDC3A-831F-4fae-9E44-DA132C1ACF46}
pathToSignedProductExe   : windowsdefender://
pathToSignedReportingExe : %ProgramFiles%\Windows Defender\MsMpeng.exe
productState             : 393472
timestamp                : Tue, 17 Dec 2024 02:37:41 GMT
PSComputerName           : DESKTOP-1SIKOAK__GENUS                  : 2
__CLASS                  : AntiVirusProduct
__SUPERCLASS             :
__DYNASTY                : AntiVirusProduct
__RELPATH                : AntiVirusProduct.instanceGuid="{4C17E7AE-043A-D732-91B8-D139C9EB6B26}"
__PROPERTY_COUNT         : 6
__DERIVATION             : {}
__SERVER                 : DESKTOP-1SIKOAK
__NAMESPACE              : ROOT\SecurityCenter2
__PATH                   : \\DESKTOP-1SIKOAK\ROOT\SecurityCenter2:AntiVirusProduct.instanceGuid="{4C17E7AE-043A-D732-91B8-D139C9EB6B26}"
displayName              : 火绒安全软件
instanceGuid             : {4C17E7AE-043A-D732-91B8-D139C9EB6B26}
pathToSignedProductExe   : C:\Program Files\Huorong\Sysdiag\bin\wsctrlsvc.exe
pathToSignedReportingExe : C:\Program Files\Huorong\Sysdiag\bin\wsctrlsvc.exe
productState             : 266240
timestamp                : Tue, 17 Dec 2024 02:37:36 GMT
PSComputerName           : DESKTOP-1SIKOAK

在这里可以看到有两个类信息:

  1. Windows Defender表示默认的Windows Defender。
  2. 火绒安全软件表示火绒。

这里可以看到一个非常重要的信息,WSC注册的进程为C:\Program Files\Huorong\Sysdiag\bin\wsctrlsvc.exe

那么我们就可以请出IDA和调试神器WINDBG来分析和调试一下WSC注册的原理。

3. WSC注册原理分析

由于我们需要成为MVI会员之后,才能有相关私有SDK文档,这里我们就分析一下wsctrlsvc.exe这个程序,大致看一下私有SDK是怎么使用的。

我们可以看到WSC相关的主要文件有如下几个:

  1. wscisvif.dll这个是WSC客户端的接口提供DLL。
  2. wscapi.dll这个是WSC客户端的核心DLL。
  3. wscsvc.dll这个是WSC的核心服务DLL。

可以看到私有SDK就是对wscisvif.dll未公开的SDK的调用,我们可以对这些使用接口进行分析,可以看到核心接口如下:

virtual long _IWscAVStatus4<class CWscIsv>::Register(unsigned short *, unsigned short *, int, int)
virtual long _IWscAVStatus4<class CWscIsv>::Unregister(void)
virtual long _IWscAVStatus4<class CWscIsv>::UpdateStatus(enum  _WSC_SECURITY_PRODUCT_STATE, int)
virtual long _IWscAVStatus4<class CWscIsv>::InitiateOfflineCleaning(unsigned short *, unsigned short *)
virtual long _IWscAVStatus4<class CWscIsv>::NotifyUserForNearExpiration(unsigned long)

可以发现核心接口就是如下三个:

  1. Register注册WSC产品。
  2. Unregister反注册WSC产品。
  3. UpdateStatus更新产品的状态。

根据这些分析我们就可以自己向Windows安全中心注册自己的安全软件了,例如可以如下(这里注册了一个我的安全软件产品):
在这里插入图片描述

4. 关于AMPPL

通过上面的分析,我们成功向Windows安全中心注册了自己的安全软件,但是在某些情况下可能会失败,并且Register返回的结果为0x800704dc;这就是AMPPL安全检测导致的结果。

我们分析s_wscRegisterSecurityProduct函数,可以导致得到如下的判断:

if ( type == SECURITY_PRODUCT_TYPE_ANTIVIRUS )
{ValidateCallerAMPPL((int *)&v34, a1, L"s_wscRegisterSecurityProduct", a3, a4);v12 = (unsigned int)v34;if ( (_DWORD)v34 )goto Exit1;
} 

ValidateCallerAMPPL这个函数就是检测AMPPL的,大致检测的结果如下:

v12 = NtQueryInformationProcess(v9,  61, &v15, 1);
if ( (unsigned __int8)((v15.Level & 7) - 1) > IsAm1PPL || (v15.Level & 0xF0) != 0x30 )IsAmPPL = 0;

也就是说我们需要检测进程AMPPL的标记,通过NtQueryInformationProcess查询ProcessProtectionInformation,改查询得到的结构体信息如下:

typedef enum _PS_PROTECTED_SIGNER
{PsProtectedSignerNone = 0,PsProtectedSignerAuthenticode = 1,PsProtectedSignerCodeGen = 2,PsProtectedSignerAntimalware = 3,PsProtectedSignerLsa = 4,PsProtectedSignerWindows = 5,PsProtectedSignerWinTcb = 6,PsProtectedSignerMax = 7
} PS_PROTECTED_SIGNER;typedef enum _PS_PROTECTED_TYPE
{PsProtectedTypeNone = 0,PsProtectedTypeProtectedLight = 1,PsProtectedTypeProtected = 2,PsProtectedTypeMax = 3
} PS_PROTECTED_TYPE;typedef union _PS_PROTECTION
{UCHAR Level;struct{int Type : 3;int Audit : 1;int Signer : 4;} Flags;
} PS_PROTECTION, *PPS_PROTECTION;

这些结构体字段中Type含义如下:

  • PsProtectedTypeNone (0) - the process is not running as protected.

  • PsProtectedTypeProtectedLight (1) - the process is running as light-protected (PPL).

  • PsProtectedTypeProtected (2) - the process is running as fully-protected.

Signer字段的含义如下:

  • PsProtectedSignerNone (0) - the process has no signature that grants it protection.

  • PsProtectedSignerAuthenticode (1) - the process has an Authenticode signature.

  • PsProtectedSignerCodeGen (2) - the process has a Code Generation signature.

  • PsProtectedSignerAntimalware (3) - the process has an Antimalware signature.

  • PsProtectedSignerLsa (4) - the process has an LSA signature.

  • PsProtectedSignerWindows (5) - the process has a Windows signature.

  • PsProtectedSignerWinTcb (6) - the process has a WinTCB (trusted computer base) signature.

  • PsProtectedSignerWinSystem (7) - the process has a WinSystem signature.

  • PsProtectedSignerApp (8) - the process has a Store Application signature.

在进程启动的时候,内核会更加启动进程是否有签名(或者签名的类型)来设置相关值,流程为:

NtCreateUserProcess --> SeQuerySigningPolicy

这里似乎看起来又比较麻烦了,因为需要防病毒MVI相关证书才行。这里NtQueryInformationProcess查询的是EPROCESS中的字段的值,我们只要想办法修改这些值就可以了,例如我们可以将我们自己的进程EPROCESS修改为如下:

kd> dx -id 0,0,94040040 -r1 (*((ntkrpamp!_PS_PROTECTION *)0x940403a6))
(*((ntkrpamp!_PS_PROTECTION *)0x940403a6))                 [Type: _PS_PROTECTION][+0x000] Level            : 0x31 [Type: unsigned char][+0x000 ( 2: 0)] Type             : 0x1 [Type: unsigned char][+0x000 ( 3: 3)] Audit            : 0x0 [Type: unsigned char][+0x000 ( 7: 4)] Signer           : 0x3 [Type: unsigned char]

这样我们就可以完成ValidateCallerAMPPL这个函数的检测了,WSC也完全正常注册了。

5. 参考

WSC本来就是一个私有的接口文档,参考资料也非常少,下面是网上相关的一些参考文章:

  1. https://bbs.kanxue.com/thread-282498.htm
  2. https://github.com/m417z/ntdoc/blob/main/descriptions/ps_protection.md
  3. https://stackoverflow.com/questions/3698285/how-can-i-tell-the-windows-security-center-that-im-an-antivirus
  4. https://learn.microsoft.com/en-us/defender-xdr/virus-initiative-criteria

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

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

相关文章

[代码随想录21回溯]组合问题,电话号码的字母组合问题

前言 回溯的提出是解决循环问题&#xff0c;回溯的提出就是为了解决排列和组合问题&#xff0c;以及多层遍历问题&#xff0c;因为如果遍历的层数越多我们的效率就会越低&#xff0c;回溯加上剪枝能很好解决这个问题。 题目链接 77. 组合 - 力扣&#xff08;LeetCode&#xff…

二进制分析的新兴趋势:塑造安全的移动应用

在当今快速发展的数字世界中&#xff0c;保障移动应用的安全性变得尤为重要。随着移动技术的广泛应用&#xff0c;安全性需求也日益增强。二进制分析作为确保移动应用安全和合规性的重要手段&#xff0c;通过对已编译的应用进行深入分析&#xff0c;能够发现源代码中难以察觉的…

Python:动态粒子爱心

预览 代码结构概述 这段代码使用了 pygame 库来创建一个动态的图形窗口&#xff0c;绘制一个心形图案&#xff0c;并在其中显示闪烁的文本。代码主要分为以下几个部分&#xff1a; 初始化和设置心形曲线的计算粒子类的定义生成粒子文本设置主循环 1. 初始化和设置 import p…

React源码02 - 基础知识 React API 一览

1. JSX到JavaScript的转换 <div id"div" key"key"><span>1</span><span>2</span> </div>React.createElement("div", // 大写开头会当做原生dom标签的字符串&#xff0c;而组件使用大写开头时&#xff0c;这…

验证的分类及相关工具

目录 1.验证方法的分类1.1动态验证1.2.静态验证 2.动态验证及相关工具2.1.电路级仿真工具2.2.逻辑仿真工具 3.静态验证及相关工具3.1 形式验证工具3.2 静态时序分析工具 SOC设计中验证包含以下几个方面&#xff1a; 验证原始描述的正确性验证设计的逻辑功能是否符合设计规范的要…

【HarmonyOs学习日志(14)】计算机网络之域名系统DNS

域名系统DNS 域名系统DNS——从域名解析出IP地址 文章目录 域名系统DNS概述域名到IP地址的解析 互联网的域名结构命名标准 域名服务器域名的解析过程 概述 域名系统DNS&#xff08;Domain Name System&#xff09;是互联网使用的命名系统&#xff0c;用来把便于人们使用的机器…

【Python】pandas库---数据分析

大学毕业那年&#xff0c;你成了社会底层群众里&#xff0c;受教育程度最高的一批人。 前言 这是我自己学习Python的第四篇博客总结。后期我会继续把Python学习笔记开源至博客上。 上一期笔记有关Python的NumPy数据分析&#xff0c;没看过的同学可以去看看&#xff1a;【Pyt…

【人工智能学习之HDGCN18关键点修改】

【人工智能学习之HDGCN18关键点修改】 训练部分修改部分 训练部分 请参考文章&#xff1a;【人工智能学习之HDGCN训练自己的数据集】 修改部分 参考源码中25关键点的区域划分&#xff0c;我们将18关键点划分为&#xff1a; 头部&#xff1a; 鼻子左眼和左耳右眼和右耳 上肢…

ARCGIS国土超级工具集1.2更新说明

ARCGIS国土超级工具集V1.2版本&#xff0c;功能已增加至47 个。在V1.1的基础上修复了若干使用时发现的BUG&#xff0c;新增了"矢量分割工具"菜单&#xff0c;同时增加及更新了了若干功能&#xff0c;新工具使用说明如下&#xff1a; 一、勘测定界工具栏更新界址点成果…

华为OD --- 流浪地球

华为OD --- 流浪地球 题目独立实现基本思路代码实现 其他答案实现思路代码实现 题目 独立实现 基本思路 1、首先把题目给出的启动机器初始化成数组, 2、用for循环模拟每隔1s更新这个初始化数组的前后两个机器. (源码中的updateTimeCount函数) 3、for循环每次循环后会检查当前…

DataOps驱动数据集成创新:Apache DolphinScheduler SeaTunnel on Amazon Web Services

引言 在数字化转型的浪潮中&#xff0c;数据已成为企业最宝贵的资产之一。DataOps作为一种文化、流程和实践的集合&#xff0c;旨在提高数据管道的质量和效率&#xff0c;从而加速数据从源头到消费的过程。白鲸开源科技&#xff0c;作为DataOps领域的领先开源原生公司&#xf…

【硬件IIC】stm32单片机利用硬件IIC驱动OLED屏幕

之前操作OLED屏幕都是用GPIO模拟IIC去驱动&#xff0c;最近打算用硬件IIC去驱动&#xff0c;于是写下这个demo,在这个过程中遇到一点小坑&#xff0c;记录一下&#xff0c;本文章非小白教程&#xff0c;所以只突出踩到的坑点&#xff0c;文章中涉及到的OLED也是网上资料写烂的&…

python如何自动加空格

首先&#xff0c;需要进行打开的一个pycharm的软件&#xff0c;可进行双击的打开该软件。 可以看到的是在当前的打开的文件中&#xff0c;格式相对较乱一下。格式不对会格式错误。 然后点击菜单栏中的“code”。 在弹出的下拉菜单中选择“reformat code”选项。 可以看到的是在…

【开源免费】基于SpringBoot+Vue.JS网上订餐系统(JAVA毕业设计)

本文项目编号 T 018 &#xff0c;文末自助获取源码 \color{red}{T018&#xff0c;文末自助获取源码} T018&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 新…

答题考试系统v1.6.1高级版源码分享+uniapp+搭建测试环境

一.系统介绍 一款基于FastAdminThinkPHPUniapp开发的小程序答题考试系统&#xff0c;支持多种试题类型、多种试题难度、练题、考试、补考模式&#xff0c;提供全部前后台无加密源代码&#xff0c;支持私有化部署 二.测试环境 系统环境&#xff1a;CentOS、 运行环境&#x…

经典电荷泵/Charge pump——1998.JSSC

电路结构 工作原理 M3 and M4 are the series switches, and M5, M6 switch to the highest voltage. If M5 and M6 are missing, having a large capacitor is of absolute necessity, because must always stay between 2 Vin and 2Vin - Uj to avoid switching on the vert…

Swin transformer 论文阅读记录 代码分析

该篇文章&#xff0c;是我解析 Swin transformer 论文原理&#xff08;结合pytorch版本代码&#xff09;所记&#xff0c;图片来源于源paper或其他相应博客。 代码也非原始代码&#xff0c;而是从代码里摘出来的片段&#xff0c;配上简单数据&#xff0c;以便理解。 当然&…

GPT-Omni 与 Mini-Omni2:创新与性能的结合

近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;各种模型和平台应运而生&#xff0c;以满足从个人用户到企业级应用的多样化需求。在这一领域&#xff0c;GPT-Omni 和 Mini-Omni2 是两款备受瞩目的技术产品&#xff0c;它们凭借独特的设计和强大的功能&#xff0c;在…

龙迅#LT7911E适用于EDP/DP/TPYE-C转MIPIDSI应用,支持图像处理功能,内置I2C,主应用副屏显示,投屏领域!

1. 描述 LT7911E 是一款高性能 eDP 转 MIPI D-PHY 转换器&#xff0c;旨在将 eDP 源连接到 MIPI 显示面板。 LT7911E 集成了一个符合 eDP1.4 标准的接收器&#xff0c;支持 1.62Gbps 至 5.67Gbps 的输入数据&#xff0c;以 270Mbps 的递增步长&#xff0c;以及一个 2 端口 D…

C语言——实现求出最大值

问题描述&#xff1a;利用C语言自定义函数求出一维数组里边最大的数字 //利用函数找最大数#include<stdio.h>int search(int s[9]) //查找函数 {int i , max s[0] , max_xia 0;for(i0;i<9;i){if(s[i] > max){max_xia i;max s[max_xia];}}return max; } in…