C++ Call Game Func

10/20/2013 05:34 meak1#1
Jo hi, finde nichts in google, bzw weiß nicht genau was ich googlen soll :/

Will eine Game function callen, bloß außerhalb eines Processes ;E

Also einfach eine Addresse Callen außerhalb eines Games..

Vielen Dank ;D
10/20/2013 11:27 Jeoni#2
[Only registered and activated users can see links. Click Here To Register...] sollte dir da von Nutzen sein. Ist die Funktion, die du im Spiel aufrufen möchtest ein thiscall (oder irgendeine außergewöhnliche calling convention) oder braucht sie mehr als einen Parameter, dann musste erst mit [Only registered and activated users can see links. Click Here To Register...] eine kleine Funktion in's Spiel schreiben, welche die eigentlich aufzurufene Gamefunction dann korrekt aufruft. Dann rufst mit mit CreateRemoteThread eben deine in's Spiel geschriebene Funktion auf, welche dann die Spielfunktion aufruft.
Hoffe, dass ich helfen konnte ;)
Jeoni
10/20/2013 11:36 Schlüsselbein#3
Was macht die Funktion? Wann soll sie aufgerufen werden und was ist das für ein Prozess?
Es gibt mehrere Möglichkeiten, das hängt eigentlich immer von den obigen Fragen ab.

Ein neuer Thread kann für allerlei ärger im Prozess sorgen, deswegen wäre ich damit erstmal vorsichtig.
10/20/2013 18:53 meak1#4
In League of legends wollt ich im Launcher anfangs die func WinHttpOpenRequestA callen direkt in der .exe mit parametern/argumenten und wollt nicht unbedingt ne Dll injection :/
10/21/2013 18:25 Omdi#5
Und wieso musst du unbedingt die vom Launcher callen?
Kannst sie ja auch selbst callen ;o
10/22/2013 13:28 meak1#6
Ja könnte man aber dann macht der launcher ja auch nix :/
10/23/2013 15:08 Nightblizard#7
Der wird auch nichts machen, wenn du die Funktion in einem neuen Thread aufrufen wirst. Du musst den Hauptthread des Programmes dazu bringen die Funktion aufzurufen, bzw. die Funktion, die dann was auch immer du vorhast macht. Du gehst die Sache also vollkommen falsch an.
10/25/2013 12:41 meak1#8
Nein, ich will sie ja nicht in einem neuen thread aufrufen. Ich will sie ja dort direkt callen.
Es funzt ja auch mit ner dll injection aber wollte es halt von auserhalb callen :/

Naja wenn ich zeit hab, probier ich mal was jeoni sagte.
Wusste halt nicht was ich googlen sollte, dachte viell hat wer sone func schon parat weil er dies auch mal gemacht hat...
10/25/2013 13:45 Nightblizard#9
[Only registered and activated users can see links. Click Here To Register...]
Quote:
Originally Posted by msdn
Creates a thread that runs in the virtual address space of another process.
jeonis Methode erstellt einen neuen Thread, macht also genau das, was du nicht willst. Das was du vor hast ist nicht* möglich.


