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

  最近在研究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均有效,其他版本未测试。代码效果如下:

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

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

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

上一篇:vb.net简单的计算器实现


下一篇:搬家第15天-186.Step7v5.5+WinccV7.3实现点动效果