« Archives in July, 2011

Neuere Lenovo BIOS ISOs auseinander nehmen und zu einem USB Stick machen …

Falls ihr schonmal versucht habt, die Daten aus einer der neueren BIOS ISOs zu extrahieren, werdet ihr gemerkt haben, dass dies gar nicht so einfach ist, weil alle Packprogramme scheitern. Daher erkläre ich kurz, wie ihr die Daten extrahiert und grob wie ihr einen USB Stick mit DOS und dem Biosupdate erstellt, aber hauptsächlich geht es ums extrahieren. Im Beispiel beziehe ich mich auf das aktuellste Bios Update Iso fürs R400 (3.22/3.20) von hier.

Bisher nutzte IBM/Lenovo für die ISOs immer die Floppy Emulation Methode um die CD bootbar zu machen. Hat man diese ISOs mit einem Packprogramm entpackt, sah der Inhalt so aus:

|-- [BOOT]
|   `-- Bootable_1.44M.img
|-- $01B2000.FL1
|-- $01B2000.FL2
|-- 06f1.hsh
|-- 06F1.PAT
|-- 06f4.hsh
|-- 06F4.PAT
|-- 06f5.hsh
|-- 06F5.PAT
|-- 06f9.hsh
|-- 06F9.PAT
|-- 06fa.hsh
|-- 06FA.PAT
|-- 06fb.hsh
|-- 06FB.PAT
|-- 06fd.hsh
|-- 06FD.PAT
|-- 10661.hsh
|-- 10661.PAT
|-- 10671.hsh
|-- 10671.PAT
|-- 10674.hsh
|-- 10674.PAT
|-- 10676.hsh
|-- 10676.PAT
|-- CHKBMP.EXE
|-- COMMAND.COM
|-- FLASH2.EXE
|-- lcreflsh.bat
|-- LOGO.BAT
|-- LOGO.SCR
|-- PHLASH16.EXE
|-- PREPARE.EXE
|-- README.TXT
|-- TPCHKS.EXE
|-- UPDTFLSH.EXE
|-- UPDTMN.EXE
|-- USERINT.EXE
`-- UTILINFO.EXE

Hingegen sieht es bei neueren ISOs so aus (je nach Packprogramm hat das Image einen anderen Namen und verschiedene Größen):

`-- [BOOT]
    `-- Bootable_HardDisk.img

Wie man sieht, fehlen alle Dateien, da sie im Bootloader stecken, Lenovo hat hier die sogenannte “Hard Drive Emulation” Methode benutzt. (hier findet man Infos dazu). Da wir mit dem Image, welches das Entpackprogramm entpackt nichts machen können, müssen wir auf die Suche gehen: Wir brauchen das eingebettete Image und den Anfangssektor um es zu extrahieren.

Es gibt genau ein Tool welches aus so einem Image noch etwas mehr “herausholen” kann, das ist das Tool IsoBuster unter Windows. Die Testversion tuts für unsere Zwecke; Ich hab sie in einer Windows VM benutzt. (Ob es unter Wine geht weiß ich nicht, könnte aber sein.)

Also öffnen wir nun die ISO mit IsoBuster und siehe da, dort ist zusätzlich zum nutzlosen Image noch ein File namens BootCatalog.cat, welches wir sofort extrahieren. Was BootCatalog.cat genau macht weiß ich nicht, aber wir öffnen es nun in einem HexEditor (unter Linux nutze ich GHex).

Hex Ausschnitt

Wir sehen auf dem Bild:
88 -> Markierung dass die ISO bootfähig ist.
04 -> Markierung dass die ISO “hard drive emulation” nutzt.
1B 00 00 00 -> Anfangsadresse des Images in HEX (rückwärts) -> 0x0000001B = 27 (auf dem Bild ist eine Nullengruppe zuviel markiert…)

Also ist 27 die Anfangsadresse, die Sektorgröße einer CD ist 2048, Anfangssektor ist 2048*27=55296. Nun können wir es mit dd ausbauen:

sudo dd if=7uuj47uc.iso of=extracted-hdd.img bs=2048 skip=27

Jetzt durchsuchen wir das Image nach Dateisystemen mit sudo fdisk -l extracted-hdd.img:

Platte extracted-hdd.img: 25 MByte, 25149440 Byte
64 Köpfe, 32 Sektoren/Spur, 23 Zylinder, zusammen 49120 Sektoren
Einheiten = Sektoren von 1 × 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

            Gerät  boot.     Anfang        Ende     Blöcke   Id  System
extracted-hdd.img1   *          32       49151       24560    4  FAT16

Jetzt wissen wir also, dass im Image ein Sektor 512 Bytes hat und der Anfang bei Adresse 32 liegt. Anfangssektor ergibt sich damit aus 32*512=16384.
Einhängen lässt sich das Image nun folgendermaßen:

sudo mount -o loop,offset=16384 extracted-hdd.img /mnt

