Funktionen ohne DLL aufrufen.

06/05/2011 23:12 theredvex#1
Moin.

Ich hatte letztens ein Tutorial im Internet gefunden, in dem beschrieben war, wie man Funktionen in einem Spiel oder Programm aufruft ohne eine DLL injection. Hat da vielleicht jemand eine ahnung von, ein tutorial oa.
Ist das überhaupt möglich oder war das Fake?..

Schönen abend noch.
TheRedVex
06/05/2011 23:15 xNopex#2
Kommt drauf an. Wenn die Funktionen durch ein Event ausgelöst werden, kann man sie dadurch aufrufen, dass man das Event simuliert. Wird sicherlich passende Funktionen aus der WinAPI geben.
Anders kann ich mir das schlecht vorstellen.
06/06/2011 02:15 MrSm!th#3
CreateRemoteThread + inline asm:

call zur funktion in asm schreiben
call in den prozess schreiben
CreateRemoteThread

ist aber deutlich mehr arbeit o.ô
06/06/2011 12:51 Akorn#4
Quote:
Originally Posted by MrSm!th View Post
CreateRemoteThread + inline asm:

call zur funktion in asm schreiben
call in den prozess schreiben
CreateRemoteThread

ist aber deutlich mehr arbeit o.ô
Die Funktion des Spiels direkt mit CreateRemoteThread aufrufen!
06/06/2011 13:11 MrSm!th#5
geht nur, wenn sie höchstens einen parameter hat, ansonsten musst du den call und die pushes selbst schreiben und den remote thread erstellen
06/06/2011 21:29 Akorn#6
Quote:
Originally Posted by MrSm!th View Post
geht nur, wenn sie höchstens einen parameter hat, ansonsten musst du den call und die pushes selbst schreiben und den remote thread erstellen
Um mehrere Parameter zu übergeben kann man einfach die Parameter in ein Array schreiben und beim CreateRemoteThread aufruf die Adresse des Arrays übergeben.
06/06/2011 21:48 MrSm!th#7
Ähm nö, dann wird ja nur die Adresse des Arrays übergeben.

Sehen wir uns mal folgendes Beispiel an:

Code:
int somefunc(int x, int y, int z)
{
    return x+y*z;
}
Würde man nun CreateRemote mit einem Array aufrufen, würde es intern ungefähr so ablaufen:

Code:
int ArrayXYZ[3] = { 1, 2, 3 }; //das sei jetzt mal nicht statisch sondern dynamisch alloziiert

DWORD CallThreadEntryPoint( LPTHREADSTART_ROUTINE ThreadAddress, LPVOID param)
{
    return ThreadAddress(param);
}

CallThreadEntryPoint(somefunc, ArrayXYZ); // ThreadAddress(ArrayXYZ) != ThreadAddress(ArrayXYZ[0], ArrayXYZ[1], ArrayXYZ[2]) da ja nur die Adresse, nicht aber der Inhalt des Arrays übergeben wird.
somefunc würde hier also falsche stackwerte nutzen ;O
06/06/2011 21:53 xNopex#8
Quote:
Um mehrere Parameter zu übergeben kann man einfach die Parameter in ein Array schreiben und beim CreateRemoteThread aufruf die Adresse des Arrays übergeben.
My-Prototyp(Example):
Code:
bool __cdecl Bla(int* pI, int i, char* test, int len)
Ja, erstell mal dein Array :-/

EDIT: Definitiv zu lahm und nicht multitasking-fähig
06/06/2011 22:40 Akorn#9
Quote:
Originally Posted by MrSm!th View Post
Ähm nö, dann wird ja nur die Adresse des Arrays übergeben.

Sehen wir uns mal folgendes Beispiel an:

Code:
int somefunc(int x, int y, int z)
{
    return x+y*z;
}
Würde man nun CreateRemote mit einem Array aufrufen, würde es intern ungefähr so ablaufen:

Code:
int ArrayXYZ[3] = { 1, 2, 3 }; //das sei jetzt mal nicht statisch sondern dynamisch alloziiert

DWORD CallThreadEntryPoint( LPTHREADSTART_ROUTINE ThreadAddress, LPVOID param)
{
    return ThreadAddress(param);
}

CallThreadEntryPoint(somefunc, ArrayXYZ); // ThreadAddress(ArrayXYZ) != ThreadAddress(ArrayXYZ[0], ArrayXYZ[1], ArrayXYZ[2]) da ja nur die Adresse, nicht aber der Inhalt des Arrays übergeben wird.
somefunc würde hier also falsche stackwerte nutzen ;O
Ich hab im I-net aber schon öfters gelesen das man sie in einem Array ode struktur übergeben kann. Ich selbst injektiere für sowas einfach eine Dll von daher hab ich das selbst noch nie ausprobiert.
Hab auch gerade nochmal nen bisschen im web nachgeschaut, ansich geht es wohl schon aber nur mit erheblich mehraufwand.
06/06/2011 22:45 xNopex#10
Natürlich kann man einen Pointer auf eine Strukur oder ein Array an einen Thread übergeben. Siehe den Thread-Prototyp:

Code:
DWORD WINAPI Thread(LPVOID)
Eine beliebige Funktion hat aber leider nur sehr selten den gleichen Protoyp, weswegen das so nicht funktionieren wird.
06/11/2011 21:24 Bot_interesierter#11
Ein weiteres Problem bestehst darin das Öfters ein bestimmter Threadcontext für eine Funktion von Nöten ist, oder die Funktionen schlicht nicht Threadsicher sind, also kommt man um einen Detour an irgendeiner stelle nicht herum und das geht nunmal am einfachsten mit Dllinjection.
Es ist natürlich möglich mit Codeinjektion und Interprocesscomunication zu arbeiten, allerdings ist das absolut blödsinniger Mehraufwand, der im übrigen nicht mehr Sicherheit bietet als das sogenannte Manualmapping, bei dem die Dll nicht über die LoadLibrary API in den Prozess geladen wird, so dass bestimmte Strukturen die der WindowsAPI Auskunft über die DLL geben nicht erstellt werden.
06/13/2011 18:13 Medix#12
Machs mit dll injection. Macht die dinge um einiges leichter.

Dll injection heißt ja nicht gleich ,dass du gebannt wirst.