防止文件在运行时VB.NET中被(删除/编辑)

时间:2019-02-09 14:10:45

标签: .net vb.net api-hook

可以保护项目目录位置内的文件。

例如(test.txt或test.bat或...等)。

在运行项目时,我有重要数据不想在txt中更改。

累了很多。

  • 按权限/文件流锁定文件(但效果不好,很容易通过更改用户的权限来解锁。
  

现在我尝试了我的代码,但是在运行时它仅锁定项目而不锁定文件

     

让我说说我的文件类型(test.txt或test.bat或...等等)。

Imports System.Runtime.InteropServices
Imports System.ComponentModel
Imports System.Security.AccessControl
Imports System.Security.Principal

Public Class c_AntiKill
<DllImport("advapi32.dll", SetLastError:=True)> _
Shared Function GetKernelObjectSecurity(Handle As IntPtr, securityInformation As Integer, <Out> pSecurityDescriptor As Byte(), nLength As UInteger, ByRef lpnLengthNeeded As UInteger) As Boolean
End Function
<DllImport("advapi32.dll", SetLastError:=True)> _
Shared Function SetKernelObjectSecurity(Handle As IntPtr, securityInformation As Integer, <[In]> pSecurityDescriptor As Byte()) As Boolean
End Function
<DllImport("kernel32.dll")> _
Shared Function GetCurrentProcess() As IntPtr
End Function
Protected Function GetProcessSecurityDescriptor(processHandle As IntPtr) As RawSecurityDescriptor
    Dim psd() As Byte = New Byte(1) {}
    Dim bufSizeNeeded As UInteger
    GetKernelObjectSecurity(processHandle, &H4, psd, 0, bufSizeNeeded)
    psd = New Byte(bufSizeNeeded) {}
    If bufSizeNeeded < 0 OrElse bufSizeNeeded > Short.MaxValue Then
        Throw New Win32Exception()
    End If
    If Not GetKernelObjectSecurity(processHandle, &H4, psd, bufSizeNeeded, bufSizeNeeded) Then
        Throw New Win32Exception()
    End If
    Return New RawSecurityDescriptor(psd, 0)
End Function
Protected Sub SetProcessSecurityDescriptor(processHandle As IntPtr, dacl As RawSecurityDescriptor)
    Dim rawsd As Byte() = New Byte(dacl.BinaryLength - 1) {}
    dacl.GetBinaryForm(rawsd, 0)
    If Not SetKernelObjectSecurity(processHandle, &H4, rawsd) Then
        Throw New Win32Exception()
    End If
End Sub
Public Sub c_ImAntiKill()
    Dim hProcess As IntPtr = GetCurrentProcess()
    Dim dacl = GetProcessSecurityDescriptor(hProcess)
    dacl.DiscretionaryAcl.InsertAce(0, New CommonAce(AceFlags.None, AceQualifier.AccessDenied, CInt(&HF0000 Or &H100000 Or &HFFF), New SecurityIdentifier(WellKnownSidType.WorldSid, Nothing), False, Nothing))
    SetProcessSecurityDescriptor(hProcess, dacl)
    '   Console.ReadKey()
End Sub
End Class

1 个答案:

答案 0 :(得分:0)

您可以使用用户的许可。 来自另一个线程的答案。(工作正常) https://stackoverflow.com/a/45785316