<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 5690字,需瀏覽 12分鐘

           ·

          2021-04-27 02:09

          作者:Evan  編輯:白帽子社區(qū)運營團隊




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

          "    





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

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

          句柄表的位置
          _EPROCESS中,有一個成員叫ObjectTableoffsetc4

          其指向了一個_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)
          而這個指針的值,最后兩位代表的是多少等級的句柄表,也就是如下


          句柄表中,句柄大小是4字節(jié),但是卻需要占8個字節(jié)(Windows就是這么設(shè)計的),如果是0級句柄表,那就是512個條目,如果是1級句柄表,那就是512*1024,因為一個句柄表大小為4k,然候0級句柄表的每個條目指向的也是一個句柄表,此時的0級句柄表的條目只需要4個字節(jié),因為當成了索引

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

          也就是說,當我們有一個進程打開了一個進程時,他的句柄表中,會有另一個進程的句柄,此時我們遍歷所有進程的句柄表,查看是否有自身,即可驗證自己是否被調(diào)試

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


          #include <ntddk.h>#include <ntstatus.h>
          ULONG GetProcessEprocess(char* ProcessName){ PEPROCESSpEprocess,pCurEProcess; //獲取進程的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; //獲取進程的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; //獲取需要保護的進程的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反序列化分析
          紅隊戰(zhàn)術(shù)-用ssl加密你的metasploit通信




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



          瀏覽 57
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色性爱av | 中文字幕亚洲无码在线 | 天天肏在线视频 | 美日韩一级黄色片 | 美腿丝袜亚洲综合 |