BlackBoard » Design, Programmierung & Entwicklung » Programmieren » C "low level" Systemzugriffe » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen "low level" Systemzugriffe
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
scr!pTk!d scr!pTk!d ist männlich
Member


Dabei seit: 10.11.2002
Beiträge: 276

"low level" Systemzugriffe       Zum Anfang der Seite springen

wie kann man denn mit c auf einzelne sektoren auf der platte / im ram zugreifen und wie kann man auf interrupts / interrupt-tabelle zugreifen?? ist es mit c auch möglich auf das cmos schreibend zuzugreifen oder benötigt man hierfür assembler??

__________________
ceterum censeo carthaginem esse delendam

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von scr!pTk!d: 15.03.2003 19:26.

15.03.2003 19:26 scr!pTk!d ist offline E-Mail an scr!pTk!d senden Beiträge von scr!pTk!d suchen
Compuholic Compuholic ist männlich
knows where he wants to go tomorrow


images/avatars/avatar-552.jpg

Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München

      Zum Anfang der Seite springen

Für den BIOS Zugriff benötigst Du auf jeden Fall Assembler. Ich weiß ja nicht welchen Compiler Du benutzt, aber die meisten C-Compiler haben auch einen Inline-Assembler integriert.

Um auf die Interrupt-Tabelle zugrifen zu können benötigt man zumindest einen ASM-Befehl. Das größere Problem wird sein, das Du (wie auch beim BIOS) ring0 Zugriff haben mußt. (Oder zu löst das ganze unter DOS).

Bei den Sektoren bin ich mir nicht sicher. Ist wahrscheinlich OS abhängig. Vielleicht haben manche Betriebssysteme ein API für so etwas, aber afaik brauchst Du dafür ebenfalls ASM.
15.03.2003 23:28 Compuholic ist offline E-Mail an Compuholic senden Homepage von Compuholic Beiträge von Compuholic suchen
scr!pTk!d scr!pTk!d ist männlich
Member


Dabei seit: 10.11.2002
Beiträge: 276

Themenstarter Thema begonnen von scr!pTk!d
      Zum Anfang der Seite springen

lol, ich habe in meinem schlauen buch "c für anfänger" gelesen c sei eine "hardwarenahe programmiersprache". scheint nicht so zu sein...
ich benutze unter win2k lcc
... was bedeutet denn ring0 zugriff ??verwirrt und wo gibt es denn gute tuts für x86 assembler?
eigentlich will ich nur mit dem interrupt 19h (reset-interrupt wenn ich mich nicht täusche), aus einem programm heraus einen win2k rechner neustarten lassen (hab ich bisher nicht anders hinbekommen).

__________________
ceterum censeo carthaginem esse delendam

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von scr!pTk!d: 16.03.2003 00:42.

16.03.2003 00:28 scr!pTk!d ist offline E-Mail an scr!pTk!d senden Beiträge von scr!pTk!d suchen
CDW CDW ist männlich
eine Simulation


Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread

      Zum Anfang der Seite springen

zu C: doch, es ist eine ziemlich hardwarenahe Sprache - es gibt sogar einen C-Compiler für Gameboy (damit kann man aus Gameboy ne Messstation basteln).Jedenfalls kann man damit Bytemanipulationen usw vornehmen.
zum ring: es gibt verschiedene Privelegstufen auf einem System - seit dem 386 unterstützen die CPUs eine Aufteilung in verschiedene Privilegstufen: läuft ein Programm unter ring0-stufe, kann es alles machen, es hat einen direktzugriff auf Hardware, im ring1 Modus schon weniger, ring2 noch weniger und ring3 gar net.Aktuelle OS wie win2k,XP,Linux benutzen nur 2 davon: ring0 für Kernel uns Systemtreiber und ring3 für Anwendersoftware(bessere Erklärung hier: )
http://www.linux-community.de/Neues/story?storyid=6820
Um bestimmten Code mit ring0 Privilegien auszuführen, muss man die erst "freischlaten", zumindest ab win2k ist dafür ein Treiber nötig.Das ist auch gut so: es gab nen Virus für win 9.x,welches das BIOS überschrieb - das ist ab win 2k nicht mehr so einfach.
Zu deinem Vorhaben: hm, das ist aber ein hardreset, ob das dem rechner gut bekommt? du kannst dafür besser die WinAPI nutzen - jedoch wird es unter win2k/NT/XP etwas komplex, da man tokiens braucht usw.Auf meiner HP kannst du neben nem Shutdownprogramm auch den Quellcode(kommentiert) downloaden... obwohl das in ASM ist, sollte es sich leicht in C umsetzen lassen, da in dem Programm praktisch nur die APIs benutzt werden.

Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von CDW: 16.03.2003 14:33.

16.03.2003 14:28 CDW ist offline E-Mail an CDW senden Homepage von CDW Beiträge von CDW suchen
scr!pTk!d scr!pTk!d ist männlich
Member


Dabei seit: 10.11.2002
Beiträge: 276

Themenstarter Thema begonnen von scr!pTk!d
      Zum Anfang der Seite springen

