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; }