• <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.¢% 閱讀(787) 評論(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;
            }
            国产免费久久精品丫丫| 国产99久久久久久免费看| 一级做a爰片久久毛片免费陪 | 亚洲国产天堂久久综合| 亚洲精品乱码久久久久久| 色狠狠久久AV五月综合| 国产精品99久久久久久宅男| 国产精品亚洲综合久久| 久久精品嫩草影院| 成人久久免费网站| 久久成人精品| 久久99中文字幕久久| 精品久久人人爽天天玩人人妻| 99久久久国产精品免费无卡顿| 久久国产精品一区| 久久A级毛片免费观看| 久久天天躁狠狠躁夜夜不卡 | 中文字幕久久波多野结衣av| 国产精品美女久久久m| 亚洲午夜精品久久久久久浪潮 | 久久免费国产精品一区二区| 成人综合久久精品色婷婷| 国产伊人久久| 99久久www免费人成精品| 韩国免费A级毛片久久| 日韩人妻无码一区二区三区久久99| 久久精品草草草| 久久国产精品久久国产精品| 午夜久久久久久禁播电影| 久久人人爽人人爽人人片AV不 | 久久人人爽人人爽人人片av高请 | 91久久精品国产成人久久| 俺来也俺去啦久久综合网| 久久婷婷五月综合97色一本一本| 一极黄色视频久久网站| 久久久午夜精品福利内容| 中文精品99久久国产| 久久久久亚洲精品日久生情| 久久久久免费精品国产| 无码AV中文字幕久久专区| 久久无码人妻一区二区三区|