[HILFE] DLL Injector initializieren

Tomsen1410

Mitglied

Hey,
Ich habe nämlich im Internet ein Tutorial für einen DLL Injector gefunden, doch jetzt stellen sich mir ein paar fragen:

1. Was genau ist eigentlich ein Handle? Ein Pointer? (Ich habe auch schon etwas damit programmiert)

2. Was ist der Datentyp HINSTANCE, HANDLE, HWND, PROCESSENTRY32 und fpLoadLibrary ?

3. Was macht denn die Funktion "VirtualAllocEx", "CreateToolhelp32Snapshot", "Process32Next" und "Process32First"?

4. Was macht denn "typedef HINSTANCE (*fpLoadLibrary)(char*);
" ( ich weiß was typedef macht, aber das verstehe ich nicht)

Zur Hilfe hier noch der Script des Injectors:

C++:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>

using namespace std;
bool InjectDLL(DWORD ProcessID);

char FileToInject[] = "YtAssaultCubeDLL.dll";
char ProcessName[] = "ac_client.exe";
typedef HINSTANCE (*fpLoadLibrary)(char*);


int main()
{
	DWORD processId = NULL;

	PROCESSENTRY32 pe32 = {sizeof(PROCESSENTRY32)};
	HANDLE hProcSnap;

	while(!processId)
	{
		system("CLS");
		cout << "Searching for " << ProcessName <<"..." <<endl;
		cout << "Make sure your game is running" <<endl;
		hProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
		
		if(Process32First(hProcSnap, &pe32))
		{
			do
			{
				if(!strcmp(pe32.szExeFile, ProcessName))
				{
					processId = pe32.th32ProcessID;
					break;
				}
			}
			while(Process32Next(hProcSnap, &pe32));
		}
		Sleep(1000);
	}


	while(!InjectDLL(processId))
	{
		system("CLS");
		cout << "DLL failed to inject" << endl;
		Sleep(1000);
	}

	cout << "DLL Injected successfuly!" << endl << endl; 
	cout << "Closing Injector in 5 seconds" << endl;

	CloseHandle(hProcSnap);
	Sleep(5000);

	return 0;
}


bool InjectDLL(DWORD ProcessID)
{
	HANDLE hProc;
	LPVOID paramAddr;

	HINSTANCE hDll = LoadLibrary("KERNEL32");

	fpLoadLibrary LoadLibraryAddr = (fpLoadLibrary)GetProcAddress(hDll, "LoadLibraryA");

	hProc = OpenProcess (PROCESS_ALL_ACCESS, false, ProcessID);

	char dllPath[250] = "C:\\HACKS\\";

	strcat(dllPath, FileToInject);

	paramAddr = VirtualAllocEx(hProc, 0, strlen(dllPath)+1, MEM_COMMIT, PAGE_READWRITE);
	bool memoryWritten = WriteProcessMemory(hProc, paramAddr, dllPath, strlen(dllPath)+1, NULL);

	CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryAddr, paramAddr, 0, 0);

	CloseHandle(hProc);

	return memoryWritten;
}

Danke schonmal :D
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

ich weiß ja nicht, ob man sich als Anfänger wirklich an solche Kaliber wagen sollte, Injection ist ein heikles Thema. Damit kann man sehr viele böse Dinge tun. Weil ich grade der Meinung bin, das du nichts illegales tun willst, werde ich dir versuchen, deine Fragen zu beantworten:

1.
- Prinzipiell ist ein Handle eine Zahl, mit der ein Programm eine Resource nummeriert. Dabei kann es sich z.B. um eine geöffnete Datei, ein Fenster, ein Element auf einem Fenster, ein Socket und so weiter und so fort sein.
- Ein Pointer - oder zu Deutsch ein Zeiger - ist eine Variable die für nichts anderes da ist, als eine Adresse im Speicher zu beinhalten. Der Pointer zeigt als auf eine ganz bestimmte Stelle im Speicher. Mehr ist das erstmal nicht. An der Adresse im Speicher liegen dann die eigentlichen Nutzdaten. Sozusagen ist der Pointer ein Wegweiser zu den Daten.

2. HINSTANCE, HANDLE und HWND sind Zeiger für einen bestimmten Zweck. HINSTANCE verwendet man für eine Programminstanz (also einen gestarten Prozess). HANDLE sollte jetzt mal klar sein, es handelt sich um einen Basis-Typ, der für alle möglichen anderen Typen verwendet wird, was man daran sieht, wie HINSTANCE und HWND definiert werden:

C:
typedef PVOID HANDLE; // PVOID ist Pointer auf Void

typedef HANDLE HWND;
typedef HANDLE HINSTANCE;

PROCESSENTRY32 ist eine Struktur. Für was sie verwendet wird, kannst du in der MSDN nachlesen: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684839(v=vs.85).aspx

fpLoadLibrary ist erstmal nichts andere als eigens definierter Typ. Die Art und Weise, wie er definiert ist, lässt darauf schließen, das es sich um einen Funktionszeiger mit einer Parameterliste von einem Element vom Typ Pointer auf Character (also String) handelt.

3.
- VirtualAllocEx ist die Implementierung, um Speicher in dem virtuellen Adressraum eines bestimmten Prozesses Speicher anzufordern. Bessere weil detailierte Erklärung findest du hier: http://msdn.microsoft.com/en-us/library/windows/desktop/aa366890(v=vs.85).aspx
- CreateToolhelp32Snapshot macht eine Momentaufnahme eines Prozesses. Was genau gesnapshottet werden soll, wird über Flags gesteuert. Man bekommt ein HANDLE auf den Snapshot-Bereich zurück. Weitere Informationen hier: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682489(v=vs.85).aspx
- Process32Next und Process32First werden zum Iterieren über die in einem Systemsnapshot befindlichen Prozesse verwendet. Weitere Informationen hier: http://msdn.microsoft.com/en-us/library/windows/desktop/ms684834(v=vs.85).aspx

4. Habe ich bereits in 2. erklärt. Es handelt sich um die Definition eines Funktionszeigers. Einfaches Beispiel:

C:
#include <stdio.h>
#include <errno.h>

typedef int (*schreibe)(int,char *);

int schreibe_auf_bildschirm(int anzahl, char *wort)
{
  int i;
  for(i = 0; i < anzahl; i++)
  {
    printf("%s", wort);
  }

  return 0;
}

int schreibe_in_datei(int anzahl, char *wort)
{
  int i;
  FILE *f = fopen("datei.ext", "w");
  if( f != NULL )
  {
    for( i = 0; i < anzahl; i++ )
    {
      if( fprintf(f, "%s", wort) == 0 )
      {
         fclose(f);
         return errno;
      }
    }
    fclose(f);
    return 0;
  }
  else
  {
    return errno;
  }
}

int main(int argc, char **argv)
{
  // Jetzt verwendet wir den Funktionszeiger für das Schreiben auf den Bildschirm
  schreibe schreibefunktion = schreibe_auf_bildschirm;

  // eigentlich wird die Funktion schreibe_auf_bildschirm() aufgerufen
  schreibefunktion (10, "Hallo Welt\n");

  // Jetzt verwendet wir den Funktionszeiger für das Schreiben in die Datei
  schreibefunktion = schreibe_in_datei;

  // eigentlich wird die Funktion schreibe_in_datei() aufgerufen
  schreibefunktion (10, "Hallo Welt\n");
}

* ungetestet und aus dem Ärmel geschüttelt ;-)
 
Danke :D
Also ich habe mit Handles etc... schon manchmal programmiert nur wusste ich nicht genau, was das jetzt eigentlich ist. Und ich wusste auch was Pointer sind, nur habe ich mich gefragt ob ein Handle vielleicht ein Pointer auf etwas ist.
Und nein, ich möchte damit nichts illegales, ich wollte einfach nur zu einem etwas älterem Spiel einen kleinen Hack(unendlich Leben etc.) schreiben zur Übung(natürlich nur SinglePlayer hehe)
Also vielen Dank für die Antwort!

EDIT: Ich hätte dann zum Handle noch eine Frage:
Ist der Handle dann praktisch eine "Index" eines bestimmten Prozesses der läuft(wenn man sich alle Prozesse wie ein Array anschauen würde) ?
 
Zuletzt bearbeitet:
Ist der Handle dann praktisch eine "Index" eines bestimmten Prozesses der läuft(wenn man sich alle Prozesse wie ein Array anschauen würde) ?

Wenn man so will, ja. Aber bei Windows ist ein Handle eigentlich immer ein Zeiger auf eine Ressource. Habe ja in Punkt 2 die Definitionen von HWND und HINSTANCE gezeigt. Wenn du es dir so besser vorstellen kannst:

Das Handle für eine spezifische Resource in einer Liste ist nicht der Index des Elements sondern ein Zeiger, der auf das Element zeigt.
 
Hey, danke.
Hatte gestern keine Zeit zum antworten.
Ich hab da noch einige Fragen zur "Inject" -funktion:
1. Was genau macht denn die LoadLibrary("KERNEL32") Funktion?

2. Falls ich das richtig verstanden habe, wird mit der folgenden Zeile ein Pointer auf die "GetProcAddress" Funktion erstellt? Die Zeile:
"fpLoadLibrary LoadLibraryAddr = (fpLoadLibrary)GetProcAddress(hDll, "LoadLibraryA");"
Nur was macht die GetProcAddress Funktion? :p

3. Was macht "CreateRemoteThread" ?

Hier die Funktion:
C++:
bool InjectDLL(DWORD ProcessID)
{
	HANDLE hProc;
	LPVOID paramAddr;

	HINSTANCE hDll = LoadLibrary("KERNEL32");

	fpLoadLibrary LoadLibraryAddr = (fpLoadLibrary)GetProcAddress(hDll, "LoadLibraryA");

	hProc = OpenProcess (PROCESS_ALL_ACCESS, false, ProcessID);

	char dllPath[250] = "C:\\HACKS\\";

	strcat(dllPath, FileToInject);

	paramAddr = VirtualAllocEx(hProc, 0, strlen(dllPath)+1, MEM_COMMIT, PAGE_READWRITE);
	bool memoryWritten = WriteProcessMemory(hProc, paramAddr, dllPath, strlen(dllPath)+1, NULL);

	CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)LoadLibraryAddr, paramAddr, 0, 0);

	CloseHandle(hProc);

	return memoryWritten;
}

Danke für die Geduld :p
 
Zuletzt bearbeitet von einem Moderator:
1: Um eine DLL zu laden und die Funktionen daraus zu verwenden gibt es 2 Möglichkeiten:

a) Mit einer dazugehörenden lib-Datei kompilieren.
Vorteil: Man muss sich nicht selbst um das Laden kümmern, das macht der Compiler.
Nachteil: Wenn die DLL nicht gefunden wird, geht das ganze Programm nicht. Auch, wenn es ohne DLL vielleicht trotzdem Sinn machen würde. Außerdem Speicherverbrauch, falls man die DLL eventuell nicht immer braucht...

b) LoadLibrary. Eben umgekehrt zu a. Selbst laden, bei Bedarf.

Dein Befehl läd die kernel32.dll
Kann man aber leicht über Google herausfinden.

Normalerweise ist es sinnlos, die kernel32.dll selbst zu laden, weil sie als wahrscheinlich wichtigste dll bei jedem Programm irgendwo gebraucht wird (zB. zum Programmstart selbst) und schon compilermäßig dabei ist.
Der Beweis dafür ist LoadLibrary. Das kommt nämlich selbst aus der kernel32.dll.
Wenn die nicht schon geladen wäre könnte man die Funktion gar nicht verwenden.

Sinn machen kann es nur bei solche Sachen wie Injections etc...wie bei dir.

2: Mit GetProcAddress kann man aus so einer selbst geladenen dll per Name eine ihrer Funktionen heraussuchen. Man bekommt einen Funktionspointer, über den man die Funktion dann auch aufrufen kann. Bei dir wird die Funktion LoadLibraryA geladen (praktisch LoadLibrary).
Sieht man aber auch schnell über Google.

3: :google: MSDN...
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682437%28v=vs.85%29.aspx hat gesagt.:
Creates a thread that runs in the virtual address space of another process.
 

Neue Beiträge

Zurück