• <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>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉,開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            [轉] hook PsCreateSystemThread

            Posted on 2009-09-17 21:59 S.l.e!ep.¢% 閱讀(782) 評論(0)  編輯 收藏 引用 所屬分類: Windows WDM

            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;
            }
            很多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;
            }
            77777亚洲午夜久久多喷| 久久er国产精品免费观看2| 久久久精品人妻一区二区三区蜜桃| 四虎影视久久久免费| 新狼窝色AV性久久久久久| 国产女人aaa级久久久级| 久久亚洲日韩看片无码| 久久99国内精品自在现线| 精品国产婷婷久久久| 精品无码久久久久久尤物| 久久久久久极精品久久久| 久久综合精品国产二区无码| 久久成人18免费网站| 好久久免费视频高清| 国产69精品久久久久APP下载| 97久久精品无码一区二区| 久久久亚洲欧洲日产国码是AV| 久久久久久a亚洲欧洲aⅴ| 无码伊人66久久大杳蕉网站谷歌 | 香蕉久久AⅤ一区二区三区| 韩国免费A级毛片久久| 久久久久亚洲精品日久生情 | 国产69精品久久久久99尤物| 人妻精品久久久久中文字幕一冢本| 久久丝袜精品中文字幕| 97久久精品人人澡人人爽 | 要久久爱在线免费观看| 久久综合久久久| 99国产精品久久| 狠狠色丁香久久婷婷综合五月| 亚洲国产一成人久久精品| 欧美日韩精品久久免费| 久久频这里精品99香蕉久| 久久精品国产福利国产琪琪| 精品久久香蕉国产线看观看亚洲 | 久久精品国产亚洲一区二区| 久久久一本精品99久久精品88 | 国产精品久久久久久久| 97久久久精品综合88久久| 91精品国产综合久久久久久| 久久精品人成免费|