-
-
[讨论]卷太卷了,前几天某位大佬写的页面HOOK,已经被科学家们安排上了,大概还原了一下,科学家们已经不限于用这个玩通讯了
-
发表于: 2022-11-20 02:56 3089
-
PVOID HookLargePage(ULONG64 DirBase, PVOID lpBaseAddress)
{
PMMVA AddressInfo = (PMMVA)&lpBaseAddress;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | PVOID PML4T = (PVOID)ClearCR3Flag(DirBase); PMMPTE PML4E = NULL; PVOID PDPT = NULL; PMMPTE PDPTE = NULL; PVOID PDT = NULL; PMMPTE PDE = NULL; PML4E = MapPhysicalToVirtual((ULONG64)((ULONG64)PML4T + AddressInfo - >PML4T * ENTRY_SIZE)); if (PML4E ! = NULL) { ULONG64 Permission = ( * (PULONG64)PML4E) & 0xFFF ; PVOID Page = AllocPhysicaMemory( 0x1000 ); PVOID PML4EVA = MapPhysicalToVirtual(ClearCR3Flag( * (PULONG64)PML4E)); RtlCopyMemory(Page, PML4EVA, 0x1000 ); * (ULONG64 * )((ULONG64)PML4E) = MmGetPhysicalAddress(Page).QuadPart | Permission; UpDataLargeTLb(Page, 0X1000 ); UpDataLargeTLb(Page, 0X1000 ); } PDPT = (PVOID)ClearCR3Flag( * (PULONG64)PML4E); PDPTE = (PMMPTE)MapPhysicalToVirtual((ULONG64)PDPT + AddressInfo - >PDPT * ENTRY_SIZE); if (PDPTE ! = NULL) { ULONG64 Permission = ( * (PULONG64)PDPTE) & 0xFFF ; PVOID Page = AllocLargePageMemory( 0x1000 ); PVOID PDPTEVA = MapPhysicalToVirtual(ClearCR3Flag( * (PULONG64)PDPTE)); RtlCopyMemory((PVOID)Page, PDPTEVA, 0x1000 ); * (ULONG64 * )((ULONG64)PDPTE) = MmGetPhysicalAddress((PVOID)Page).QuadPart | Permission; UpDataLargeTLb(Page, 0X1000 ); UpDataLargeTLb(PDPTEVA, 0X1000 ); } PDT = (PVOID)ClearCR3Flag( * (PULONG64)PDPTE); PDE = (PMMPTE)MapPhysicalToVirtual((ULONG64)PDT + AddressInfo - >PDT * ENTRY_SIZE); if (PDE ! = NULL) { PDE - >Global = 0 ; ULONG64 Permission = ( * (PULONG64)PDE) & 0xFFF ; PVOID Page = AllocLargePageMemory(NUM_2M * 2 ); ULONG64 PagePhy = MmGetPhysicalAddress(Page).QuadPart; ULONG64 PagePhyAlign = ROUND_UP(PagePhy, NUM_2M); ULONG64 Delta = PagePhyAlign - PagePhy; PVOID PDEVA = MapPhysicalToVirtual(ClearCR3Flag( * (PULONG64)PDE)); RtlCopyMemory((PVOID)((ULONG64)Page + Delta), PDEVA, NUM_2M); * (ULONG64 * )((ULONG64)PDE) = PagePhyAlign | Permission; UpDataLargeTLb(Page, NUM_2M * 2 ); UpDataLargeTLb(PDEVA, NUM_2M); UpDataLargeTLb(lpBaseAddress, NUM_2M); return Page; } return NULL; |
}
VOID HookLargePageApi(PEPROCESS Eprocess, PVOID ApiAddress, PVOID Proxy_ApiAddress, PVOID * Original_ApiAddress)
{
PVOID FakerPte = NULL;
ULONG Size = 0;
KAPC_STATE ApcState;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | BYTE CallReturn[] = { 0x48 , 0xB8 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xC3 }; BYTE HookCode[ 12 ] = { 0x48 , 0xB8 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0x00 , 0xFF , 0xE0 }; KeStackAttachProcess(Eprocess, &ApcState); FakerPte = HookLargePage(__readcr3(), ApiAddress); ClearPDEGlobal(ApiAddress); ClearPDEGlobal(NtOpenThread); ClearPDEGlobal(NtOpenProcess); KeUnstackDetachProcess(&ApcState); UpDataLargeTLb(ApiAddress, 0x1000 ); UpDataLargeTLb(NtOpenProcess, 0x1000 ); UpDataLargeTLb(NtOpenThread, 0x1000 ); ClearPDEGlobal(ApiAddress); ClearPDEGlobal(NtOpenThread); ClearPDEGlobal(NtOpenProcess); / / - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 先退出刷新一次 KeAttachProcess(Eprocess); * (PULONG64)((ULONG64)HookCode + 0x02 ) = (ULONG64)Proxy_ApiAddress; RtlSuperCopyMemory(ApiAddress, HookCode, sizeof(HookCode)); RtlSuperCopyMemory(NtOpenProcess, CallReturn, sizeof(CallReturn)); RtlSuperCopyMemory(NtOpenThread, CallReturn, sizeof(CallReturn)); KeDetachProcess(); for (ULONG64 i = 0 ; i < NUM_2M * 2 ; i + = 0x1000 ) { ULONG64 BadPag = MmGetPhysicalAddress((PVOID)((ULONG64)FakerPte + i)).QuadPart; MarkPhysicalMemoryAsBad(BadPag); } MmFreeContiguousMemory(FakerPte); return ; |
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | HookLargePageApi(Eprocess, PsLookupThreadByThreadId, HookShllCode, NULL); for (ULONG i = 4 ; i < 65535 ; i = i + 4 ) { PETHREAD pTempThread = NULL; if (NT_SUCCESS(PsLookupThreadByThreadId((HANDLE)i, &pTempThread))) { if ((IoThreadToProcess(pTempThread) = = Eprocess && !PsIsThreadTerminating(pTempThread))) { KeAttachProcess(Eprocess); SaveThread - >g_SaveEthread[(ULONG64)PsGetThreadId(pTempThread)] = (ULONG64)pTempThread; KeDetachProcess(); * (ULONG64 * )ExpLookupHandleTableEntry((PVOID)PspCid, (ULONG64)PsGetThreadId(pTempThread)) = 0 ; continue ; } ObDereferenceObject(pTempThread); } |
如今的大佬们都开清空 PSPCID线程句柄来保护DWM,其实我想表示没吊用,人家根本不是这么找的DWM 还原不太像 他构造的是4级 我直接按照内核的来 构造为2M的页面
外挂样本整活群(定期更新各种好玩的外挂样本):QQ群252586714
赞赏
看原图
赞赏
雪币:
留言: