return vom call

07/27/2011 00:10 PainToTheWorld#1
hi
also ich rufe eine funktion mit createremotethread auf
was kein problem ist aber wie bekomme ich ein return daraus?
bin für jede hilfe dankbar
07/27/2011 00:29 buFFy!#2
kann an der uhrzeit liegen aber ich wüsste nicht das das geht. erste idee wäre die funktion entweder zu kopieren und zu modifizeren (return rausziehen) oder zu hooken. kann aber auch sein das das geht, hatte nen harten tag :P
07/27/2011 22:57 MrSm!th#3
GetExitCodeThread
07/28/2011 06:50 xNopex#4
Er kann auch über den Parameter-Zeiger arbeiten, wenn er gerne was anderes als ein DWORD zurückbekommen möchte.
07/28/2011 17:28 MrSm!th#5
Quote:
Originally Posted by xNopex View Post
Er kann auch über den Parameter-Zeiger arbeiten, wenn er gerne was anderes als ein DWORD zurückbekommen möchte.
So wie ich das verstanden habe, ruft er die Funktion direkt mit CRT auf und erstellt keine Codecave.
Ich bezweifle, dass die Funktion so nett ist und ihm den Parameter ausfüllt :p
Und für eine eigene Code Cave muss man dann ja wieder Speicher für den Parameter alloziieren und den Pointer dann im externen Programm aufbewahren...

Ach ja, wieso sollte man den dafür brauchen?
Den Rückgabewert kannst du auch casten, wenn du gerne etwas anderes als einen DWORD Wert hättest.
Und wenn es eben größer ist, zb. eine Klasse, gibst du eben einen Pointer zurück.
Ist doch wesentlich angenehmer, als über den Parameter zu arbeiten.
07/28/2011 23:49 xNopex#6
Hingebatzter-Code:
Code:
DWORD WINAPI MyThread(LPVOID lpParam)
{
    RETURN_STRUCT* pReturn = reinterpret_cast<RETURN_STRUCT*>(lpParam);
    ...
    pReturn->ret1 = "blaaa";
    pReturn->ret2 = 55;
    pReturn->ret3 = new OBJECT(...);

    return 0;
}


RETURN_STRUCT return;
CreateRemoteThread(handle, &attributes, 0, MyThread, &return, 0, NULL);
Was war da jetzt so schwer dran? :)

Quote:
Den Rückgabewert kannst du auch casten, wenn du gerne etwas anderes als einen DWORD Wert hättest.
Und wenn es eben größer ist, zb. eine Klasse, gibst du eben einen Pointer zurück.
Ist doch wesentlich angenehmer, als über den Parameter zu arbeiten.
Sowas tut man doch nicht O.O Hast du getrunken?
07/29/2011 00:32 MrSm!th#7
In diesem Bereich schon.

Wer CRT dafür missbraucht, eine Funktion im anderen Prozess aufzurufen, die selbst nicht direkt als Thread-Funktion gedacht ist, der kann auch verkraften, einen evtl. Pointer-Rückgabewert zu casten :rolleyes:
07/30/2011 07:01 link#8
@MrSm!th:
Was genau meinst du jetzt mit CRT?

@xNopex:
Wo liegt der Sinn, CreateRemoteThread fuer so etwas zu benutzen?
Dein Code scheint jetzt nicht viel damit zu tun zu haben, eine Funktion in einem anderen Prozess aufzurufen.
Und wenn man es so machen wollte wie in deinem Beispiel, muesste man die Struktur erst einmal im Prozess alloziieren und spaeter auslesen, was jetzt nicht gerade komfortabel ist, ausser wenn es halt sein muss.


Wie MrSm!th schon geschrieben hat:
Den Rueckgabewert eines Threads bekommst du mit GetExitCodeThread.

Code:
HANDLE hThread = CreateRemoteThread(_Prozess, NULL, _Adresse, 0, NULL, 0, NULL);
WaitForSingleObject(hThread, INFINITE);
DWORD ret;
GetExitCodeThread(hThread, &ret);
Wenn der Rueckgabewert ein Pointer sein sollte, musst du halt noch ReadProcessMemory zum Auslesen verwenden.
07/30/2011 11:19 PainToTheWorld#9
alles klar es geht vielen dank
07/30/2011 11:42 MrSm!th#10
Ich bin schreibfaul, CreateRemoteThread :p
07/30/2011 16:17 xNopex#11
Quote:
Wo liegt der Sinn, CreateRemoteThread fuer so etwas zu benutzen?
Das musst du den TS fragen, nicht mich.

