Api-Hooking -- Schreibt keinen Code in die Funktion (Es gibt keine Fehlermeldung )
-
Hi,ich versuche mich gerade an Code Injection über einen Hook!
Folgender Code,der eigentlich MEssageBoxA hooken soll macht leider nichts,aber ohne Fehler etc...
In diesem Code werden die ersten 5 Bytes der Funktion gespeichert,nach den gespeicherten 5 Byte kommt dann ein Jump zu MessageBox + 6!
MessageBox 1 - 5 wird mit einem Jump zu den gesicherten Bytes überschrieben...
eingentlich sollte bei diesem Code ja noch alles normal ausgeführt werden und das tut es auch!
Aber wenn ich absichtlich Fehler Code dann wird trotzdem alles normal ausgeführt...
Hier der relevante Code in der DLL:void hook_api(void) { char alten5byte[20]; char buffer; DWORD rw = 0; int* originalFunktion = 0x0; int* hookFunktion = 0x0; int* nops = 0x0; int* temp_addr = 0x0; int* temp_addr2 = 0x0; int* sprungweg = 0x0; HANDLE hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId()); /* Addresse der Funktion auslesen */ HINSTANCE hDLL = LoadLibrary("user32.dll"); originalFunktion = (int*)GetProcAddress(hDLL,"MessageBoxA"); FreeLibrary(hDLL); temp_addr = originalFunktion; temp_addr2 = (int*)&nops; for(int i = 0;i < 5;i++) { if(!ReadProcessMemory(hproc,(LPCVOID)temp_addr,&buffer,sizeof(buffer),&rw)) MessageBox(GetForegroundWindow(),"inhalt","name",MB_OK); if(!WriteProcessMemory(hproc,(LPVOID)temp_addr2,&buffer,sizeof(buffer),&rw)) MessageBox(GetForegroundWindow(),"inhalt","name",MB_OK); ++temp_addr ; ++temp_addr2; } ++temp_addr ; ++temp_addr2; sprungweg = sprungoffset(temp_addr2,temp_addr); buffer = 0xE9; WriteProcessMemory(hproc,(LPVOID)temp_addr2,&buffer,sizeof(buffer),&rw); WriteProcessMemory(hproc,(LPVOID)++temp_addr2,&sprungweg,sizeof(sprungweg),&rw); temp_addr2 = originalFunktion; sprungweg = sprungoffset(temp_addr2,nops); buffer = 0xE9; WriteProcessMemory(hproc,(LPVOID)temp_addr2,&buffer,sizeof(buffer),&rw); WriteProcessMemory(hproc,(LPVOID)++temp_addr2,&sprungweg,sizeof(sprungweg),&rw); }int* sprungoffset(int* absprung,int* ziel) { int weg; absprung += 5; weg = ziel - absprung; return (int*)weg; }Könnte es an meinen wilden Casts liegen?
Danke im voraus,
Xalon
-
Xalon_ schrieb:
In diesem Code werden die ersten 5 Bytes der Funktion gespeichert,nach den gespeicherten 5 Byte kommt dann ein Jump zu MessageBox + 6!
Das ist eine sehr schlechte Idee. Du musst Dir schon die Mühe machem, diese ersten Bytes zu analysieren um dann entscheiden zu können, wieviele Bytes Du kopieren musst!
Auch solltest Du die Rückgabewerte von "WriteProcessMemory" auswerten...
-
Ok werde ich machen!
Wegen ben 5 Bytes:Das hab ich schon mit Olly angeschaut
Xalon
Wenns noch nicht funktioniert werd ich hier pushen,k?
-
Ich hab den Cast Salat jetzt erst mal durch Unsigneds ersetzt!
Danach hab ich WriteProcessMemory getestet und siehe da,er macht einen Fehler!
Im Code hab ich mit einem Kommentar(gut sichtbar) den Fehlerhaften Code gekennzeichnet
nur leider konnte ich den Fehler nicht beheben
void hook_api(void) { char alten5byte[20]; char buffer; DWORD rw = 0; unsigned originalFunktion = 0x0; unsigned hookFunktion = 0x0; unsigned nops = (unsigned)&nops; unsigned temp_addr = 0x0; unsigned temp_addr2 = 0x0; unsigned sprungweg = 0x0; HANDLE hproc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId()); /* Addresse der Funktion auslesen */ HINSTANCE hDLL = LoadLibrary("user32.dll"); originalFunktion = (unsigned)GetProcAddress(hDLL,"MessageBoxA"); FreeLibrary(hDLL); temp_addr = originalFunktion; temp_addr2 = nops; for(int i = 0;i < 5;i++) { if(!ReadProcessMemory(hproc,(LPCVOID)temp_addr,&buffer,sizeof(buffer),&rw)) MessageBox(GetForegroundWindow(),"FEHLER!!","FEHLER!!",MB_OK); if(!WriteProcessMemory(hproc,(LPVOID)temp_addr2,&buffer,sizeof(buffer),&rw)) MessageBox(GetForegroundWindow(),"FEHLER!!","FEHLER!!",MB_OK); ++temp_addr ; ++temp_addr2; } ++temp_addr ; ++temp_addr2; sprungweg = sprungoffset(temp_addr2,temp_addr); buffer = 0xE9; if(!WriteProcessMemory(hproc,(LPVOID)temp_addr2,&buffer,sizeof(buffer),&rw)) MessageBox(GetForegroundWindow(),"1.1","1.1",MB_OK); if(!WriteProcessMemory(hproc,(LPVOID)++temp_addr2,&sprungweg,sizeof(sprungweg),&rw)) MessageBox(GetForegroundWindow(),"1.2","1.2",MB_OK); //////////////////////////////////////////////////// //HIER IST DER FEHLER!! ES ERSCHEINEN BEIDE BOXEN!! //////////////////////////////////////////////////// temp_addr2 = originalFunktion; sprungweg = sprungoffset(temp_addr2,nops); buffer = 0xE9; if(!WriteProcessMemory(hproc,(LPVOID)temp_addr2,&buffer,sizeof(buffer),&rw)) MessageBox(GetForegroundWindow(),"2.1","2.1",MB_OK); if(!WriteProcessMemory(hproc,(LPVOID)++temp_addr2,&sprungweg,sizeof(sprungweg),&rw)) MessageBox(GetForegroundWindow(),"2.2","2.2",MB_OK); //////////////////////////////////////////////////// //////////////////////////////////////////////////// //////////////////////////////////////////////////// } //int MessageBox(HWND hWnd,LPCTSTR lpText,LPCTSTR lpCaption,UINT uType); void nops(void) { asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); } unsigned sprungoffset(unsigned absprung,unsigned ziel) { int weg; absprung += 5; weg = ziel - absprung; return weg; }Schon mal Danke im voraus,
Xalon
-
Ich sag nur... VirtualProtect
-
Wieso überschreibst du nicht einfach die Adresse von MessageBoxA in der Import Address Table? Ist doch viel einfacher und ist nicht so eine Frickelarbeit.

