[c++]wäre das theoretisch möglich...

07/22/2010 12:43 Tyrar#1
... eine funktion im prozess mit CreateRemoteThread auszuführen (also das an sich schon), nur eben dass man eine struct erstellt, die den gleichen aufbau des normalen call stacks hat?
und könnte man wenn der thread durch is, mit GetThreadContext den return wert aus EAX auslesen?

pseudo code:
Code:
struct stackrip
{
DWORD ptr1;
DWORD ptr2;
}

...

stackrip x;
x.ptr1 = (DWORD)VirtualAllocEx(...);
x.ptr2 = (DWORD)VirtualAllocEx(...);
LPVOID lpX = VirtualAllocEx(/*sizeof(x) zum lesen/schreiben freigeben*/);
WriteProcessMemory(/*x an lpX schreiben*/);
HANDLE hThread = CreateRemoteThread(hProc,0,0,(LPTHREAD_START_ROUTINE)0xDEADBEEF,lpX,0,0);
WaitForSingleObject(hThread,INFINITE);
CONTEXT ctx;
GetThreadContext(hThread,&ctx);
DWORD ret_urn = ctx.Eax;
wenn ich da nich schon genügend fehler drin habe XD (parameter bei VirtualAllocEx sind mit absicht weg ;));
07/22/2010 14:49 Bot_interesierter#2
Denk einfach mal genau nach was CreateRemoteThread macht...

lpParameter wird als der LPTHREAD_START_ROUTINE als Argument übergeben, es funktioniert nicht so wie du dir das vorstellst das deine Struktur dann plötzlich der Stack ist...

Der nächste Logische Fehler den du machst ist, dass du darauf wartest dass der Thread terminiert, wie willst du danach noch einen sinnvollen Kontext auslesen?

Allerdings ist es natürlich möglich mit Hilfe von CreateRemoteThread und VirtualAllocEx eine Funktion im Zielprozess auszuführen, dazu musst du einen Call Stub bauen an den du den nötigen Code schreibst um die Funktion mit den Argumenten die du haben möchtest aufzurufen, dass heißt du reservierst dir Speicher als Read/Write/Execute, so dass du CreateRemoteThread auf deinen Code Stub aufrufen kannst, wenn du irgendwelche Rückgabewerte der Aufgerufenen Funktion auslesen willst, dann muss das natürlich dein Codestub regeln, also mit einer beliebigen IPC Methode die Daten übermitteln, zb über Named Pipes und du lässt deinen Prozess einfach auf die Antwort aus dem Code Stub warten.
07/22/2010 15:25 Tyrar#3
Quote:
Originally Posted by Bot_interesierter View Post
Denk einfach mal genau nach was CreateRemoteThread macht...

lpParameter wird als der LPTHREAD_START_ROUTINE als Argument übergeben, es funktioniert nicht so wie du dir das vorstellst das deine Struktur dann plötzlich der Stack ist...

Der nächste Logische Fehler den du machst ist, dass du darauf wartest dass der Thread terminiert, wie willst du danach noch einen sinnvollen Kontext auslesen?

Allerdings ist es natürlich möglich mit Hilfe von CreateRemoteThread und VirtualAllocEx eine Funktion im Zielprozess auszuführen, dazu musst du einen Call Stub bauen an den du den nötigen Code schreibst um die Funktion mit den Argumenten die du haben möchtest aufzurufen, dass heißt du reservierst dir Speicher als Read/Write/Execute, so dass du CreateRemoteThread auf deinen Code Stub aufrufen kannst, wenn du irgendwelche Rückgabewerte der Aufgerufenen Funktion auslesen willst, dann muss das natürlich dein Codestub regeln, also mit einer beliebigen IPC Methode die Daten übermitteln, zb über Named Pipes und du lässt deinen Prozess einfach auf die Antwort aus dem Code Stub warten.
alles klar thx, ich habs jetzt so geregelt dass ich nen stub geschrieben habe, der ne struct als parameter erwartet, von da aus wie du geschrieben hast dann die funktion aufrufen.
hab grad rausgefunden dass ich überhaupt keine return werte brauche ^.^
dann muss ich jetzt nurnoch dafür sorgen dass der stub RICHTIG generiert wird.....
07/23/2010 14:11 rEdoX#4
[Only registered and activated users can see links. Click Here To Register...]
07/30/2010 09:46 Tyrar#5
Quote:
Originally Posted by rEdoX View Post
[Only registered and activated users can see links. Click Here To Register...]

omfg warum bin ich nich selbst drauf gekommen? -.-:mad: