ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

[vb.net] 通过注册系统实现进程进程保护(非守护进程方法)

2021-04-14 11:01:59  阅读:227  来源: 互联网

标签:vb End Sub ByVal 进程 Integer net Public


  最近在研究U盘锁,也在网上寻找进程保护的方法,但是找来找去那些方法要么是没有起到作用,要么就是使用守护进程,并不能实现我想要的那种对进程本身进行保护的方法。不过功夫不负有心人,最后我在某个bbs上找到了一种C++实现的通过Win32 API将自身进程注册为系统进程的进程守护方法,只用了一个变量和2个API,十分简单,于是决定试着把他们翻译成vb.net。

  这种方法主要使用了RtlAdjustPrivilege和NtSetInformationProcess两个API,百度了一下,前者主要用于提升自身进程的权限,而后者则主要是实现注册与反注册,但似乎都需要程序以管理员身份运行。通过分析API的C++声明转换类型后,得到vb.net下的API声明如下:

Declare Function RtlAdjustPrivilege Lib "ntdll.dll" (ByVal Privilege As Integer, ByVal NewValue As Integer, ByVal NewThread As Integer, ByRef OldValue As Integer) As Integer

Declare Function NtSetInformationProcess Lib "ntdll.dll" (ByVal ProcessHandle As IntPtr, ByVal ProcessInformationClass As Integer, ByRef ProcessInformation As Integer, ByVal ProcessInformationLength As Integer) As Integer

  然后直接复制原来的C++代码,稍作修改并测试后,发现该方法可以使用,遂将其封装成类,代码如下:

 1 ''' <summary>
 2 ''' 进程保护类
 3 ''' </summary>
 4 ''' <remarks></remarks>
 5 Public Class AntiKiller
 6 
 7     Private Declare Function RtlAdjustPrivilege Lib "ntdll.dll" (ByVal Privilege As Integer, ByVal NewValue As Integer, ByVal NewThread As Integer, ByRef OldValue As Integer) As Integer
 8 
 9     Private Declare Function NtSetInformationProcess Lib "ntdll.dll" (ByVal ProcessHandle As IntPtr, ByVal ProcessInformationClass As Integer, ByRef ProcessInformation As Integer, ByVal ProcessInformationLength As Integer) As Integer
10 
11     Private b As Integer = 0
12 
13     ''' <summary>
14     ''' 获取进程保护状态
15     ''' </summary>
16     ''' <value></value>
17     ''' <returns></returns>
18     ''' <remarks></remarks>
19     Public ReadOnly Property GetProtectionState As Boolean
20         Get
21             Return b = 1
22         End Get
23     End Property
24 
25     ''' <summary>
26     ''' 启动进程保护
27     ''' </summary>
28     ''' <remarks></remarks>
29     Public Sub AntiKill()
30         b = 1
31         NtSetInformationProcess(-1, &H1D, b, 4)
32     End Sub
33 
34     ''' <summary>
35     ''' 卸载进程保护
36     ''' </summary>
37     ''' <remarks></remarks>
38     Public Sub AllowKill()
39         b = 0
40         NtSetInformationProcess(-1, &H1D, b, 4)
41     End Sub
42 
43     ''' <summary>
44     ''' 初始化进程保护类
45     ''' </summary>
46     ''' <remarks></remarks>
47     Public Sub New()
48         '提权
49         RtlAdjustPrivilege(20, 1, 0, b)
50     End Sub
51 
52 End Class

  使用方法也相当简单,先实例化AntiKiller并调用AntiKill或AllowKill方法即可。该方法相当有效,当在任务管理器结束进程时会提示系统进程,如强制结束进程则会导致系统同时被关闭,不仅是任务管理器,其他任何方法结束程序都会导致系统被关闭(包括程序自己结束)。经过测试,该方法对Win7、Win10均有效,其他版本未测试。代码效果如下:

当程序以管理员账户身份运行时,甚至会阻止关机,但当程序以服务形式运行(即使用instsrv和srvany将其注册为服务运行)时,不会阻止关机。原因尚不明确,个人猜测大概是当程序以服务形式运行时,不会在系统完全关闭前被结束,也就不会在关机时蓝屏了。

  如果有什么说的不对的地方还请大佬们多多指正awa

标签:vb,End,Sub,ByVal,进程,Integer,net,Public
来源: https://www.cnblogs.com/li-yuan-fang/p/14656638.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有