Никакого перехвата и хуков не надо, проявите фантазию Я вижу по-меньшей мере 3 способа без всяких хуков, самый простой:
| Код | #include <iostream> #include <windows.h>
extern "C" { typedef HANDLE (__stdcall *OpenThread)(DWORD, BOOL, DWORD); }
void EnableDebugPrivilege(bool fEnable) { HANDLE hToken; if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) { TOKEN_PRIVILEGES tp; tp.PrivilegeCount = 1; LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid); tp.Privileges[0].Attributes = fEnable ? SE_PRIVILEGE_ENABLED : 0; AdjustTokenPrivileges(hToken, false, &tp, sizeof(tp), NULL, NULL); CloseHandle(hToken); } }
int main(int argc, char* argv[]) { HMODULE hModule = GetModuleHandle("kernel32.dll"); OpenThread pOpenThread = (OpenThread)GetProcAddress(hModule, "OpenThread");
CONTEXT cnx = {0}; char shellcode[] = "\xEB\xFE"; HWND hWnd = FindWindow(NULL, "Калькулятор"); if (hWnd != 0) { DWORD ProcessID; DWORD ThreadID = GetWindowThreadProcessId(hWnd, &ProcessID); PVOID hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessID); if (hProcess > ERROR_SUCCESS) { PVOID pMemory = VirtualAllocEx(hProcess, 0, 0x1000, MEM_COMMIT, PAGE_EXECUTE_READWRITE); DWORD pBytes = 0; WriteProcessMemory(hProcess, pMemory, &shellcode, 2, &pBytes); if (pBytes) { cnx.ContextFlags = CONTEXT_FULL; PVOID hThread = pOpenThread(THREAD_ALL_ACCESS, FALSE, (DWORD)ThreadID); EnableDebugPrivilege(TRUE); SuspendThread(hThread); GetThreadContext((PVOID)hThread, &cnx); cnx.Eip = (DWORD)pMemory; SetThreadContext((PVOID)hThread, &cnx); ResumeThread(hThread); } } }
char ch; std::cin >> ch; return 0; }
|
|