• <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),開心的工作
            簡單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            [轉(zhuǎn)] hook PsCreateSystemThread

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

            hook PsCreateSystemThread

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

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

            .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;
            }
            精品国产乱码久久久久软件| 色妞色综合久久夜夜| 深夜久久AAAAA级毛片免费看| 久久精品国产亚洲一区二区三区| 久久精品不卡| 国产精品女同久久久久电影院| 99久久精品免费国产大片| 青青久久精品国产免费看| 国产亚洲精久久久久久无码77777| 久久99国产精品尤物| 欧美午夜A∨大片久久| 粉嫩小泬无遮挡久久久久久| 久久久久久国产精品免费免费| 精品国际久久久久999波多野| 久久影院久久香蕉国产线看观看| 久久综合给合久久国产免费| 久久久噜噜噜久久中文字幕色伊伊| 久久综合88熟人妻| 久久综合九色综合网站| 精品久久久久久无码人妻热| 久久天堂AV综合合色蜜桃网| 色狠狠久久综合网| 欧美久久一级内射wwwwww.| 精品国产乱码久久久久久郑州公司 | 欧美性猛交xxxx免费看久久久 | 精品久久久久久久| 久久精品人人做人人爽电影| 久久综合亚洲色HEZYO国产| 国产精品久久久久久久| 伊人久久大香线蕉av不卡| 久久夜色精品国产亚洲av| 国产精品亚洲美女久久久| 青青热久久综合网伊人| 久久久久无码精品国产| 性做久久久久久久| 日韩精品无码久久久久久| 久久精品国产清自在天天线| 99久久免费国产精品特黄| 久久精品亚洲AV久久久无码| 久久婷婷五月综合国产尤物app | 久久九九久精品国产|