Und schon ist in /mnt der ganze Inhalt sichtbar:

|-- FLASH
|   |-- 7UET92WW
|   |   |-- $01B8200.FL1
|   |   |-- $01B8200.FL2
|   |   |-- 06fd.hsh
|   |   |-- 10674.hsh
|   |   |-- 10676.hsh
|   |   `-- 1067a.hsh
|   |-- 7VET90WW
|   |   |-- $01B8100.FL1
|   |   |-- $01B8100.FL2
|   |   |-- 06fd.hsh
|   |   |-- 10674.hsh
|   |   |-- 10676.hsh
|   |   `-- 1067a.hsh
|   |-- 06FD.PAT
|   |-- 10674.PAT
|   |-- 10676.PAT
|   |-- 1067A.PAT
|   |-- CEIMAIN.BIN
|   |-- CHKBMP.EXE
|   |-- COMMAND.COM
|   |-- FI.EXE
|   |-- FINDRAMD.EXE
|   |-- FLASH2.EXE
|   |-- FP.EXE
|   |-- lcreflsh.bat
|   |-- LOGO.BAT
|   |-- LOGO.SCR
|   |-- PHLASH16.EXE
|   |-- README.TXT
|   |-- ROM2MOD.EXE
|   |-- TPCHKS.EXE
|   |-- UPDTFLSH.EXE
|   |-- UPDTMN.EXE
|   |-- USERINT.EXE
|   `-- UTILINFO.EXE
|-- AUTOEXEC.BAT
|-- COMMAND.COM
|-- CONFIG.SYS
|-- HIMEM.SYS
|-- IBMBIO.COM
|-- IBMDOS.COM
|-- RAMDRIVE.SYS
`-- WINA20.386

Ziel erreicht ;)

Ich werde jetzt nicht im Detail darauf eingehen, wie man einen Dos Stick unter Linux erstellt, dafür gibt es genug Anleitungen. Wichtig: Hier braucht man einen MS-DOS Stick, ob es mit einem FreeDOS Stick geht, weiß ich nicht.
(Tipp: unter Windows einen MS DOS Stick erstellen per Hp Tool und dann mit dd ein Image machen, dann habt ihr immer wieder die Möglichkeit aus dem Image einen zu machen.)

Jetzt kopiert ihr einfach alle Dateien und Ordner aus dem Image extracted-hdd.img, welche nun in /mnt liegen, auf den USB Stick. (sichert euch vorher aber vom DOS Stick COMMAND.COM,IO.SYS,MSDOS.SYS)
Bei mir war nun das Problem, dass er nicht booten wollte, weil die COMMAND.COM ungültig sei oder sowas, aber das ließ sich leicht lösen, in dem man die 3 Dateien (COMMAND.COM,IO.SYS,MSDOS.SYS) vom ursprl. Dos Stick drüber schreibt, bei mir waren sie von einer Windows 95 Startdiskette (genau wie der ganze Stick). (die COMMAND.COM.usw. in FLASH müssen nicht geändert werden! Nur die auf der obersten Ebene.)

Damit lief das Biosupdate komplett & fehlerfrei durch, wenn auch das Win 95 Startdisketten Bild kontinuierlich (ausser am Schluss) angezeigt wurde ;)

Jetzt könnt ihr euch auch unter Linux das FN+STRG Switch Middleton Bios Flashen z.B.. (falls es keine Iso gibt von Middleton, bei manchen Modellen fehlen diese Images.). Man ersetzt einfach die FLASH/7UET92WW/$01B8200.FL2 sowie FLASH/7UET92WW/$01B8200.FL1 mit denen aus dem Windowspaket und die autoexec.bat ändert man wie folgt:

@ECHO OFF
PROMPT $p$g
cd c:\flash
cls
echo.
echo.
echo Updating Embedded Controller. Please wait...
phlash16 /mode=0 /p /s /cs /x /exit /v /keepcmos 7UET92WW\$01B8200.FL2
echo EC flash completed. Reboot your machine now.
echo.
echo.

Schon hat man sich aus dem originalen Bios Update ISO und dem Middleton Windows Bios Update einen USB Stick gemacht.Ebenso kann man einen Zurücksetz-Stick machen (das was für mich der Hauptgrund), in dem man das originale ISO nimmt und alles original lässt und nur die autoexec.bat wie oben ändert.

Wer sich hingegen daraus wieder ein ISO machen will, dem sei dieses Post ans Herz gelegt. Von dort habe ich auch die wichtigsten Infos für diese Anleitung hier, daher herzlichen Dank an Icecube für die Informationen.

Jetzt weiß ich auch warum man die neueren BIOS ISOs von Lenovo nicht mit Unetbootin bootbar machen kann, das klappte nämlich nicht und ich wusste nie wieso, vermutlich liegt es an der Hardware Emulation.
Wer hingegen nur ein ISO booten will, ohne was zu verändern, dem sei die GRUB Methode ans Herz gelegt.