|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Cherry
Anmeldungsdatum: 20.06.2007 Beiträge: 249
|
Verfasst am: 23.05.2009, 21:05 Titel: *** Wie man in den Kernel Mode (Ring 0) wechseln kann! *** |
|
|
Falls es wen interessiert: hier ein kleiner Beispielcode, der eine Sub innerhalb von Ring 0 ausführt. So kann z.B. auf das Kontrollregister CR0 zugegriffen werden (oder es könnte mit "Asm hlt" der PC eingefroren werden!).
Code: | #Include "windows.bi"
Dim Shared NtSystemDebugControl As Function(As Integer, As Any Ptr, As Dword, As Any Ptr, As Dword, As Dword Ptr) As Long
Type CALL_GATE Field = 1
addrlo As Word
Seg As Word
arg:5 As Byte
u:3 As Byte
typ:5 As Byte
dpl:2 As Byte
pres:1 As Byte
addrhi As Word
End Type
Type gdtrStruct Field = 1
limit As Word
base As Dword
End Type
Type VIRTUAL1 Field = 1
A As Any Ptr
B As Any Ptr
C As Dword
End Type
#Define Virtual(_a_, _b_, _c_, _d_) Scope: Var v = Type<VIRTUAL1>((_a_), (_b_), (_c_)): NtSystemDebugControl((_d_), @v, SizeOf(v), 0, 0, 0): End Scope
' This sub will be executed in kernel mode!
Sub Ring0(cs As Dword, text As ZString Ptr)
*text = !"Hello World from Ring 0 \n"
' Store value of control register 0 in eax (which is normally not allowed) in order to prove we are in Ring 0!
Asm mov eax, cr0
' Return to Ring 3
Asm
leave
.byte 0xCA ' retf 4
.word 4
End Asm
End Sub
Function Main() As Integer
NtSystemDebugControl = GetProcAddress(LoadLibrary("ntdll"), "NtSystemDebugControl")
Dim As TOKEN_PRIVILEGES pv, po
pv.PrivilegeCount = 1
pv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
Dim As HANDLE t
Dim As Dword no
' This will enable NtSystemDebugControl usage
LookupPrivilegeValue(0, SE_DEBUG_NAME, @pv.Privileges(0).Luid)
OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, @t)
AdjustTokenPrivileges(t, 0, @pv, SizeOf(po), @po, @no)
' This ensures that on multi cpu/core systems we patch the right GDT for right cpu
SetThreadAffinityMask(GetCurrentThread(), 1)
SleepEx(100, FALSE)
' We read GDT table
Dim As LDT_ENTRY gdt(1000)
Dim As gdtrStruct gdtr
Asm sgdt [gdtr]
' Find free spot
Virtual(gdtr.base, @gdt(0), gdtr.limit, 8)
Dim As Integer gate
For i As Integer = 1 To 99
If gdt(i).HighWord.Bits.Pres = 0 Then
gate = i
Exit For
EndIf
Next
' Construct Call Gate pointing to Ring0 proc and write it there
Var addr = CUInt(@Ring0)
Dim As CALL_GATE g = Type(addr And &hFFFF, 8, 1, 0, 12, 3, 1, addr Shr 16)
Virtual(gdtr.base + gate * 8, @g, 8, 9)
' Quite ugly way to do far call
Dim As Word farcall(3) = {0, 0, gate Shl 3}
Dim As ZString Ptr param = CAllocate(100)
Dim As Long result
' Switch from Ring 3 to Ring 0 is just normal call ;)
Asm
push [param]
call fword Ptr [farcall]
mov [result], eax
End Asm
' Cleanup Call Gate from GDT
Dim As LongInt c = 0
Virtual(gdtr.base + gate * 8, @c, 8, 9)
Print !"\n" & *param & !"\nCR0 = " & Hex(result, 8)
Sleep
DeAllocate(param)
Return 0
End Function
End(Main()) |
mfG Cherry |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 23.05.2009, 22:19 Titel: |
|
|
Auf meinem PC kommt leider nur ein "... hat ein Problem festgestellt und muss beendet werden" und das Programm verabschiedet sich (OS: Microsoft Windows XP MCE SP 3)
Auf einem anderen PC mit einer älteren XP-Version (Microsoft Windows XP SP3) funktioniert es aber.
Mich wundert es, wie "einfach" es ist Code in Ring 0 auszuführen. Erinnert schon fast an DOS
//edit: Scheint nur ein "Bug" von älteren XP-Version zu sein - unter Windows 7 (Build 7100) funktionierts auch nicht mehr ("... funktioniert nicht mehr")
//edit2: Microsoft Windows 98 hängt nach dem Start des Programms _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Zuletzt bearbeitet von St_W am 23.05.2009, 23:45, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 23.05.2009, 22:50 Titel: |
|
|
Ruhig einmal testen unter verschiedenen Berechtigungen:
- Standardbenutzer
- Hauptbenutzer
- lokaler Administrator
St_W hat Folgendes geschrieben: | Mich wundert es, wie "einfach" es ist Code in Ring 0 auszuführen. Erinnert schon fast an DOS :-) |
Gerade bei letzterem (Administrator) ist so etwas kein Wunder: Administrator = darf alles, wirklich ALLES, u.a. auch Prozesse debuggen und Code in einem anderen Ring (Treiber!) ausführen.
Gegenmassnahme aus Sicht der IT-Security sind niedrige Windowsbenutzerrechte - wieder einmal einen Grund mehr, nicht mit unnötig hohen Rechten die tägliche PC-Arbeit zu erledigen! _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|