Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: orp am 15. August 2004, 14:52
-
hi,
ich bin mir sicher, dass das eine entsätzlich dumme frage ist, aber wozu wird soetwas unter windows ring0 gemacht:
MOV EAX,00000030h
MOV FS,AX
mov eax,23h
mov ds,ax
also was befindet sich in diesen segmenten (fs=30,ds=23)?
-
Woher sollen wir das wissen? Jeder kann sich im Protected Mode die Segmente sonstwie belegen, im Realmode wäre da nix besondres. Aber im PM wäre 23h irgndwie seltsam, wäre ja dann DPL 1 und in der LDT hm keine AHnung was das heisst, wenn wir die GDT usw nicht kennen. Also von daher die Frage ist nicht dumm, sie ist nur nicht zu beantworten, oder ich übersehe was ^^
Anyway ich begrüss dich mal als neues Member hier;)
-
ich hätte noch schreiben sollen, dass ich den code aus einer interrupt handler routine (int 1, debug interrupt) für windows 2k/xp habe
macht das jetzt mehr sinn, oder ist das praktisch willkürlich und könnte auch weggelassen werden?
-
Bringt mir ehrlich gesagt auch nix, da ich nicht weiss was in der GDT von Windows drinsteht
-
Interrupt-Handler unter NT?
Hast du etwa den NT-Kernel disassembliert oder was?
-
Naja, es ist zwar illegal, aber irgendwo (Chip glaub ich) stand mal dass bei irgendeiner Firma mit Windows-Quellcode Lizenz durch ein Sicherheitsleck der Source von Windows 2000 und NT entwendet wurde und seit dem bei diversen Tauschbörsen zu finden ist. Natürlich will ich unseren Freund hier ja nicht irgendwie damit belasten, ich wollts nur mal loswerden.
-
nee, is nich orginal nt kernel code
sondern nen nicht-microsoft int1 handler code
und der funktioneirt auch ganz gut ohne das DS, FS setup
allerdings klemmts immernoch irgendwo
mal ne andere frage
wie sieht eigentlich der stack bei aufruf eines int handlers aus?
hat da mal jemand n link zu?
-
Also geht das nur mir so oder wird hier noch jemand absolut nich aus seinen Fragen schlau?
-
naja, ich kam zu der frage, weil in meinem ominösen int1 handler code is, der weit oberhalb vom aktuellen ESP werte manipuliert
wahrscheinlich landet wie bei einem call irgendeine return addr aufm stack, die nachm iret dann irgendwie weiterverwendet wird
-
Ja das mit dem Win2K-Source hab ich auch gehört, aber orp meint hier was anderes...
@Roshl
Also so richtig versteh ich ihn auch nicht ^^
Also nochmal: was ist das für ein Code? Wie bindest du ihn ein? In was für eine Art Programm?
-
also was mittlerweile funktioniert ist folgendes:
ein windows2k/xp treiber, der die IDT für int1 verbiegt, und auf meinen int1 handler zeigen lässt.
ich will sozusagen int1 hooken.
unter bestimmten bedingungen rufe ich den orginal int1 handler auf, manchmal mache ich aber auch nur meinen eigenen kram.
-
Ok, jetzt wird mir einiges klar.
1. Was genau funktioniert nicht? / Was passiert?
2. Funktioniert der Original-Handler?
-
also int1 hooken, und exception resetten usw funktioniert nach zirka 1000 bluescreens ganz gut
die restlichen pitfalls krieg ich noch so hin, hoffe ich mal
wenn nich, hab ich ja jetzt nen cooles forum zum nerven :)
-
Hi,
also der Selektor 0x23 (genauer gesagt der 0x20 und RPL=3, oder so) ist ein Data-Selektor (RW) mit Basis=00000000, Limit=000fffff und DPL=3.
Der Selektor 0x30 ist schon spannender: Basis=ffdff000, Limit=00000001, und DPL=0. Und wieder Data (RW). Was das sein soll, weiss ich nicht. Sieht aber nett aus.
Quelle: Powerpoint-Präsentation: Operating Systems Case Study Windows 2000 (NT) von Greg O'Shea, Microsoft Research. 22 Februar 2000 (Google könnte helfen.)
MfG PorkChicken
-
Limit 1? dann hätte das ja bei gesetztem Granularbit 4KB bei nicht gesetzten 1 Byte wer brauch denn sowas?
Die Beschreibung zu dem 0x23 erscheint mir so wie du sie hast wenig sinnvoll und zwar weil: Wenn ich Basis und Limit mal zusammennehme gehe ich einfach mal davon aus dass der Deskriptor den ganzen Speicherraum umfasst. So wenn dann aber nur DPL 3 ist und auch noch Lese und Schreibrechte gelten würde das ja heissen das jedes beliebige Proggi einfach alles umschreiben kann!! (Würde bei Windows zwar einiges erklärn aber so blöd sind selbst die nich) Irgendwie kann da was nicht stimmen.
By the Way meinst du IRQ 1? Dann würdest du ja den TastaturIRQ umbiegen. Wozu? Oder meinst du wirklich Int 1 das wäre eine Exception. Noch grösseres Wozu?
Achso und bei einem Int wird im Protected mode der Selektor und die relative Adresse auf den Stack gepusht, damit auch wieder zurückgefunden werden kann. Im Prinzip wie bei einem normalen ret nur das bei iret das Interruptflag noch verändert wird.
-
Tja, was Limit 1 sein soll, weiss ich auch nicht.
Das mit Basis=0, Limit=4GB ist durchaus richtig, weil ja immer noch das Paging aktiviert ist, was das Herumgeschreibe in fremden Speicherbereichen verhindert. Wenn du mal bei einer normalen Windowsanwendung dir DS, ES und SS ausgeben lässt, steht in denen übrigens auch 0x23.
-
segment 30h sieht unter windows2000 heutzutage so aus (meint zumindest softice):
Type:Data: Read-Write
Address: ffdff000
Limit: 1fff
DPL: 0
Granularity: Page
Present: P
was da drin stattfindet, weis ich allerdings immernochnicht, aber weil mein code auch ohne FS=30h funktioniert, is das nichmehr so wild
int1 issn intel hardware interrupt, der bei debug exceptions aufgerufen wird:
; The processor triggers this exception for any of the following
; conditions:
;
; 1. Instruction breakpoint fault.
; 2. Data address breakpoint trap.
; 3. General detect fault.
; 4. Single-step trap.
; 5. Task-switch breadkpoint trap.
-
so ich hab mehr herausgefunden, was es mit dem Selektor 30h auf sich hat. Es hat laut meiner neuen Quelle, wirklich das Limit 1fff (und nicht 1) und zeigt auf die processor control region (PCR). Was auch immer das sein soll.
Ach ja meine Quelle:
comp.lang.asm.x86 (http://groups.google.de/groups?hl=de&lr=&ie=UTF-8&threadm=a6qrqv8uim970fgks9qdm18024qp3l4088%404ax.com&rnum=1&prev=/groups%3Fq%3Dwindows%2Bquestion%2B(low%2Blevel)%26hl%3Dde%26lr%3D%26ie%3DUTF-8%26selm%3Da6qrqv8uim970fgks9qdm18024qp3l4088%25404ax.com%26rnum%3D1)
Da stehen auch noch ein paar andere interessante Selektoren beschrieben.
-
FYI, der stack bei einer exception ohne priv wechsel sieht so aus
________
| EFLAGS
| CS
| EIP
| ERROR CODE (nicht bei allen ints)
v
(weil ich das gefragt hatte, und niemand replyed hatte)