Date

Anhang

Größe

Datei procwrapper.cpp

2.16 KB

... so lautet die fehlermeldung, die ich bekommen habe als ich Windows Vista auf einem ASUS Z53T laptop neu aufsetzen wollte. Danach bricht die installation ab :-(

Ich habe dazu die von ASUS gelieferte recovery-dvd benutzt. Die google-suche nach diesem fehler ergab zwei mögliche ursachen:

  1. Ein BIOS problem, das heisst die ursache ist eine falsche BIOS version.

  2. Die fehlende Recovery-Partition auf der festplatte.

Da die fehlermeldung ja davon handelt, dass die installation ein bestimmtes image nicht laden kann, bin ich zunächst davon ausgegangen, dass es and der fehlenden Recovery-Partition liegt. Das sollte sich als falsch herausstellen, die installation braucht keine Recovery-Partition...

Auf der DVD sind zwei dateien (ASUS.SWM und ASUS2.SWM) mit zusammen über 3GB vorhanden, dass lässt darauf schliessen, das dort alle notwendigen daten für eine installation vorhanden sind. Die idee war nun, sich daraus eine recovery-partition zu bauen.

Eine (versteckte) partition anzulegen und docrt ein paar dateien abzulegen ist kein problem, nur wie muss die verzeichnisstruktur aussehen, wie müssen die dateien benannt werden und auf welchem laufwerk werden die dateien gesucht?

Die Untersuchung der Recovery DVD:

Um das herauszufinden, muss der installationsprozess genauer untersucht werden. Hier ein paar dabei gewonnene erkentnisse:

  • Die installation prüft die hardware, eine installation ist nur auf dem entsprechenden laptop möglich. Dadurch lässt sich die sache nicht einfach auf einer virtuellen maschiene (VirtualBox) ausprobieren. Was man allerdings mit einer VirtualBox machen kann, ist das prüfen der selbst erzeugten boot-iso's. Damit ist man wenigstens sicher, dass die CD/DVD bootet und die installation losläuft.

  • Die verzeichisstruktur auf der DVD:

    total 3484935
    -r-xr-xr-x 1 root root 1992158532 Jan 11  2007 asus.swm
    -r-xr-xr-x 1 root root 1575973411 Jan 11  2007 asus2.swm
    dr-xr-xr-x 1 root root        230 Jan  9  2007 boot
    -r-xr-xr-x 1 root root     438840 Nov  2  2006 bootmgr
    dr-xr-xr-x 1 root root        110 Jan  9  2007 efi
    dr-xr-xr-x 1 root root        110 Jan  9  2007 sources
    
    ./boot:
    total 3355
    -r-xr-xr-x 1 root root  262144 Sep 18  2006 bcd
    -r-xr-xr-x 1 root root 3170304 Sep 18  2006 boot.sdi
    -r-xr-xr-x 1 root root    2048 Sep 18  2006 etfsboot.com
    dr-xr-xr-x 1 root root     298 Jan  9  2007 fonts
    
    ./boot/fonts: ...
    
    ./efi:
    total 1
    dr-xr-xr-x 1 root root 106 Jan  9  2007 microsoft
    
    ./efi/microsoft:
    total 1
    dr-xr-xr-x 1 root root 142 Jan  9  2007 boot
    
    ./efi/microsoft/boot:
    total 257
    -r-xr-xr-x 1 root root 262144 Sep 18  2006 bcd
    dr-xr-xr-x 1 root root    298 Jan  9  2007 fonts
    
    ./efi/microsoft/boot/fonts: ...
    
    ./sources:
    total 165405
    -r-xr-xr-x 1 root root 169374418 Jan  9  2007 boot.wim
    
  • WIM und SWM dateien sind windows-image dateien die mit dem tool "imagex.exe" aus dem windows "AIK" packet ausgelesen und bearbeitet werden können.

    • "imagex /mountrw BOOT.WIM 1 c:\bootcd" mountet den inhalt der boot-ramdisk nach c:\bootcd, dort können die dateine untersucht und auch verändert werden.
    • "imagex /unmount /commit" löst die verbindung zum verzeichnis wieder und speichert die änderungen im WIM file
  • Die installationsimages ASUS*.SWM enthalten vier verschiedene Vista versionen, Basic, Premium, Business und Ultimate. Die gewünschte version wirt über einen index von 1 bis 4 beim öffnen von ASUS*.SWM ausgewählt.

  • Boot-/Installationsvorgang der recovery DVD (http://en.wikipedia.org/wiki/Windows_Vista_startup_process):

  • Bootloader startet BOOTMGR, dieser liest seine konfiguration aus Boot/BCD (BCD (Boot Configuration Data) ist ein "BCD-Speicher", der mit Bcdedit editiert/ausgelesen werden kann). Das kommando "bcdedit.exe <dvd>:boot/bcd" (als administrator ausgeführt) zeigt uns zwei wichtige sachen: BOOTMGR lädt als ramdisk die datei "<dvd>:sources/boot.wim" und startet darin das program "<ramdisk>:/windows/system32/boot/winload.exe". Das ist ein normaler windows startvorgang. Winload.exe startet ein "mini-windows", dann gehts mit dem registry-eintrag "HKLM\SYSTEM\Setup\CmdLine startet Winpeshl.exe" weiter. Die konfiguration von Winpeshl.exe befindet sich in "<ramdisk>:windows/system32/winpeshl.ini". Dort ist schliesslich der folgende befehl eingetragen: "x:\ghost\recovery_cd.exe", x: bezeichnet dabei die ramdisk.

  • Inhalt der ramdisk (BOOT.WIM):

    Directory of C:\cdboot
    
    02.11.2006  03:24    <DIR>          .
    02.11.2006  03:24    <DIR>          ..
    02.11.2006  03:23    <DIR>          Program Files
    02.11.2006  03:22    <DIR>          Users
    02.11.2006  03:23    <DIR>          Windows
    08.01.2007  23:46    <DIR>          Ghost
                   0 File(s)              0 bytes
    ...
    
     Directory of C:\cdboot\Ghost
    
    08.01.2007  23:46    <DIR>          .
    08.01.2007  23:46    <DIR>          ..
    22.05.2006  17:48                13 diskpart.txt
    04.12.2006  05:32         2.770.568 gdisk32.exe
    04.12.2006  05:32         5.283.464 ghost32.exe
    13.12.2006  21:35                63 HIDDEN1.TXT
    05.01.2006  01:24                12 Info.CMD
    22.05.2006  17:43                15 Info2.CMD
    09.01.2007  15:46           442.368 Recovery_CD.exe
    13.12.2006  15:44           225.280 Recovery_Progress.exe
    26.09.2006  18:46           204.800 SERROR.exe
    02.11.2006  01:34           318.464 wimgapi.dll
                  10 File(s)      9.245.047 bytes
    
  • Die installation wird dann im wesentlichen von zwei programmen durchgeführt, "recovery_cd.exe" (im folgenden abgekürzt mit RCD.EXE) und "recovery_progress.exe" (abkürzung: RP.EXE). Das Programm RCD.EXE führt die folgenden aktionen durch:

    • Hardware-prüfung, abbruch der installation falls nicht die entsprechende hardware (ASUS X53T laptop) gefunden wird.
    • Einrichtung der partition(en) auf der festplatte mit hilfe von "norton ghost" (gdisk32.exe und ghost32.exe).
    • Aufruf von RP.EXE, dieses öffnet das installationsimage ASUS*.SWM und kopiert dessen inhalt auf die C: partition. Dabei anzeige des obligatorischen fortschrittbalkens. RP.EXE gibt im fehlerfall eine entsprechende fehlermeldung mit hilfe des programms "SERROR.EXE" aus, "SERROR.EXE" bekommt die fehlermeldung per kommandozeile übergeben.
    • Nach erfolgreichem durchlauf von RP.EXE startet RCD.EXE den zweiten teil der installation, das kopieren der treiber-dvd. RCD.EXE macht eine entsprechende benutzerabfrage "Please insert the Driver CD.".
    • Der formatstring "%s\%s %d %sASUS.SWM" in RCD.EXE lässt vermuten, dass RP.EXE das zu installierende image per kommandozeile mitgeteilt bekommt, hier wirds interessant.

Untersuchung Teil 2, procwrapper.exe:

Die frage ist nun: Mit welchen parametern wird RP.EXE gestartet? Um diese frage zu beantworten, habe ich ein kleines tool "procwrapper.exe" gebastelt ("quick and dirty", quellcode im anhang). Dieses wird als RP.EXE im BOOT.WIM image installiert und führt folgende aktionen durch:

  • Ausgabe der kommandozeilen parameter auf der konsole.
  • Schreibt die parameter zusätzlich in eine logdatei in "%TMP%" oder "%TEMP%".
  • Start einer zusätzlichen konsole (cmd.exe) - damit ist das weitere untersuchen der laufzeitumgebung möglich. Es können dadurch auch weitere nützliche tools wie z.b. der taskmanager (taskmgr.exe) gestartet werden.
  • Also das ramdiskimage (BOOT.WIM) entsprechend modifiziert und ein neues recovery boot image erzeugt. Ich habe dabei aus zeit- und platzgründen die ASUS*.SWM dateien weggelassen, das image ist dann nur noch ca. 200Mb gross und passt somit auch auf eine CD. Falls man die ASUS*.SWM images später bei der installation braucht, so kann man die orginal recovery dvd ins laufwerk einlegen und damit weitermachen.

Nachdem das image auf CD gebrannt und die installation gestartet wurde, gibt uns "procwrapper.exe" die gesuchten informationen:

  • RP.EXE wird auf einem laptop, bei dem die installation funktioniert mit den parametern: "RECOVERY_PROGRESS.EXE 2 D:\ASUS.SWM" aufgerufen.
  • Im fehlerfall lautet der aufruf: "RECOVERY_PROGRESS.EXE 0 D:\ASUS.SWM".

Das laufwerk D: ist in diesem moment das CD/DVD laufwerk, das heisst, der ursprüngliche fehler bei der installation liegt NICHT an einer fehlenden imagedatei oder an einer fehlenden recovery partition! Die dateien sind genau da, wo sie vom installer gesucht werden.

Das problem ist der erste parameter von RP.EXE - der index der zu installierenden Vista version - es gibt keinen index 0 in ASUS.SWM. Es scheint so zu sein, dass RCD.EXE anhand des BIOS die zu installierende Vista version ermittelt. Gelingt dies nicht, so wird der index 0 an RP.EXE weitergegeben und die installation geht daneben.

Die installation:

An diesem punkt kann die installation - ohne BIOS änderung - einfach fortgeführt werden: Wir legen die recovery-dvd mit den ASUS*.SWM images ein und führen in der von "procwrapper.exe" gestarteten konsole den befehl "RECOVERY_PROGRESS.EXE 2 D:\ASUS.SWM"ein. Dadurch läuft die installation weiter als ob nie was gewesen wäre. Auch der zweite teil der installation - die installation der treiber-dvd - läuft anstandslos durch.

Das ergebnis ist ein frisch installiertes und aktiviertes Vista Home Premium mit allen treibern und ASUS tools.

Verwendete Tools:

  • Imagex zum öffnen und bearbeiten von WIM und SWM dateien.
  • CDIMAGE_GUI zum erzeugen von bootfähigen CD/DVD images. Wichtig: Als "boot sector file" die datei "BOOT\ETFSBOOT.COM" auf der recovery-dvd angeben, ansonsten können die voreinstellungen benutzt werden.
  • Imgburn, CDBurnerXP oder ähnliches um das CD/DVD image zu brennen.

Tags:

Hacking