1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        利用句柄表實(shí)現(xiàn)反調(diào)試

        共 5690字,需瀏覽 12分鐘

         ·

        2021-04-27 02:09

        作者:Evan  編輯:白帽子社區(qū)運(yùn)營團(tuán)隊(duì)




            "白帽子社區(qū)在線CTF靶場BMZCTF,歡迎各位在這里練習(xí)、學(xué)習(xí),BMZCTF全身心為網(wǎng)絡(luò)安全賽手提供優(yōu)質(zhì)學(xué)習(xí)環(huán)境,鏈接(http://www.bmzclub.cn/)

        "    





        句柄
        句柄可以說是Windows編程的核心,當(dāng)一個(gè)進(jìn)程創(chuàng)建或者打開一個(gè)內(nèi)核對象時(shí),就會獲得一個(gè)句柄,通過這個(gè)句柄可以訪問內(nèi)核對象。

        為什么要有句柄
        句柄存在的目的是為了避免在應(yīng)用層直接修改內(nèi)核對象,句柄也就是內(nèi)核對象中的一個(gè)索引,而內(nèi)核對象存放在句柄表中。

        句柄表的位置
        _EPROCESS中,有一個(gè)成員叫ObjectTable,offsetc4

        其指向了一個(gè)_HANDLE_TABLE結(jié)構(gòu)體
        ntdll!_HANDLE_TABLE   +0x000 TableCode        : Uint4B   +0x004 QuotaProcess     : Ptr32 _EPROCESS   +0x008 UniqueProcessId  : Ptr32 Void   +0x00c HandleTableLock  : [4] _EX_PUSH_LOCK   +0x01c HandleTableList  : _LIST_ENTRY   +0x024 HandleContentionEvent : _EX_PUSH_LOCK   +0x028 DebugInfo        : Ptr32 _HANDLE_TRACE_DEBUG_INFO   +0x02c ExtraInfoPages   : Int4B   +0x030 FirstFree        : Uint4B   +0x034 LastFree         : Uint4B   +0x038 NextHandleNeedingPool : Uint4B   +0x03c HandleCount      : Int4B   +0x040 Flags            : Uint4B   +0x040 StrictFIFO      : Pos 0, 1 Bit
        offset 0的地方他指向的就是句柄表

        句柄表結(jié)構(gòu)
        而這個(gè)指針的值,最后兩位代表的是多少等級的句柄表,也就是如下


        句柄表中,句柄大小是4字節(jié),但是卻需要占8個(gè)字節(jié)(Windows就是這么設(shè)計(jì)的),如果是0級句柄表,那就是512個(gè)條目,如果是1級句柄表,那就是512*1024,因?yàn)橐粋€(gè)句柄表大小為4k,然候0級句柄表的每個(gè)條目指向的也是一個(gè)句柄表,此時(shí)的0級句柄表的條目只需要4個(gè)字節(jié),因?yàn)楫?dāng)成了索引。

        句柄表現(xiàn)
        由于句柄大小為8字節(jié),在內(nèi)存中我們通過Handle/4得到句柄在句柄表中的序號,然后在通過TableCode+Handle/4*8得到其句柄表項(xiàng),其中句柄表項(xiàng)的屬性如下。

        也就是說,當(dāng)我們有一個(gè)進(jìn)程打開了一個(gè)進(jìn)程時(shí),他的句柄表中,會有另一個(gè)進(jìn)程的句柄,此時(shí)我們遍歷所有進(jìn)程的句柄表,查看是否有自身,即可驗(yàn)證自己是否被調(diào)試。

        遍歷句柄表實(shí)現(xiàn)反調(diào)試
        我們已經(jīng)知道句柄表了,那么如果調(diào)試器要調(diào)試程序,就肯定要打開那個(gè)程序,通過OpenProcess來獲取程序的句柄,那么其對應(yīng)的句柄表,肯定有這個(gè)值,所以我們可以根據(jù)這個(gè)特性來反調(diào)試
        所以思路是:遍歷所有其他進(jìn)程句柄表,看哪個(gè)進(jìn)程的句柄表中保護(hù)自己的進(jìn)程,如果有,說明正在被調(diào)試。
        這里我監(jiān)視的是notepad.exe是否有調(diào)試程序


        #include <ntddk.h>#include <ntstatus.h>
        ULONG GetProcessEprocess(char* ProcessName){ PEPROCESSpEprocess,pCurEProcess; //獲取進(jìn)程的EProcess __asm { moveax,fs:[0x124] moveax,[eax+0x220] movpEprocess,eax }
        pCurEProcess=pEprocess; do { PCHARImageFileName=(PCHAR)pCurEProcess+0x174; if(strcmp(ImageFileName,ProcessName)==0) { return (ULONG)pCurEProcess; } pCurEProcess=(PEPROCESS)(*(PULONG)((ULONG)pCurEProcess+0x88)-0x88); }while(pCurEProcess!=pEprocess); return0;}
        BOOLEAN CheckProcessDebug(ULONG CheckedProcess){ PEPROCESSpEprocess,pCurEProcess; PULONG table; PEPROCESS eps; ULONG ObTable; int i,j,k; //獲取進(jìn)程的EProcess __asm { moveax,fs:[0x124] moveax,[eax+0x220] movpEprocess,eax } DbgPrint("開始檢查\n"); pCurEProcess=pEprocess; do { PCHARImageFileName=(PCHAR)pCurEProcess+0x174; ULONGObjectTable=*(PULONG)((ULONG)pCurEProcess+0xc4);
        if(ObjectTable!=0) { DbgPrint("[%s]\t[%s]\t[%x]\t[%x]\n",ImageFileName,((PCHAR)CheckedProcess+0x174),ObjectTable,CheckedProcess); ObTable=(ULONG)ObjectTable; switch(ObTable&0x3) { case0: table=(PULONG)((*(PULONG)ObTable)&0xfffffffc); for(i=0;i<512;i+=2) { eps=(PEPROCESS)((table[i]&0xfffffff8)+0x18); //DbgPrint("程序正在被 [%x] 檢查!\n", (ULONG)eps); if(strcmp(ImageFileName,"csrss.exe")!=0&&eps==(PEPROCESS)CheckedProcess) { DbgPrint("程序正在被 [%s] 調(diào)試!\n", ImageFileName); return TRUE; } }
        break; case1: for(i=0;i<1024;i++) { table=(PULONG)(*(PULONG)ObTable)+i; if(MmIsAddressValid((PVOID)table)) for(j=0;j<512;j++) { eps=(PEPROCESS)((ULONG)(table+j*2)&0xfffffff8+0x18); DbgPrint("程序正在被 [%s] 檢查!\n", (PCHAR)eps+0x174); if(eps==(PEPROCESS)CheckedProcess) { DbgPrint("程序正在被 [%s] 調(diào)試!\n", ImageFileName); return TRUE; } } } break; case2: for(i=0;i<1024;i++) { table=(PULONG)(*(PULONG)ObTable)+i; if(MmIsAddressValid((PVOID)table)) for(j=0;j<1024;j++) { table=(PULONG)(*(PULONG)ObTable)+j; if(MmIsAddressValid((PVOID)table)) for(k=0;k<512;k++) { eps=(PEPROCESS)((ULONG)(table+k*2)&0xfffffff8+0x18); DbgPrint("程序正在被 [%s] 檢查!\n", (PCHAR)eps+0x174); if(eps==(PEPROCESS)CheckedProcess) { DbgPrint("程序正在被 [%s] 調(diào)試!\n", ImageFileName); return TRUE; } } } } break; default: DbgPrint("NoPass"); }
        } pCurEProcess=(PEPROCESS)(*(PULONG)((ULONG)pCurEProcess+0x88)-0x88); }while(pCurEProcess!=pEprocess); DbgPrint("Processing is not debug"); return FALSE;}VOID DriverUnload(PDRIVER_OBJECT pDriver){ DbgPrint("Driver unloaded.\n");
        }


        NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver,PUNICODE_STRING reg_path){ ULONG addr; pDriver->DriverUnload = DriverUnload; //獲取需要保護(hù)的進(jìn)程的EProcess addr=GetProcessEprocess("notepad.exe"); DbgPrint("程序正在被 [%d] 調(diào)試!\n", addr); CheckProcessDebug(addr); return STATUS_SUCCESS;}


        往期精彩文章




        Chrome瀏覽器代碼執(zhí)行0 day漏洞通知
        虎符ctf  wp
        apache ofbiz CVE-2021-26295 RMI反序列化分析
        紅隊(duì)?wèi)?zhàn)術(shù)-用ssl加密你的metasploit通信




        技術(shù)支持:白帽子社區(qū)團(tuán)隊(duì)
        — 掃碼關(guān)注我們 



        瀏覽 57
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            开心深爱激情网 | 丝袜精品欧美亚洲自拍 | 淫淫网视频| 美女扒开粉嫩的尿囗给男生桶软件 | 夜色AV秘 无码一区二区三va | 亚洲免费高清 | 91色爱| 北条麻妃A片在线播放 | 青青青在线视频 | 玖玖玖玖玖玖玖玖 |