* Für Klugscheißer: es ist für den Laien nicht möglich. Du könntest da z.B. sicher was übers EIP Register pfuschen, aber da musst du so dermaßen viele schmutzige Tricks benutzen, dass das nicht zu mehr als einem Gedankenspiel taugt.
Also vergiss das Ganze und injecte einfach eine .dll, denn es gibt keine Gründe die dagegen sprechen.
10/25/2013 13:57 MrSm!th#10
Inwiefern soll eine Dll-Injection einen Unterschied machen? Die Dll wird doch ebenfalls in einem eigenen Thread geladen. Wenn man nicht selbst in völlig anderem Kontext die Funktion aufrufen will, sondern den Launcher dazu bringen will sie selbst aufzurufen, dann muss man so oder so hooken/patchen und das geht extern wie auch intern.
10/25/2013 18:33 Master674b#11
Man könnte z.B. im Thread das Single-Step Flag setzen und dann in einem VEH die Ausnahme abfangen und die Funktion ausführen die man möchte, danach aus dem VEH returnen. Ist zwar nicht so effizient aber das dürfte klappen. Dann muss man nichts patchen... und der aktuelle Thread Kontext wird sowieso gespeichert. :D
10/26/2013 00:03 MrSm!th#12
Eine Form des Hookings..
Kann man aber genau so von außen. Im Hacking Bereich wirds nunmal auch schmutzig, Nightblizzard.
10/26/2013 09:37 Omdi#13
Quote:
Originally Posted by Master674b View Post
Man könnte z.B. im Thread das Single-Step Flag setzen und dann in einem VEH die Ausnahme abfangen und die Funktion ausführen die man möchte, danach aus dem VEH returnen. Ist zwar nicht so effizient aber das dürfte klappen. Dann muss man nichts patchen... und der aktuelle Thread Kontext wird sowieso gespeichert. :D
Da könnte man doch auch HW BPs benutzen, ich weiß jetzt gerade nicht was von beidem man bevorzugen sollte bzw. was effizienter ist :confused:

Eigentlich müsste die im Zitat genannte Methode uneffizienter sein, da sie im Thread das Single-Step Flag setzt. Aber wie gesagt, bin mir da nicht so sicher :D
10/26/2013 13:59 MrSm!th#14
Oh richtig, Singlestep, hab bei Singlestep direkt an Hwbps gedacht, weil sie ja dieselbe Ausnahme schmeißen :S Dann ist das natürlich nicht wirklich mit Hooking zu bezeichnen, sorry Master. Allerdings stelle ich mir das problematisch vor, einfach irgendwann das Singlestep Flag zu setzen und was eigenes zu machen.

@Omdi
Wo willst du den Hwbp denn hinsetzen? Du brauchst dafür ja eine bekannte Adresse. Das Singlestep Flag breakt einfach beim nächsten Step. Der Hwbp breakt an einer determinierten Stelle (was ich mir aber sowieso hier unproblematischer vorstelle, weil man dann den Zustand der Register etc. kennt). Das sind zwei unterschiedliche Funktionsweisen und somit nicht wirklich vergleichbar. Performancemäßig werden die sich nicht viel tun. Deine Begründung kann ich nebenbei nicht ganz nachvollziehen.
10/26/2013 17:02 XxharCs#15
Du müsstest es dir so vorstellen, als würdest du eine Funktion aus einer DLL aufrufen..
Sprich zb du hast in deiner DLL
Code:
#ifdef __cplusplus
extern "C" {
#endif
        __declspec(dllexport) int __cdecl crWindow(HINSTANCE hInstance)
        {

... usw.
Dann callst du es ja eig dann so:
Code:
typedef int (__cdecl *FUNCI)(HINSTANCE);

int main(int argc, char* argv[])
{
        INSTANCE hInstance = (HINSTANCE)GetWindowLong(hwndConsole, GWL_HINSTANCE);
.....
        HINSTANCE lib;
        FUNCI funci;

        lib = LoadLibrary("./exampleLib.dll");
        if (lib != 0){
                
                printf("exampleLib successfully loaded!\n\n");

                funci = (FUNCI)GetProcAddress(lib, "crWindow");
                if (NULL != funci)
                {
                        fRunTimeLinkSuccess = TRUE;
                        (funci) (hInstance);
                }


                fFreeResult = FreeLibrary(lib);
....
Nur in deinem Fall wüsste ich nicht wie du auf den Funktionsnamen kommst oder wie auch immer.
Mit so einem Prinzip sollte es etwa funktionieren oder etwa nicht?

Falls ich mich geirrt hab, dann sry(!), bin in dem Gebiet seit einiger Zeit eingerostet :P


Edit: Kommt dann eig auf das raus, was Smith gesagt hat, hooken/patchen oder?