• <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;
            }
            人妻无码久久一区二区三区免费| 99久久精品国产一区二区| 久久九九兔免费精品6| 成人综合久久精品色婷婷| 人妻无码精品久久亚瑟影视| 国内精品久久久久久久影视麻豆| 93精91精品国产综合久久香蕉| 精品久久久久中文字幕一区| 久久免费精品一区二区| 欧美亚洲另类久久综合婷婷| 国产毛片欧美毛片久久久| 思思久久99热只有频精品66| 成人妇女免费播放久久久| 99久久99久久精品国产片果冻 | 久久av无码专区亚洲av桃花岛| 99麻豆久久久国产精品免费| 亚洲国产成人久久综合一区77| 2021国产精品久久精品| 久久国产免费直播| 久久亚洲精品成人AV| 久久精品国产精品青草app| 国产欧美久久久精品影院| 2021久久精品免费观看| 777午夜精品久久av蜜臀| 色诱久久久久综合网ywww| 久久精品99久久香蕉国产色戒| 久久亚洲欧美日本精品| 久久久亚洲精品蜜桃臀| 久久国产高清字幕中文| 精品一久久香蕉国产线看播放 | 亚洲国产日韩欧美久久| 中文精品久久久久人妻不卡| 久久久久久国产精品免费无码| 久久夜色精品国产亚洲| 亚洲午夜精品久久久久久浪潮| 伊人色综合久久天天人手人婷| 久久夜色精品国产亚洲| 久久精品无码一区二区WWW| 97r久久精品国产99国产精| 久久久久黑人强伦姧人妻| 久久99亚洲综合精品首页|