-
Ahhhh

Danke!Nach ein bischen googlen ist jetzt folgendes rausgekommen:DWORD dwOldProtect; temp_addr2 = originalFunktion; VirtualProtect((void*)temp_addr2, 16, PAGE_EXECUTE_READWRITE, &dwOldProtect); sprungweg = sprungoffset(temp_addr2,nops); buffer = 0xE9; if(!WriteProcessMemory(hproc,(LPVOID)temp_addr2,&buffer,sizeof(buffer),&rw)) MessageBox(GetForegroundWindow(),"2.1","2.1",MB_OK); if(!WriteProcessMemory(hproc,(LPVOID)++temp_addr2,&sprungweg,sizeof(sprungweg),&rw)) MessageBox(GetForegroundWindow(),"2.2","2.2",MB_OK);Ist der Cast überhaupt korrekt?So weit ich jetzt getestet hab(durch cout) ja!
Naja was ist dann der Fehler? ab temp_addr2 sollten 16byte mit PAGE_EXECUTE_READWRITE gesetzt werden...sollten
Ich hoffe auf deine Hilfe

Xalon@WebNubbi : Ne,wenn schon denn schon

-
WebNubbi schrieb:
Wieso überschreibst du nicht einfach die Adresse von MessageBoxA in der Import Address Table? Ist doch viel einfacher und ist nicht so eine Frickelarbeit.