für ring0 zugriff unter win2k hab ich jetzt einen assembler source(s.u.) allerdings werde ich nicht schlau daraus. wie könnte ich das denn mit c (oder von mir aus auch in pascal Augenzwinkern ) umsetzen??


Zitat:

.386p
.MODEL FLAT,STDCALL
locals
jumps
UNICODE=0
include w32.inc


Extrn SetUnhandledExceptionFilter : PROC

Interrupt equ 5 ;interrupt number which we will use
;if you use Int 1h or 3h, it will be
;more harder debugg your program
.DATA

msg1 db "Switch to Ring0 by IDT",0
msg2 db "Ring0 activated",0


.CODE
Start:

push edx
sidt [esp-2] ;read IDT to stack
pop edx ;address of Interrupt table
add edx,(Interrupt*8)+4
;Interrupt table base+Int number+size for
;Int in Interrupt table=Int vector address
mov ebx,[edx]
mov bx,word ptr [edx-4]
;read old address our interrupt (INT 5h)

lea edi,InterruptHandler
mov [edx-4],di
ror edi,16 ;set our new interrupt handler
mov [edx+2],di

push ds ;save registers
push es


int Interrupt ;jump to Ring0 (our int 5h handler)

pop es ;restore registers
pop ds


mov [edx-4],bx ;set old int 5h handler
ror ebx,16
mov [edx+2],bx

call MessageBoxA,0, offset msg2, offset msg1,0
call ExitProcess, -1


__________________
ceterum censeo carthaginem esse delendam
16.03.2003 16:19 scr!pTk!d ist offline E-Mail an scr!pTk!d senden Beiträge von scr!pTk!d suchen
phlox81 phlox81 ist männlich
Bote des Lichts und Moderator


images/avatars/avatar-2264.jpg

Dabei seit: 19.10.2002
Beiträge: 3.028
Herkunft: Irgendwo im Nirgendwo

      Zum Anfang der Seite springen

Es gibt auch die Möglichkeit, ASM Code in C/C++ Code einzubinden.
Dies unterscheidet sich jedoch von Compiler zu Compiler,
da es keinen Standard dafür gibt.



code:
1:
2:
asm{
...}

bzw. MSVC
code:
1:
__asm{..}


Devil

__________________
Intelligenz ist eine Illusion des Menschen

phlox81.de | codenode.de

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von phlox81: 16.03.2003 17:19.

16.03.2003 17:09 phlox81 ist offline E-Mail an phlox81 senden Homepage von phlox81 Beiträge von phlox81 suchen
CDW CDW ist männlich
eine Simulation


Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread

      Zum Anfang der Seite springen

scheint tasm zu sein oder nasm, hab den soweit nach MASM portiert, aber da scheint was zu fehlen... ich kenne mciht mit nasm nicht so genau aus.Könntest du vielleicht eventuell den Link posten?... ich weiß aber nicht, ob, wenn man daraus eine DLL macht, der ganze Prozess unter ring0 läuft... muss beschämd eingestehen, dass ich keine Peilung hab, was der Code so macht (mit interrupts usw.kenn ich micht nicht so aus), naja, außerdem ist fremden Asmcode zu lesen immer schwer - ich komme ja nicht mal bei meinem so ganz mit *g*
16.03.2003 20:55 CDW ist offline E-Mail an CDW senden Homepage von CDW Beiträge von CDW suchen
Compuholic Compuholic ist männlich
knows where he wants to go tomorrow


images/avatars/avatar-552.jpg

Dabei seit: 19.10.2002
Beiträge: 819
Herkunft: München

      Zum Anfang der Seite springen

Ich kann glaube ich grob sagen, was der Code macht.

Es wird das "interrupt descriptor table Register" (IDTR) ins edx ausgelesen, das die physikalische Speicheradresse des "interrupt descriptor table" (IDT) enthält. Dann werden einige Additionen durchgeführt, so das edx auf den Pointer zur Speicheradresse des Interrupt-Handlers (Das Unterprogramm, das aufgerufen wird, wenn der entsprechende Interrupt eintritt) zeigt. Diese Adresse wird nun mit der Adresse des eigenen Interrupt-Handlers überschrieben.

Wenn jetzt der Interrupt aufgerufen wird, muß durch ein Interrupt-Gate in ring0 geschaltet werden und es wird der im IDT angegebene Code ausgeführt (den wir ja mit unserer Speicheradresse überschrieben haben).

@CDW: Was an diesem Programm noch fehlt ist die Implementation des Interrupt Handlers.

Was ich noch nicht ganz gerafft habe: Ich dachte immer, daß der Speicherbereich des IDT gegen den Zugriff von ring3 geschützt ist. Ganz davon zu schweigen, das ring3 keinen Zugriff auf Interrupts hat. Außerdem: mit "lea" wird ja die effektive Adresse des Interrupt Handlers geladen. Aber es wird doch die effektive Adresse den virtuellen Adressraums geladen. Dieser hat doch aber keine Gültigkeit in einem anderen Task, oder findet kein Task-Switch statt?

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Compuholic: 16.03.2003 23:31.

