Zitat von
Zacherl:
Das Programm von mir setzt die Affinity Mask auf die erste CPU. Daher wird doch auch nur die Base Adresse der IDT von CPU1 angezeigt. Bei meinen Tests hatte eigentlich immer die erste CPU die "normalen" Werte. Oder ist das nicht immer so?
Sagen wir mal so, es gibt Ausnahmen. Die hast du ja selber implizit schon genannt ... Software, die was hookt. Bspw. SoftICE soll es tun. Ich habe kein SoftICE, daher weiß ich es nicht hundertprozentig sicher. Allerdings hookte SoftICE so ziemlich jeden Aspekt des Systems ... vermutlich der Grund warum das Produkt eingestellt wurde.
Wichtiger wäre es wohl, eine Kombination aus GDT, LDT und IDT zusammen mit TSS zu benutzen und eben die CPUs zu beachten. Seit VMWare 5.5 (oder 6?) kannst du zumindest nicht mehr davon ausgehen, daß nur eine CPU in einer VM verfügbar ist. Abgesehen davon solltest du den Humbug, der in den Papers von Rutkowska und dem welches Blackdrake ausgegraben hat (was dank der Schreibfehler deutlich unprofessionell auf mich wirkt) nicht zu ernstnehmen. Was ich meine ist der Teil wo gesagt wird, daß die IDT reloziert werden muß, weil es sonst zum Konflikt kommen würde. Ich konnte in meinem Paper eindeutig nachweisen, daß diese Annahme falsch ist, auch wenn ich prinzipiell nicht unbedingt eine bessere Idee habe. Allerdings ist SIDT eben keine privilegierte Instruktion, so daß der VMM nicht wissen kann wann sie ausgeführt wird -
es sei denn diese Instruktion wird komplett emuliert ... was wiederum die Relokation der IDT (usw.) überflüssig machen würde.
Zitat von
Zacherl:
Kann man sagen, dass wenn mindestens ein Wert der CPU "normal" ist es sich nicht um eine VM handelt?
Außer bei Hooks. Es dürfte wohl ziemlich effektiv sein, wenn man auf einem Device-IRQL die Adresse der IDT austauscht. Da man es ohnehin immer nur für eine CPU macht und die einzigen Anforderungen die Ausrichtung (Alignment) und die Tatsache, daß es im residenten Speicher untergebracht sein muß, sein dürften, ist es nicht schwer einen solchen Hook zu setzen.
Da aber deine Absicht nur ist, den Anwender drauf hinzuweisen, daß er es nicht in einer VM laufen lassen soll, weil es rechenintensiv ist, sollte es ja kein Problem sein, wenn du auch mal innerhalb einer VM diesen Hinweis nicht anzeigst. Schlimmer wäre der umgekehrte Fall, wo du einen Nutzer auf einer nativen Maschine auf diese Sachen hinweist, weil du es fälschlicherweise als VM erkennst.