利用句柄表實現(xiàn)反調(diào)試
作者:Evan 編輯:白帽子社區(qū)運營團隊
"白帽子社區(qū)在線CTF靶場BMZCTF,歡迎各位在這里練習、學習,BMZCTF全身心為網(wǎng)絡(luò)安全賽手提供優(yōu)質(zhì)學習環(huán)境,鏈接(http://www.bmzclub.cn/)
"




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





#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;//獲取需要保護的進程的EProcessaddr=GetProcessEprocess("notepad.exe");DbgPrint("程序正在被 [%d] 調(diào)試!\n", addr);CheckProcessDebug(addr);return STATUS_SUCCESS;}

評論
圖片
表情
