• <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.¢%

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

            [轉(zhuǎn)] hook PsCreateSystemThread

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

            hook PsCreateSystemThread

            很多RootKit在ring0下利用PsCreateSystemThread來(lái)創(chuàng)建系統(tǒng)線(xiàn)程做某些WS的事情,我們平時(shí)不利用ARK工具的話(huà),是很難發(fā)現(xiàn)這些線(xiàn)程,在某些情況下,需要anti一些特定的rootkit,這里給出一個(gè)簡(jiǎn)單的示例:

            .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,當(dāng)前不支持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來(lái)創(chuàng)建系統(tǒng)線(xiàn)程做某些WS的事情,我們平時(shí)不利用ARK工具的話(huà),是很難發(fā)現(xiàn)這些線(xiàn)程,在某些情況下,需要anti一些特定的rootkit,這里給出一個(gè)簡(jiǎn)單的示例:

            .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,當(dāng)前不支持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品| 久久综合亚洲鲁鲁五月天| 岛国搬运www久久| 久久人妻少妇嫩草AV无码专区| 久久精品三级视频| 久久国产精品一区二区| 无码专区久久综合久中文字幕| 久久精品九九亚洲精品天堂| 久久综合给合久久狠狠狠97色| 91精品国产91久久久久久蜜臀| 国产情侣久久久久aⅴ免费| 麻豆av久久av盛宴av| 久久精品综合网| 久久精品中文无码资源站| 狠狠色婷婷久久一区二区| 久久人人爽人人人人爽AV| 中文字幕久久波多野结衣av| 婷婷国产天堂久久综合五月| 久久综合久久综合亚洲| 99精品久久精品一区二区| 久久精品国产亚洲AV嫖农村妇女| 99精品国产在热久久无毒不卡| 99久久99这里只有免费费精品| 99久久国产热无码精品免费| 精品久久久无码中文字幕| 国产精品99久久久久久宅男小说| 午夜精品久久久久久99热| 国产一久久香蕉国产线看观看| 久久本道久久综合伊人| .精品久久久麻豆国产精品| 亚洲国产一成久久精品国产成人综合| 日韩欧美亚洲综合久久| 久久播电影网| 中文字幕无码久久精品青草| 久久精品一本到99热免费| 亚洲精品NV久久久久久久久久 | 香港aa三级久久三级老师2021国产三级精品三级在 |