<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[SetWindowsHookEx - DLL nicht in bereits laufende Prozesse injizierbar ?]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>ich beschäftige mich zur Zeit mit DLL-Injection.<br />
Laut MSDN versieht SetWindowsHookEx alle laufenden Threads des aktiven Desktops mit Hooks (also einer DLL, die ich im Aufruf angebe), wenn ich beim dwThreadID Parameter eine '0' angebe.</p>
<p>Ich habe das ausprobiert, jedoch werden nur Threads von neu gestarteten Programmen (also nach Aufruf der SetWindowsHookEx) mit der angegebenen DLL versehen. Ist das richtig so ?...</p>
<p>Mich wundert das nur, weil ich in einem Buch gelesen habe, dass alle BEREITS laufenden Threads mit Hooks versehen werden.<br />
Wie ist das jetzt, wenn ich eine konkrete dwThreadID als letzten Parameter angebe ? Dann wird doch die DLL in den Prozess des jeweiligen Threads geladen, auch wenn der schon läuft, oder ? Sonst würde das doch keinen Sinn machen...</p>
<p>Weiterhin kann ich eine DLL ja auch über den Registrierungsschlüssel HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_DLLs automatisch in nachfolgende Prozesse laden lassen.</p>
<p>Das heißt aber nicht, dass dann die IAT-Einträge von anderen DLLs (die von der selben *.exe benötigt werden) schon vom Loader aufgelöst wurden, oder ?<br />
D.h. ich bräuche evtl. so etwas wie eine Verzögerungsroutine, die wartet, bis die IAT-Einträge der anderen DLLs auf konkrete Adressen aufgelöst wurden und dann kann ich erst die Einträge modifizieren. Hat das hier schon mal jemand gemacht, der mir da Tipps geben könnte ?</p>
<p>Greetz<br />
Xzi-bit @loggedoff</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/221605/setwindowshookex-dll-nicht-in-bereits-laufende-prozesse-injizierbar</link><generator>RSS for Node</generator><lastBuildDate>Sun, 05 Apr 2026 11:35:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/221605.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 01 Sep 2008 07:50:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to SetWindowsHookEx - DLL nicht in bereits laufende Prozesse injizierbar ? on Mon, 01 Sep 2008 07:50:15 GMT]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>ich beschäftige mich zur Zeit mit DLL-Injection.<br />
Laut MSDN versieht SetWindowsHookEx alle laufenden Threads des aktiven Desktops mit Hooks (also einer DLL, die ich im Aufruf angebe), wenn ich beim dwThreadID Parameter eine '0' angebe.</p>
<p>Ich habe das ausprobiert, jedoch werden nur Threads von neu gestarteten Programmen (also nach Aufruf der SetWindowsHookEx) mit der angegebenen DLL versehen. Ist das richtig so ?...</p>
<p>Mich wundert das nur, weil ich in einem Buch gelesen habe, dass alle BEREITS laufenden Threads mit Hooks versehen werden.<br />
Wie ist das jetzt, wenn ich eine konkrete dwThreadID als letzten Parameter angebe ? Dann wird doch die DLL in den Prozess des jeweiligen Threads geladen, auch wenn der schon läuft, oder ? Sonst würde das doch keinen Sinn machen...</p>
<p>Weiterhin kann ich eine DLL ja auch über den Registrierungsschlüssel HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_DLLs automatisch in nachfolgende Prozesse laden lassen.</p>
<p>Das heißt aber nicht, dass dann die IAT-Einträge von anderen DLLs (die von der selben *.exe benötigt werden) schon vom Loader aufgelöst wurden, oder ?<br />
D.h. ich bräuche evtl. so etwas wie eine Verzögerungsroutine, die wartet, bis die IAT-Einträge der anderen DLLs auf konkrete Adressen aufgelöst wurden und dann kann ich erst die Einträge modifizieren. Hat das hier schon mal jemand gemacht, der mir da Tipps geben könnte ?</p>
<p>Greetz<br />
Xzi-bit @loggedoff</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574474</guid><dc:creator><![CDATA[Xzibit_@loggedoff]]></dc:creator><pubDate>Mon, 01 Sep 2008 07:50:15 GMT</pubDate></item><item><title><![CDATA[Reply to SetWindowsHookEx - DLL nicht in bereits laufende Prozesse injizierbar ? on Mon, 01 Sep 2008 08:25:31 GMT]]></title><description><![CDATA[<p>Von was für einem Hook redest Du?<br />
1. Wenn ein Prozess keine Nachrichtenschleife hat wird auch kein GetMessage Hook injeziert werden.<br />
2. Werden DLLs nicht in Threads injeziert, sondern in Prozesse, allerdings wird ein Hook nur Thread bezogen gesezt. Die DLL liegt aber eben im Prozess.<br />
3. Die AppInit_DLLs werden zuerst geladen. Wenn Deine DllMain aufgerufen wird, dann ist diese inkl. Ihrer DLLs die sie verwendet entsprchend lauffähig. Das heißt nicht, dass andere DLls evtl. nicht noch geladen werden müssten. Du kannst theoretisch keine Aussage trefen, welche DLLs, die im Speicher liegen bereits initialisiert sind und welche nicht.<br />
4. Wird AppInit_DLLs und seine Wirkungsweise hier beschrieben <a href="http://support.microsoft.com/kb/197571" rel="nofollow">http://support.microsoft.com/kb/197571</a><br />
5. Unter Vista wurde diese blödsinnige Funktion endlich dicht gemacht. Leider aber nicht ganz.<br />
Du solltest Dir das zu Gemüte führen: <a href="http://blogs.msdn.com/oldnewthing/archive/2007/12/13/6648400.aspx" rel="nofollow">http://blogs.msdn.com/oldnewthing/archive/2007/12/13/6648400.aspx</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574490</guid><dc:creator><![CDATA[Martin Richter]]></dc:creator><pubDate>Mon, 01 Sep 2008 08:25:31 GMT</pubDate></item><item><title><![CDATA[Reply to SetWindowsHookEx - DLL nicht in bereits laufende Prozesse injizierbar ? on Mon, 01 Sep 2008 09:43:47 GMT]]></title><description><![CDATA[<p>Ich hätte auch noch etwas Stuff für dich. Eine DLL mit CreateRemoteThread in einem fremden Prozess injecten:</p>
<pre><code class="language-cpp">// 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, &amp;hToken);

	LookupPrivilegeValue(0, &quot;seDebugPrivilege&quot;, &amp;luid);

	priv.PrivilegeCount = 1;
	priv.Privileges[0].Luid = luid;
	priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

	AdjustTokenPrivileges(hToken, false, &amp;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 &lt;&lt; &quot; Process handle : &quot; &lt;&lt; hex &lt;&lt; hProcess &lt;&lt; endl;

	LPVOID pMemLib = VirtualAllocEx( hProcess, 0, strlen( szDLLName ), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE );
	if( pMemLib == 0 ) {

		CloseHandle( hProcess );
		return false;
	}
	cout &lt;&lt; &quot; Alloc memory   : 0x&quot; &lt;&lt; hex &lt;&lt; (DWORD)pMemLib &lt;&lt; &quot; - 0x&quot; &lt;&lt; ( (DWORD)pMemLib + strlen( szDLLName ) ) &lt;&lt; endl;

	LPVOID pLoadLib = GetProcAddress( GetModuleHandle( &quot;Kernel32.dll&quot; ), &quot;LoadLibraryA&quot; );

	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;
}
</code></pre>
<p>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.</p>
<p>Solltest du aber einfach nur vorhaben einen Keyboardhook Moushook, Messagehook zu basteln, kannst du ruhig bei SetWindowHookEx bleiben.</p>
<p>Greetz Tobi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1574537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1574537</guid><dc:creator><![CDATA[T0bi]]></dc:creator><pubDate>Mon, 01 Sep 2008 09:43:47 GMT</pubDate></item></channel></rss>