Externer Aufruf von Prozessfunktionen

08/07/2010 11:36 Nulpe123#1
Hallo zusammen,

ich bräuchte mal eure Hilfe:

Ich möchte gerne ein Programm schreiben, mit dem ich eine Funktion in einem fremden Prozess (In diesem Fall ist das eine Funktion mit 3 Eingabeparametern, die einen Mapwechsel in einem Spiel frühzeitig ermöglicht) zu einem beliebigen Zeitpunkt per Knopfdruck auslösen kann. Ich habe bereits einige Tutorials zum Thema DLL-Injektion gelesen, mit der das wohl möglich sein soll. Allerdings habe ich nur Tutorials gefunden, die in dem fremden Prozess eine msg-box auslösen. Das ist natürlich auch schön aber hilft mir nicht wirklich weiter :rolleyes:
Gibt es eine Möglichkeit das o.g. möglichts einfach zu bewergstelligen?

Noch etwas am Rande:
-Meine bevorzugte Programmiersprache ist VB.net
-Bitte verwendet in euren Antworten möglichts viele Code Beispiele, da ich mir die Funktion daran am ehesten erklären kann

Ich freue mich über jede Hilfe!
08/07/2010 11:51 ●ROBBY●#2
Ich kenn mich damit zwar nicht wirklich aus aber soviel weiß ich: Du musst erstmal mit OllyDbg die Funktion zum Mapwechsel finden und dann mit Dll-Injektion den benötigten Assembler Code injizieren (korrigiert mich wenn ich falsch liege).
Das Thema interessiert mich nämlich auch brennend aber soviel wie ich gehört habe ist das nichts für Anfänger sondern schon eher für Fortgeschrittene.
08/07/2010 13:11 Akorn#3
Du kannst das mit CreateRemoteThread machen.
Eine Dll injection kannst aber vergessen weill du VB.net benutzt.
08/07/2010 16:32 Nulpe123#4
Quote:
Originally Posted by Akorn View Post
Eine Dll injection kannst aber vergessen weill du VB.net benutzt.
Das ist mir schon klar. Ich werde mich natürlich auf die notwendigen Sprachen einstellen.
08/07/2010 19:04 Nulpe123#5
Wie ich eine DLL in einen Prozess bekomme habe ich jetzt anhand mehrer Tutorials verstanden.
Allerdings weiß ich immernoch nicht was in der dll stehen soll. Es soll schließlich kein Biep oder eine msg box kommen sondern es soll die Funktion GoZone(int,int,int) (den Namen dieser Funktion kenn ich bereits) aus dem injizierten Prozess ausgeführt werden.
Der Inhalt einer solchen dll würde mich schon enorm weiterbringen.
08/07/2010 19:06 ●ROBBY●#6
[Only registered and activated users can see links. Click Here To Register...]
08/07/2010 19:09 Bl@ze!#7
Du brauchst die Addresse der GoZone() funktion, die du aufrufen möchtest.
Das ganze Kapitel nennt sich übrigens "Funktionszeiger" , was du dafür kennen musst. (Neben der normalen MsgBox DLL Injektion :D )
[Only registered and activated users can see links. Click Here To Register...]
08/07/2010 23:11 Nulpe123#8
Quote:
Originally Posted by Unkn0wn0x View Post
[Only registered and activated users can see links. Click Here To Register...]
Da habe ich die Seite doch tatsächlich in einer deutschen Kurzfassung gefunden: [Only registered and activated users can see links. Click Here To Register...] :)

Stück für Stück komm ich voran, danke euch 2
08/08/2010 14:27 nkkk#9
lol.
Aber jetzt mal ernst:
  • die dll solltest du in c++ schreiben
  • Die adresse kannst du mit einer winapi funktion (getprocadress glaub ich) herausfinden
  • gozone ist eine memberfunktion! also thiscall.

Ps: wenn ich zuhause bin kann ich vieleicht auch ein codebeispiel posten.
08/08/2010 19:35 Nulpe123#10
Quote:
Originally Posted by nkkk View Post
Ps: wenn ich zuhause bin kann ich vieleicht auch ein codebeispiel posten.
Das wäre super nett :)
08/08/2010 19:55 SmackJew#11
Schritt 1: Verabschiede dich von VB und .NET.

