Pokračovaním článku Inline Hook DLL si dnes priblížime metódu hookingu kódu prostredníctvom Import Acces Table .
 



Import Access Table je tabuľka obsahujúca importované volania, takzvané skoky (jump), na funkcie, ktoré program využíva. Tieto funkcie sú implementované v knižniciach, na ktoré skoky odkazujú, prostredníctvom referencií.

Metóda IAT hookingu sa používa spolu s Inline Hook .dll, ktorú sme si popísali pred nedávnom.

Aby sme si vedeli predstaviť tento spôsob hookingu a aby sme vedeli, načo nám je dobrý, popíšem ho v jednoduchosti na príklade:

.

Predstavte si, že v systéme beží proces, ktorý z času na čas zobrazí informačnú správu prostredníctvom MesageBox. MessageBox je funkcia, ktorá je implementovaná v knižnici user32.dll.
Proces zavolá túto funkciu. Volanie je smerované do Import Acces Table, ako volanie adresy. V IAT je následne skokom jump zavolaná adresa funkcie, ktorá smeruje priamo na funkciu v knižnici user32.dll.
Týmto je volanie z procesu nasmerované priamo na funkciu v user32.dll.

Ďalej chceme napísať program, ktorý by nám niekam na disk vytváral súbory, hľadal dáta, ... Ak by sme náš program smerovali ako klasický program spustený prostredníctvom registrov, tak je ľahdo dohladateľný a zmazaný. Mi však program moôžeme ako knižnicu pripnúť na bežiaci proces, a namapovať ho na spomínanú funkciu MessageBox. Vždy keď proces zavolá funciu MessageBox, vykoná sa funkcia v našej pripnutej .dll knižnice a nie v knižnici user32.dll.
Namapovanie sa vykoná prostredníctvom IAT hooku, kedy nám volanie z procesu nebude smerovať na funkciu v user32.dll, ale bude presmerované na našu funkciu v infikovanej .dll.


Pred IAT hooking:



Po IAT hoking:





Kód infikovanej knižnice C++:

  
#include <windows.h>
#include <iostream>

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)
{ 
    ::std::cout << "\n\n\n  Hooked \"MessageBoxS\" !\n\n";
    return 0;
}
 
BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
           SetHook(GetProcAddress(GetModuleHandleA("user32.dll"), "MessageBoxA"), 
(LPVOID) HookedCall); break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } return TRUE; }

 

 


Ukážka IAT hookingu prostredníctvom hooknutej knižnice (inline hooking) je na videu: