; 防止文件删除
; 拒绝除SYSTEM外所有用户的访问,并设置文件拥有者为非当前用户。
#include <LocalSecurityAuthority.au3>
; 提升本进程至系统级权限。
If $CmdLine[0] = 0 or $CmdLine[1] <> "-System" Then
If @Compiled Then
$sApp = @ScriptFullPath
$sArg = " -System"
Else
$sApp = @AutoItExe
$sArg = " " & FileGetShortName(@ScriptFullPath) & " -System"
EndIf
_CreateProcessAsSystem($sApp, $sArg, "Winlogon.exe")
Exit
EndIf
If Not FileExists("Test2.txt") Then Run(@ComSpec & " /c echo Delete Me>Test2.txt", "", 0)
Do ; Why?
Until FileExists("Test2.txt")
; 启用RESTORE权限,(设置文件拥有者所需)。
Dim $aPriv[1][2] = [[$SE_RESTORE_NAME, 2]]
$hToken = _OpenProcessToken(@AutoItPid)
_AdjustTokenPrivileges($hToken, $aPriv)
_CloseHandle($hToken)
; 设置拥有者为Local Service,也可以是Network Service或者ANONYMOUS LOGON。
; 当某文件有访问控制列表但访问控制列表中无任何条目,或不为当前用户启用访问权限时,系统拒绝任何/当前用户的任何访问。此时只有拥有者才能重新设置其访问权限。此处选Local Service 或Network Service为拥有者是因为在管理员用户或普通用户下,创建LocalService或NetworkService级别的进程是很不容易实现的,就算能够创建,这两级别的进程也没有任何的访问权限。
_SetFileSecurityOwner("Test2.txt", "Local Service")
FileSetAttrib("Test2.txt", "+R") ; 加只读属性
;Msgbox(0, '', FileDelete("Test2.txt"))
; 只允许SYSTEM用户的所有访问,其他一概拒绝。
Dim $aAce[1][4] = [["SYSTEM", $GENERIC_ALL, 1, 0]]
_SetFileSecurityDacl("Test2.txt", $aAce)
Msgbox(0, '完成', '测试是否能够删除')
; 缺点:防删除的文件必须位于NTFS文件系统中。相对于方案一,此法比较容易破解(也是优点?)。
; 优点:禁止除SYSTEM用户外的所有访问,长期有效(也是缺点?)。
请问这段代码如何逆向 可以删除!? |