16.03.2003 23:29 Compuholic ist offline E-Mail an Compuholic senden Homepage von Compuholic Beiträge von Compuholic suchen
scr!pTk!d scr!pTk!d ist männlich
Member


Dabei seit: 10.11.2002
Beiträge: 276

Themenstarter Thema begonnen von scr!pTk!d
      Zum Anfang der Seite springen

Zitat:

(.........)
I think Assembler example is better for read than this C example.


Switch to Ring0 by IDT (Interupt Descriptor Table) aka EliCZ's method:
-------------------------------------------------

Next method is the best know. I saw it firts when used it my
friend EliCZ. After some days there was CIH virus which used
this method.
Most of programms which use Ring0 switching, use this method.
Some of anti-anti-debugg cracker's tools can detect it (Frog-Ice,
IceDump).


Example:

========================================
.386p
.MODEL FLAT,STDCALL
locals
jumps
UNICODE=0
include w32.inc


Extrn SetUnhandledExceptionFilter : PROC

Interrupt equ 5 ;interrupt number which we will use
;if you use Int 1h or 3h, it will be
;more harder debugg your program
.DATA

msg1 db "Switch to Ring0 by IDT",0
msg2 db "Ring0 activated",0


.CODE
Start:

push edx
sidt [esp-2] ;read IDT to stack
pop edx ;address of Interrupt table
add edx,(Interrupt*8)+4
;Interrupt table base+Int number+size for
;Int in Interrupt table=Int vector address
mov ebx,[edx]
mov bx,word ptr [edx-4]
;read old address our interrupt (INT 5h)

lea edi,InterruptHandler
mov [edx-4],di
ror edi,16 ;set our new interrupt handler
mov [edx+2],di

push ds ;save registers
push es


int Interrupt ;jump to Ring0 (our int 5h handler)

pop es ;restore registers
pop ds


mov [edx-4],bx ;set old int 5h handler
ror ebx,16
mov [edx+2],bx

call MessageBoxA,0, offset msg2, offset msg1,0
call ExitProcess, -1



;--------------------------------------------------------------------------
---
;OUR NEW INT 5h HANDLER (it run in Ring0)
;--------------------------------------------------------------------------
---

InterruptHandler:

mov eax,dr7 ;test for Ring0
iretd ;jump back to Ring3



ends
end Start
========================================

There are some other methods. But they weren't use in any
program. I write about them in secret area. There are
two other methods for Win9x (two very good methods)
and one method for WinNT and Win2k.


das ganze stammt von
http://www.anticracking.sk/Articles/Ring0.txt

__________________
ceterum censeo carthaginem esse delendam

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von LX: 01.08.2004 16:53.

17.03.2003 13:34 scr!pTk!d ist offline E-Mail an scr!pTk!d senden Beiträge von scr!pTk!d suchen
CDW CDW ist männlich
eine Simulation


Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread

      Zum Anfang der Seite springen

hm, ich hab win2k SP3 und beim zugriff auf IDT bekomm ich Accessviolation... war wohl nix, aber irgendwo auf der Platte müsste ich noch was funktionierendes haben, schau mal nach...
17.03.2003 19:13 CDW ist offline E-Mail an CDW senden Homepage von CDW Beiträge von CDW suchen
scr!pTk!d scr!pTk!d ist männlich
Member


Dabei seit: 10.11.2002
Beiträge: 276

Themenstarter Thema begonnen von scr!pTk!d
      Zum Anfang der Seite springen

merkwürdig... wäre cool, wenn du was finden würdest

__________________
ceterum censeo carthaginem esse delendam
17.03.2003 21:16 scr!pTk!d ist offline E-Mail an scr!pTk!d senden Beiträge von scr!pTk!d suchen
CDW CDW ist männlich
eine Simulation


Dabei seit: 12.10.2002
Beiträge: 1.329
Herkunft: CreateRemoteThread

      Zum Anfang der Seite springen

hier ist das, da ist so ein Beispiel drin, welches den Treiber RAMA.sys (beigelegt mit Quelltext) dazu benutzt, nen ring0 Code auszuführen:
ach ja....
Zitat:
Next method is the best know. I saw it firts when used it my
friend EliCZ. After some days there was CIH virus which used
this method.

ich sollte mal lesen lernen, jetzt weiß ich auch warum der oben gepostete Code nicht geht, das ist die win9.x methode...

http://www.cdw.de.vu/w32104.zip

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von CDW: 18.03.2003 18:46.

18.03.2003 18:44 CDW ist offline E-Mail an CDW senden Homepage von CDW Beiträge von CDW suchen
scr!pTk!d scr!pTk!d ist männlich
Member


Dabei seit: 10.11.2002
Beiträge: 276

Themenstarter Thema begonnen von scr!pTk!d
      Zum Anfang der Seite springen

cool, vielen dank smile
ich werde mich bei gelegenheit revanchieren

__________________
ceterum censeo carthaginem esse delendam
18.03.2003 19:55 scr!pTk!d ist offline E-Mail an scr!pTk!d senden Beiträge von scr!pTk!d suchen
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
BlackBoard » Design, Programmierung & Entwicklung » Programmieren » C "low level" Systemzugriffe

Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH