[C++] Einige Fragen - DLL Injector
-
Hey,
erstmal Klasse Forum!
Ich habe 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:
#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
-
EDIT: Ich bin der Threadstarter...war ausversehen nihct eingeloggt...
-
-> WinAPI
http://msdn.microsoft.com/en-us/library/aa383751(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366890(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682489(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684836(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684834(v=vs.85).aspxZu typedef: Google nach "Funktionspointer".
-
1. Was genau ist eigentlich ein Handle? Ein Pointer? (Ich habe auch schon etwas damit programmiert)
Stell dir vor dass der Kernel ein Array hat, mit Daten die deinen Prozess betreffen. Ein Handle ist jetzt ein Index in dieses Array. Wenn du jetzt eine Systemfunktionaufrufst, weiß der Kernel wo im Array er nachsehen muss, um die Daten zu finden, die du meinst.
2. Was ist der Datentyp HINSTANCE, HANDLE, HWND, PROCESSENTRY32 und fpLoadLibrary ?
Bis auf das letzte hilft Google u. MSDN recht schnell.
Aber:
HINSTANCE: Handle auf eine geladene DLL. In diesem Fall ein einfacher Zeiger.
HANDLE: Siehe oben.
HWND: Ein Handle auf ein Fenster.
PROCESSENTRY32: Teil der Process Helper API, enthält Infos über einen Prozess, wie zb ID und Name.
fpLoadLibrary: Ein Typedef im Code selbst. Siehe unten.3. Was macht denn die Funktion "VirtualAllocEx", "CreateToolhelp32Snapshot", "Process32Next" und "Process32First"?
VirtualAllocEx: Legt in einem Prozess Speicher an, ähnlich new.
CreateToolhelp32Snapshot: Rattert alle aktuellen Prozesse durch und merkt sich Infos darüber (PROCESSENTRY32).
Process32Next: Holt das nächste verfügbare PROCESSENTRY32.
Process32First: Holt das erste verfügbare PROCESSENTRY32.4. Was macht denn "typedef HINSTANCE (*fpLoadLibrary)(char*);
" ( ich weiß was typedef macht, aber das verstehe ich nicht)Ein Typedef auf einen Funktionszeigertyp. LoadLibraryA hat die Signatur
HINSTANCE LoadLibraryA(char* name)
Ein Zeiger darauf sähe so aus:
HINSTANCE (*)(char*)
Das Typedef spart Tipparbeit und macht es übersichtlicher.
-
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?3. Was macht "CreateRemoteThread" ?
Hier die Funktion:
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 Gedult
-
1. Es heißt Geduld.
2. Google und MSDN könnten dir das auch alles erklären, also leg mal etwas weniger Faulheit an den Tag und bemüh dich selber.
3. Die meisten dieser Fragen haben mehr mit WINAPI zu tun als mit C++, also bist du hier auch noch im falschen Subforum.
-
Sorry hab mich verschrieben...naja werd ich dann wohl machen...