• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            前世今非

            前世五百次的回眸,換來今世的一次擦肩而過。

            hook PsCreateSystemThread

            很多RootKit在ring0下利用PsCreateSystemThread來創建系統線程做某些WS的事情,我們平時不利用ARK工具的話,是很難發現這些線程,在某些情況下,需要anti一些特定的rootkit,這里給出一個簡單的示例:

            .h:
            #pragma once

            #include 
            <ntddk.h> 

            typedef 
            long LONG;
            typedef unsigned 
            char  BOOL, *PBOOL;
            typedef unsigned 
            char  BYTE, *PBYTE;
            typedef unsigned 
            long  DWORD, *PDWORD;
            typedef unsigned 
            short WORD, *PWORD;

            typedef 
            void  *HMODULE;
            typedef 
            long NTSTATUS, *PNTSTATUS;
            typedef unsigned 
            long DWORD;
            typedef DWORD 
            * PDWORD;
            typedef unsigned 
            long ULONG;
            typedef unsigned 
            long ULONG_PTR;
            typedef ULONG 
            *PULONG;
            typedef unsigned 
            short WORD;
            typedef unsigned 
            char BYTE; 
            typedef unsigned 
            char UCHAR;
            typedef unsigned 
            short USHORT;
            typedef 
            void *PVOID;
            typedef BYTE BOOLEAN;
            #define SEC_IMAGE    0x01000000

            NTSTATUS
              PsLookupProcessByProcessId(
                IN HANDLE ProcessId,
                OUT PEPROCESS 
            *Process
                );

            .c:
            #include "HookPsThread.h"
            /******************************************************************************

                Hook PsCreateSystemThread
                out adress

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


            //=============================================================================
            //        Version Define
            //=============================================================================
            #define EPROCESS_SIZE            1
            #define PEB_OFFSET                2   
            #define FILE_NAME_OFFSET        3   
            #define PROCESS_LINK_OFFSET     4   
            #define PROCESS_ID_OFFSET       5 
            #define EXIT_TIME_OFFSET        6 
            //=============================================================================
            //        Logic Define
            //=============================================================================
            ULONG PsCreateSystemThreadAddr = 0;
            char PsCreateSystemThreadData[5= {0};

            DWORD  ProcessNameOffset;

            //-----------------------------------------------------------------------------
            //        GetPlantformDependentInfo
            //-----------------------------------------------------------------------------
            DWORD GetPlantformDependentInfo( DWORD dwFlag )    
            {     
                DWORD current_build;     
                DWORD ans 
            = 0;     
               
                PsGetVersion(NULL, NULL, 
            &current_build, NULL);     
               
                
            switch ( dwFlag )    
                
            {     
                
            case EPROCESS_SIZE:     
                    
            if (current_build == 2195) ans = 0 ;        // 2000,當前不支持2000,下同    
                    if (current_build == 2600) ans = 0x25C;     // xp    
                    if (current_build == 3790) ans = 0x270;     // 2003    
                    break;     
                
            case PEB_OFFSET:     
                    
            if (current_build == 2195)  ans = 0;     
                    
            if (current_build == 2600)  ans = 0x1b0;     
                    
            if (current_build == 3790)  ans = 0x1a0;    
                    
            break;     
                
            case FILE_NAME_OFFSET:     
                    
            if (current_build == 2195)  ans = 0;     
                    
            if (current_build == 2600)  ans = 0x174;     
                    
            if (current_build == 3790)  ans = 0x164;    
                    
            break;     
                
            case PROCESS_LINK_OFFSET:     
                    
            if (current_build == 2195)  ans = 0;     
                    
            if (current_build == 2600)  ans = 0x088;     
                    
            if (current_build == 3790)  ans = 0x098;    
                    
            break;     
                
            case PROCESS_ID_OFFSET:     
                    
            if (current_build == 2195)  ans = 0;     
                    
            if (current_build == 2600)  ans = 0x084;     
                    
            if (current_build == 3790)  ans = 0x094;    
                    
            break;     
                
            case EXIT_TIME_OFFSET:     
                    
            if (current_build == 2195)  ans = 0;     
                    
            if (current_build == 2600)  ans = 0x078;     
                    
            if (current_build == 3790)  ans = 0x088;    
                    
            break;     
                }
                 
                
            return ans;     
            }



            //-----------------------------------------------------------------------------
            //        GetFunctionAddr
            //-----------------------------------------------------------------------------
            ULONG GetFunctionAddr( IN PCWSTR FunctionName)
            {
                UNICODE_STRING UniCodeFunctionName;
                RtlInitUnicodeString( 
            &UniCodeFunctionName, FunctionName );
                
            return (ULONG)MmGetSystemRoutineAddress( &UniCodeFunctionName );   
            }


            //-----------------------------------------------------------------------------
            //        _PsCreateSystemThread
            //-----------------------------------------------------------------------------
            NTSTATUS _PsCreateSystemThread(IN PKSTART_ROUTINE  StartRoutine)
            {
                ULONG RAddr 
            = (ULONG)StartRoutine;  //Routine Address
                
            //Get Process Info
                LPTSTR   CurProc;
                PEPROCESS EProcess;
                PsLookupProcessByProcessId(PsGetCurrentProcessId(), 
            &EProcess);
                CurProc 
            =(LPTSTR)EProcess;
                CurProc 
            =CurProc+ProcessNameOffset;

                
            if (strncmp((char*)CurProc,"System",6!= 0)
                
            {
                    DbgPrint(
            "Current Process : %s, StartRoutine : %X\n", (char *)CurProc, StartRoutine);
                }

                
            return 0;
            }


            //-----------------------------------------------------------------------------
            //        MyPsCreateSystemThread
            //-----------------------------------------------------------------------------
            __declspec (naked)void MyPsCreateSystemThread()
            {
                _asm
                
            {
                    pushad
                    push [esp
            +20h+18h]
                    call _PsCreateSystemThread
                    popad
                    
                    mov edi,edi
                    push ebp
                    mov ebp,esp
                    jmp PsCreateSystemThreadAddr
                }

            }


            //-----------------------------------------------------------------------------
            //        Install Hook
            //-----------------------------------------------------------------------------
            VOID InHook()
            {
                PsCreateSystemThreadAddr 
            = GetFunctionAddr(L"PsCreateSystemThread");

                __asm
                
            {
                    push    eax
                    mov        eax, CR0
                    and        eax, 0FFFEFFFFh
                    mov        CR0, eax
                    pop        eax
                }


                
            //Save asmCode
                memcpy(PsCreateSystemThreadData, (PVOID)PsCreateSystemThreadAddr, 5);
                (ULONG)PsCreateSystemThreadAddr 
            += 5;

                
            //Inline PsCreateSystemThread
                __asm
                
            {
                    mov esi, PsCreateSystemThreadAddr
                    sub esi, 
            5
                    mov 
            byte ptr[esi], 0xE9
                    lea eax, [MyPsCreateSystemThread]
                    sub eax, esi
                    sub eax, 
            5
                    mov dword ptr [esi
            +1],eax
                }


                __asm
                
            {
                    push    eax
                    mov        eax, CR0
                    or        eax, NOT 0FFFEFFFFh
                    mov        CR0, eax
                    pop        eax
                }


                DbgPrint(
            "Hooked OK.\n");
                
            return;
            }


            //-----------------------------------------------------------------------------
            //        Uninstall Hook
            //-----------------------------------------------------------------------------
            VOID UnHook()
            {
                __asm
                
            {
                    push    eax
                    mov        eax, CR0
                    and        eax, 0FFFEFFFFh
                    mov        CR0, eax
                    pop        eax
                }

                (ULONG)PsCreateSystemThreadAddr 
            -= 5;
                memcpy((PVOID)PsCreateSystemThreadAddr, PsCreateSystemThreadData, 
            5);
                __asm
                
            {
                    push    eax
                    mov        eax, CR0
                    or        eax, NOT 0FFFEFFFFh
                    mov        CR0, eax
                    pop        eax
                }

                DbgPrint(
            "UnHook OK.\n");
                
            return;
            }


            //-----------------------------------------------------------------------------
            //        Driver UnLoad
            //-----------------------------------------------------------------------------
            void OnUnload(PDRIVER_OBJECT pDriverObj)
            {
                UnHook();
                DbgPrint(
            "UnLoading Driver");
            }


            //-----------------------------------------------------------------------------
            //        Driver LoadEntry
            //-----------------------------------------------------------------------------
            NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
            {
                pDriverObj
            ->DriverUnload = OnUnload;

                DbgPrint(
            "Loading Driver");
                ProcessNameOffset 
            = GetPlantformDependentInfo(FILE_NAME_OFFSET);
                InHook();
                
            return STATUS_SUCCESS;
            }

            posted on 2009-09-17 20:14 梵天 閱讀(2310) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            導航

            <2009年9月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            統計

            常用鏈接

            留言簿

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            久久久久久久波多野结衣高潮| 久久久久久久尹人综合网亚洲| 久久久噜噜噜久久| 久久伊人精品一区二区三区| 少妇内射兰兰久久| 国产呻吟久久久久久久92| 2021国内久久精品| 成人精品一区二区久久 | 久久久久亚洲AV无码永不| 久久青青草原精品国产| 国产91久久综合| 色偷偷偷久久伊人大杳蕉| 国产精品久久久天天影视香蕉| 久久人人添人人爽添人人片牛牛| 欧美777精品久久久久网| 久久91精品国产91| 久久久精品久久久久特色影视| 精品久久久久久无码中文字幕一区| 久久久久免费视频| 热re99久久精品国产99热| 无码人妻久久一区二区三区免费丨 | 国产精品永久久久久久久久久 | 人妻无码αv中文字幕久久| 久久亚洲国产精品一区二区| 人人狠狠综合久久88成人| 人妻精品久久久久中文字幕| 久久夜色精品国产亚洲| 国产精品无码久久综合| 亚洲AV无码久久精品色欲| 欧美日韩精品久久久免费观看| 国产精品伊人久久伊人电影| 91久久成人免费| 中文字幕成人精品久久不卡| 国产亚洲美女精品久久久久狼| 午夜久久久久久禁播电影| 无码超乳爆乳中文字幕久久 | 奇米影视7777久久精品人人爽| 欧美精品福利视频一区二区三区久久久精品| 99久久国产综合精品成人影院 | 2021最新久久久视精品爱| 久久人人爽人人爽人人片AV东京热 |