|
You last visited: Today at 18:50
Advertisement
return vom call
Discussion on return vom call within the General Coding forum part of the Coders Den category.
07/27/2011, 00:10
|
#1
|
elite*gold: 0
Join Date: Sep 2010
Posts: 132
Received Thanks: 29
|
return vom call
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
|
#2
|
elite*gold: 1826
Join Date: Mar 2009
Posts: 4,310
Received Thanks: 6,283
|
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
|
#3
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
GetExitCodeThread
|
|
|
07/28/2011, 06:50
|
#4
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
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
|
#5
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
Quote:
Originally Posted by xNopex
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.
|
|
|
07/28/2011, 23:49
|
#6
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
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
|
#7
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
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
|
|
|
07/30/2011, 07:01
|
#8
|
elite*gold: 1
Join Date: Jul 2005
Posts: 553
Received Thanks: 451
|
@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
|
#9
|
elite*gold: 0
Join Date: Sep 2010
Posts: 132
Received Thanks: 29
|
alles klar es geht vielen dank
|
|
|
07/30/2011, 11:42
|
#10
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
Ich bin schreibfaul, CreateRemoteThread
|
|
|
07/30/2011, 16:17
|
#11
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
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 **** 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
|
#12
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
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
|
#13
|
elite*gold: 0
Join Date: May 2009
Posts: 827
Received Thanks: 471
|
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
|
#14
|
elite*gold: 1
Join Date: Jul 2005
Posts: 553
Received Thanks: 451
|
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
|
#15
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
|
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
|
|
|
All times are GMT +2. The time now is 18:50.
|
|