009
24.10.2008, 14:04 Uhr
zac
|
Zitat: |
Direkt aus dem Userspace in ein anderes Programm einzugreifen, geht seit der Erfindung des virtuellen Adressraums höchstens, wenn das Programm das zulässt, also selbst eine entsprechende Schnittstelle zur Verfügung stellt; und dann nur mit entsprechenden Limitationen.
|
Unter Linux. Ja, ist auch gut so. Unter Windows, nein, leider nicht!
Eigentlich funktionieren reine Ring3-Debugger in Windows ziemlich gut. Es lässt sich, wenn die Anwendung das nicht im Ring0 durch Hooks in Systemfunktionen verhindert, nicht verhindern, dass ein Prozess beliebig im Speicher anderer Prozesse, auf die er Zugriff hat (als Admin/Superuser mit SeDebugPrivilege alle, als Gast oder ohne SeDebugPrivilege (das hat der Gast nicht) nur die Prozesse des Gastusers), lesen, schreiben, allokieren, deallokieren, die Read/Write/Execute-Protection neu setzen, Remote neue Module nachladen, Threads im anderen virtuellen Speicherbereich erzeugen... kann. Privilegien sind übrigens auch in Linux vorhanden und decken etwa die selben Dinge ab, nur heißen sie da capatibilities. Es ist also z.B. wunderbar möglich, als Administrator-User oder User mit gleichen Rechten einen RemoteThread in einem Systemdienst zu erzeugen.
Ein Beispiel für einen wirklich guten, kostenfreien, durch Plugins stark erweiterbaren Ring-3-Debugger/Disassembler in Windows ließe sich ollydbg nennen. Viele seiner Plugins gehen in den Ring 0, aber der Debugger selbst m.W. nicht. Die wichtigsten Funktionen der WinAPI für das rumschreiben/lesen/usw. in anderen Prozessen sind (dahinter immer die Funktionen im Kern auf denen sie basieren, so weit die mir jetzt ohne nachzugucken bekannt sind):
OpenProcess/ZwOpenProcess OpenProcessToken/? VirtualAllocEx/ZwAllocateVirtualMemory WriteProcessMemory/ZwWriteVirtualMemory & ZwFlushInstructionCache ReadProcessMemory/ZwReadVirtualMemory CreateRemoteThread/ZwCreateThread SetWindowsHookEx/? VirtualProtectEx/ZwVirtualProtect? kA... TerminateThread/ZwTerminateThread TerminateProcess/ZwTerminateProcess CreateProcess/ZwCreateProcess
Dann gibts da auch noch die Debugging-API, die ist mir aber nicht so gut bekannt. Kenn die aus meiner Windows-Zeit noch, als ich mal ein wenig mit Ring0-Hooks experimentiert habe (hatte dann u.a. so kleinere Sachen die eben diese Übergriffe auf andere Prozesse unterbunden haben, z.B. durch den Taskmanager, aber das gibt Stress, da Windows u.a. wohl für die Skins selbst so arbeitet, denn wenn csrss.exe beispielsweise nicht auf die Addressbereiche von Prozessen zugreifen kann, dann fühlt man sich optisch an Win95 erinnert).
Die sind jedenfalls alle voll aus dem Ring3 ansprechbar. Im Ring0 tun sie das gleiche, nur werden da keine Sicherheitsabfragen mehr gemacht.
Es gibt eine Reihe von Tools die mit sowas arbeiten: Entferntes Schließen von Handles (kann z.B. der ProcessExplorer) wird wohl auch oft über einen RemoteThread auf CloseHandle im jeweiligen Addressbereich implementiert. -- mov eax,0f9h push 2 push 2 mov edx,esp int 2eh Dieser Post wurde am 24.10.2008 um 14:08 Uhr von zac editiert. |