Quote:
Und wenn man es so machen wollte wie in deinem Beispiel, muesste man die Struktur erst einmal im Prozess alloziieren und spaeter auslesen, was jetzt nicht gerade komfortabel ist, ausser wenn es halt sein muss.
In der Tat habe ich etwas vorschnell geantwortet, mir das nicht detailliert durchgelesen und dementsprechend nicht ganz gerafft, dass wir es hier mit CreateRemoteThread zu tun haben und nicht mit CreateThread.

Dennoch sträube ich mich ein bisschen gegen den Zeiger-Return-Wert. Gemäß MSDN gibt der Return-Wert an, ob die Funktion erfolgreich war oder nicht. Gut nun kann man argumentieren, dass ein NULL-Zeiger ansagt, dass dick gefailed wurde und alles ungleich 0 für Erfolg steht. Akzeptiere ich. Dennoch bevorzuge ich die Paramter-Variante, sofern möglich. Ich finde es ist v.a. für fremde, die den Code verstehen wollen, einfacher nachzuvollziehen, was getan wird. Adressen als DWORD zurückzugeben und dann zu casten ist nicht gerade üblich in der Alltagsprogrammierung..
07/30/2011 16:22 MrSm!th#12
Du hast aber einen kleinen Denkfehler.
Der Kommentar in der MSDN gilt nur solange, wie man mit CRT auch wirklich eine Funktion als Thread-Entry nimmt, die auch dafür bestimmt ist.

Bestes Beispiel dafür, dass es auch anders geht, ist ein Injector. Er gibt als Entry die LoadLibrary API an und ihr Rückgabewert ist ein Handle zur Dll.
Da CRT dafür eigentlich nicht gedacht ist, ist klar, dass in der MSDN erstmal steht, dass es ein DWORD ErrorCode ist, trotzdem ist es in diesem Fall etwas anderes.

Du kannst dich hier nicht haargenau an die MSDN halten, da du die Funktion ja sowieso schon für etwas missbrauchst, für das sie nicht gedacht ist.
07/30/2011 16:29 xNopex#13
Da magst du Recht haben, aber ich bin mal davon ausgegangen, dass der TS wirklich eine dem definierten Prototyp entsprechende Funktion mit CreateRemoteThread aufruft. Andernfalls kann es wirklich egal sein.
07/30/2011 17:16 link#14
Versteh ich nicht ganz.
In der MSDN steht bei GetExitCode doch ausdruecklich:

Quote:
lpExitCode [out]
A pointer to a variable to receive the thread termination status.For more information, see Remarks.
Remarks
*The exit value specified in the ExitThread or TerminateThread function.
*The return value from the thread function.
Wo liegt das Problem?
Man bekommt also den Wert, der bei den genannten API Funktionen, die den Thread betreffen, uebergeben wird bzw. den Wert von eax am Ende der Funktion, da beim retn zu einer ExitThread-Stub gesprungen wird, und somit hat man praktisch das "return 123" der Funktion, die man als Thread gestartet hat

Man kann also Funktionen, die keinen oder nur einen Parameter erwarten, direkt mit CreateRemoteThread aufrufen und den Rueckgabewert via GetExitCodeThread abfragen, ansonsten muss man einen Wrapper fuer den Funktionsaufruf injizieren.

MrSm!th, die paar Buchstaben?..
Ich dachte jetzt an C RunTime. Es war 7 Uhr, ich bin da echt nicht auf CRT = CreateRemoteThread gekommen :P
07/30/2011 18:07 MrSm!th#15
Tja so bin ich ;O

Naja, im Grunde hast du Recht, Nopex ging es aber darum, was für eine Art Rückgabewert mit GetExitCodeThread geholt wird.
Laut MSDN gibt ein Thread ja einen ErrorCode zurück, der darüber Auskunft gibt, ob der Thread wie geplant ausgeführt wurde.

Und für jemanden, der so an einem guten Stil hängt, ist es dann natürlich ein Graus, so etwas für zb. einen Pointer o.Ä. als Rückgabewert zu missbrauchen :p