Wczoraj zmęczenie widocznie dało się we znaki, nie skumałem, że chodzi Ci o globalnego hooka ;) W tym wypadku numer z podstawianiem DLLi jest troszke nie na miejscu.
Artykuł, który przytoczyłeś pokazuje jak przechwycić wywoływaną funkcję zastępując odniesienie do niej w tablicy przetrzymującej adresy do "załadowanych" funkcji bibliotecznych. Krótko mówiąc wygląda to tak:
-
wywołanie: funkcja(); <--- w programie
-
odczytanie adresu z tablicy <--- w tym przypadku jest to adres naszej funkcji przechwytującej
-
skok do funkcji przechwytującej
-
skok do właściwej funkcji API
W normalnych warunkach odbyło by się to bez punktu 3. Ten sposób jest dość dobry ale nie zastosujesz go w momencie kiedy ktoś zdobędzie adres do funkcji poprzez GetProcAddress.
SetWindowsHookEx AFAiR to tylko część odpowiadająca za zarażenie procesu. Działa to tak, że kod Twojego Hooka wykonuje się w każdym możliwym procesie. Równie dobrze możesz zarazić wybrany proces poprzez DLL injection wykonując CreateRemoteThread pod adresem LoadLibrary w procesie, który chcesz zarazić. W tym wypadku jako parametr przekazujesz adres nazwy Twojej biblioteki, którą chcesz wstrzyknąć. Firewalle są dość wrażliwe na ten sposób dlatego możęsz także wrzucić swój kod do przestrzeni atakowanego procesu i użyć na nim CreateRemoteThread z parametrem zawierającym dane. Przykładowy kod znajduje się na cc-team.org.
Samo przechwycenie funkcji możesz zrobić totalnie łopatologicznie w taki oto sposób:
Kopiujesz w bezpieczne miejsce klika pierwszych bajtów z funkcji, którą chcesz przechwycić. Zastępujesz skopiowane dane skokiem do funkcji przechwytującej. Wykonujesz co Ci trzeba i skaczesz do miejsca gdzie masz przekopiowane bajty, a po ich wykonaniu skaczesz z powrotem do funkcji API.