T
Ich hätte auch noch etwas Stuff für dich. Eine DLL mit CreateRemoteThread in einem fremden Prozess injecten:
// Erstmal brauchst du für die meisten Prozesse mehr DebugPrevilegien um
// das Prozess handeln zu bekommen
// Die folgende Funktion einfach am anfang deiner Application ausführen
// ***** Get more access *****
void EnableDebugPrivilege( ) {
TOKEN_PRIVILEGES priv;
HANDLE hThis, hToken;
LUID luid;
hThis = GetCurrentProcess();
OpenProcessToken(hThis, TOKEN_ADJUST_PRIVILEGES, &hToken);
LookupPrivilegeValue(0, "seDebugPrivilege", &luid);
priv.PrivilegeCount = 1;
priv.Privileges[0].Luid = luid;
priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, false, &priv, 0, 0, 0);
CloseHandle(hToken);
CloseHandle(hThis);
}
// Die folgende Funktion kannst du dazu verwenden um deine DLL in einen fremden
// Prozess zu jagen, dabei schreibst du mit WriteProcessMemory den Namen deiner
// DLL bzw. den kompletten Pfad in den fremden Prozessbereich und erstellst
// einen RemoteThread um sie mit LoadLibrary zu laden
// Schon is deine DLL drin
// ***** Load DLL in remote process *****
bool InjectDLL( DWORD dwPID, const char *szDLLName ) {
HANDLE hProcess = OpenProcess( PROCESS_ALL_ACCESS, 0, dwPID );
if( !hProcess ) {
CloseHandle( hProcess );
return false;
}
cout << " Process handle : " << hex << hProcess << endl;
LPVOID pMemLib = VirtualAllocEx( hProcess, 0, strlen( szDLLName ), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE );
if( pMemLib == 0 ) {
CloseHandle( hProcess );
return false;
}
cout << " Alloc memory : 0x" << hex << (DWORD)pMemLib << " - 0x" << ( (DWORD)pMemLib + strlen( szDLLName ) ) << endl;
LPVOID pLoadLib = GetProcAddress( GetModuleHandle( "Kernel32.dll" ), "LoadLibraryA" );
if( ( WriteProcessMemory( hProcess, pMemLib, szDLLName, strlen( szDLLName ), 0 ) ) == 0 ) {
CloseHandle( hProcess );
return false;
}
HANDLE hThread = CreateRemoteThread( hProcess, 0, 0, (LPTHREAD_START_ROUTINE)pLoadLib, pMemLib, 0, 0 );
if( !hThread ) {
CloseHandle( hThread );
CloseHandle( hProcess );
return false;
}
CloseHandle( hThread );
CloseHandle( hProcess );
return true;
}
Achja eins noch, solltest du nur den Namen diene DLL angeben, müssen Injector und DLL im selben Verzeichniss liegen, wie auch die .exe des fremden Prozesses, wie es sich verhält wenn du den kompletten Pfad zur DLL übergibst hab ich noch nicht getestet.
Solltest du aber einfach nur vorhaben einen Keyboardhook Moushook, Messagehook zu basteln, kannst du ruhig bei SetWindowHookEx bleiben.
Greetz Tobi