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
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
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.
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.
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
@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.
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 **** 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..
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.
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.
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
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