Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding
You last visited: Today at 18:50

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



return vom call

Discussion on return vom call within the General Coding forum part of the Coders Den category.

Reply
 
Old   #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
PainToTheWorld is offline  
Old 07/27/2011, 00:29   #2


 
buFFy!'s Avatar
 
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
buFFy! is offline  
Thanks
1 User
Old 07/27/2011, 22:57   #3


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
GetExitCodeThread
MrSm!th is offline  
Old 07/28/2011, 06:50   #4
 
xNopex's Avatar
 
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.
xNopex is offline  
Old 07/28/2011, 17:28   #5


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
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
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.
MrSm!th is offline  
Old 07/28/2011, 23:49   #6
 
xNopex's Avatar
 
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?
xNopex is offline  
Old 07/29/2011, 00:32   #7


 
MrSm!th's Avatar
 
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
MrSm!th is offline  
Old 07/30/2011, 07:01   #8
 
link's Avatar
 
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.
link is offline  
Thanks
1 User
Old 07/30/2011, 11:19   #9
 
elite*gold: 0
Join Date: Sep 2010
Posts: 132
Received Thanks: 29
alles klar es geht vielen dank
PainToTheWorld is offline  
Old 07/30/2011, 11:42   #10


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
Ich bin schreibfaul, CreateRemoteThread
MrSm!th is offline  
Old 07/30/2011, 16:17   #11
 
xNopex's Avatar
 
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..
xNopex is offline  
Old 07/30/2011, 16:22   #12


 
MrSm!th's Avatar
 
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.
MrSm!th is offline  
Old 07/30/2011, 16:29   #13
 
xNopex's Avatar
 
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.
xNopex is offline  
Old 07/30/2011, 17:16   #14
 
link's Avatar
 
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
link is offline  
Old 07/30/2011, 18:07   #15


 
MrSm!th's Avatar
 
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
MrSm!th is offline  
Reply


Similar Threads Similar Threads
[TAUSCHE]Call call of duty modern warfare 2 gegen Battlefield Bad Company 2
08/09/2011 - Origin Trading - 8 Replies
wie es bereits im titel steht tausche ich cod 6 gegen Bad Company 2 bei interesse gibts fotos vom steam acc und alles andere per pn :D



All times are GMT +2. The time now is 18:50.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.