Funktioniert aber nur in spezialfällen...
-
Rückgabewert von "VirtualProtect"?
-
Schon vor dem Post gecheckt...Die Funktion schlägt fehl!
Aber warum,das weiß ich nicht...danke im voraus,
Xalon
-
Wenn Du so "schwierige" Sachen machen willst, dann musst Du Dich da halt etwas einarbeiten und am besten noch die Doku zu den Funktionen lesen... ich sag nur: "Pages".
Und mein Hinweis mit den "5 bytes" kopieren ohne den ASM-Code zu analysieren hast Du auch noch nicht befolgt... wenn es je gehen sollte, dann ist es zufall und kann sich beim nächsten ServicePack/Hotfix ändern bzw. bei anderen OS-Versionen wird es nicht gehen.
-
Jede API Funktion fängt afaik mit 2x2 bytes und 1x1 byte an

Naja ich werd mal schaun!
-
Xalon_ schrieb:
Jede API Funktion fängt afaik mit 2x2 bytes und 1x1 byte an


-
Na es passt also einfach die ersten 5 Bytes zu sichern

Man reißt dadurch keine Befehle auseinander!
Aber Back to Topic:
Ich find im Netz nichts!Anscheinend klappt bei jedem anderen VirtualProtect...
Wär echt nett von dir wenn du mir weiterhelfen könntest!Danke im voraus,
Xalon
-
Xalon_ schrieb:
Na es passt also einfach die ersten 5 Bytes zu sichern

Nein.
Xalon_ schrieb:
Ich find im Netz nichts!Anscheinend klappt bei jedem anderen VirtualProtect...
Wär echt nett von dir wenn du mir weiterhelfen könntest!Eigentlich ist es ja ganz simpel. Man liest sich die MSDN-Doku dazu durch, und dann würdest Du sofort sehen, was Du falsch machst...
lpAddress
[in] Pointer to the base address of the region of pages whose access protection attributes are to be changed
-
if(!VirtualQuery((void*)temp_addr2,&mbi,sizeof(MEMORY_BASIC_INFORMATION))) MessageBox(GetForegroundWindow(),"VirtualQuery","VirtualQuery",MB_OK); if(!VirtualProtect((void*)mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &dwOldProtect)) MessageBox(GetForegroundWindow(),"VirtualProtect","VirtualProtect",MB_OK);Das hab ich leider auch schon versucht

VirtualQuery wird auch ausgeführt...
Aber VirtualProtect nicht!Warum passt es denn nicht einfach die ersten 5 Bytes zu nehmen?
Xalon
P.S:Danke das du mir hilfst

-
Xalon_ schrieb:
Warum passt es denn nicht einfach die ersten 5 Bytes zu nehmen?
Da es einige Routinen gibt, die nicht mit 5 "passenden" ASM-Bytes anfangen... (schau einfach mal z.B. mittels windbg nach)...
Bsp:
- DbgPrint
- GetStartupInfoA
- GetEnvironmentStringsW
- InterlockedExchange
- InterlockedExchangeAdd
-
Das ist mir schon klar aber ich will ja nur eine Funktion Hooken

Und da schau ich dann immer mit OllyDBG nach!Du weißt nicht warum VirtualProtect immernoch nicht funktioniert,oder?
Danke im voraus,
Xalon
-
Mach es doch zuerst mal mit Deinem eigenen Prozess und dann kannst Du schön debuggen und du kannst auch GetLastError auswerten...
-
Ahh...GetLastError von VirtualProtect gibt mir
487
ERROR_INVALID_ADDRESSLoadlibrary und GetProcAddress funktionieren aber einwandfrei!
Ich hab die zurückgegebene Adresse sogar nochmal mit Olly geprüft und es ist definitiv die von MessageBoxA!Der Fehler muss also im ersten Parameter von VirtualProtect liegen!
mbi.BaseAddress0 = 0x7777b000
mbi.RegionSize = 4608000 !
Ich kann leider keinen Fehler finden
VirtualQuery funktioniert übrigens auch (laut Rückgabewert
)
oder ... hmmm ... daran könnte es doch liegen,aber da finde ich leider auch
keinen Fehler!Ich hab jetzt hier im Forum und in Google gesucht aber leider nichts gefunden
warum VirtualProtect ERROR_INVALID_ADDRESS zurückgibt ...
Ich hoffe du kannst mir helfen und das deine Nerven nicht an mir ... verrecken

Danke im voraus,
Xalon