Ansonsten, wenn du nur 'ne Funktion callen willst, erstelle 'nen Thread im Spiel (CreateRemoteThread) und rufe deine Funktion per inline ASM oder Funktionszeiger auf.
08/08/2010 20:18 nkkk#12
Quote:
Originally Posted by SmackJew View Post
Schritt 1: Verabschiede dich von VB und .NET.

Ansonsten, wenn du nur 'ne Funktion callen willst, erstelle 'nen Thread im Spiel (CreateRemoteThread) und rufe deine Funktion per inline ASM oder Funktionszeiger auf.
Ich hab es mit inline asm gemacht.
08/08/2010 22:00 Nulpe123#13
Einen Injector habe ich soeben mit Hilfe eines Tutorials in VB.net 2008 geschrieben. Ob der auch wirklich was taugt kann ich leider nicht sagen, denn es fehlt mir noch die .dll und da habe ich leider keine Ahnung was da jetzt drin stehen soll. Ich werde die Tage noch ein bisschen danach googlen.

Für Tipps bin ich trotzdem immernoch offen ;)


Edit: Der Injektor funktioniert einwandfrei :D
08/10/2010 16:07 Nulpe123#14
Ich bin jetzt soweit, dass ich meine eigne kleine .dll geschrieben habe. Injekten lässt die sich auch so weit ohne Probleme, allerdings macht sie nicht das, was sie machen soll.

Code:
MessageBox(NULL, TEXT("Erfolgreich injectet"), NULL, MB_OK);

	typedef UINT (CALLBACK* LPFNDLLFUNC1)(UINT, UINT, UINT);

HINSTANCE hDLL;               // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
int  uParam1 = 2, uParam2 = 0, uParam3 = 149, uReturnVal;

hDLL = LoadLibrary(TEXT("Engine.dll"));
if (hDLL != NULL)
{
   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
                                           "GoZone");

		MessageBox(NULL, TEXT("Startet..."), NULL, MB_OK);

   lpfnDllFunc1(uParam1, uParam2, uParam3);

		MessageBox(NULL, TEXT("Ausgeführt"), NULL, MB_OK);
Die erste msg box erscheint schonmal. Die 2. auch. Dann sollte der ( zumindest ist das in der Beschreibung von dem Code, von der Seite, wo ich den her habe so beschrieben ) die Funktion, die ich zuvor bei GetProcAddress eingegeben habe ausführen. Leider passiert nichts und auch die letzte msg box kommt nicht.
was könnte ich falsch gemacht haben? Habe ich die richtige .dll geladen, ist der Funktionsname "GoZone" überhaupt richtig? Mit ollydbg habe ich die Funktion in der Eninge.dll gefunden, allerdings waren vor und hinter der Funktion noch Sonderzeichen angegeben ( Hier [] ) "[]GoZone[]".
08/10/2010 17:12 nkkk#15
Quote:
Originally Posted by Nulpe123 View Post
Ich bin jetzt soweit, dass ich meine eigne kleine .dll geschrieben habe. Injekten lässt die sich auch so weit ohne Probleme, allerdings macht sie nicht das, was sie machen soll.

Code:
MessageBox(NULL, TEXT("Erfolgreich injectet"), NULL, MB_OK);

	typedef UINT (CALLBACK* LPFNDLLFUNC1)(UINT, UINT, UINT);

HINSTANCE hDLL;               // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
int  uParam1 = 2, uParam2 = 0, uParam3 = 149, uReturnVal;

hDLL = LoadLibrary(TEXT("Engine.dll"));
if (hDLL != NULL)
{
   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
                                           "GoZone");

		MessageBox(NULL, TEXT("Startet..."), NULL, MB_OK);

   lpfnDllFunc1(uParam1, uParam2, uParam3);

		MessageBox(NULL, TEXT("Ausgeführt"), NULL, MB_OK);
ist der Funktionsname "GoZone" überhaupt richtig?
nein