Crack für LOOM / Deutsch
Beim Stöbern in meinen alten DOS-Spielen bin ich unlängst wieder auf das bekannte Adventure LOOM gestoßen. Der “Kopierschutz” des Spiels besteht aus einem Doccheck, also der Abfrage von bestimmten Werten, welche im Handbuch abgedruckt sind.
Nachdem es doch etwas lästig ist, immer im Handbuch nachzuschlagen, wurde mein sportlicher Ehrgeiz geweckt und ich habe mich daher etwas näher mit der SCUMM-Engine beschäftigt. Nachdem der nachgebaute SCUMM-Interpreter SCUMMVM die Handbuchabfrage auch umgeht (zumal der Hersteller dies bei einigen Versionen sogar selbst gemacht hat) habe ich hier eigentlich keine Bedenken, meine Untersuchungsergebnisse zu veröffentlichen.
Mithilfe der SCUMMVM kann man im Debug-Modus die interpretierten VM-Kommandos mitschreiben lassen und bekommt damit ungefähr eine Idee, wo die Abfrage für den Kopierschutz zu finden ist. Zuerst muss SCUMMVM mitgeteilt werden, dass sie den Kopierschutz nicht umgehen soll, sonst wird dieser stillschweigend übersprungen. Dies geschieht mittels des Eintrags copy_protection=true
in %APPDATA%\ScummVM\scummvm.ini
Danach kann man die Ausgabe von SCUMMvm auf STDOUT in eine Protokolldatei umleiten, indem man scummvm >log.txt
startet. Jetzt muss noch der DEBUG-Modus aktiviert werden, damit die Kommandos mitgeschrieben werden. Dies geschieht mit CRTL+D. Auf der Debug-Konsole aktiviert man die Protokollierung mittels debug +opcodes
Nun noch ein continue
und einmal den falschen Code eingegeben. Analysiert man das Protokoll, so erkennt man folgende Abfrage:
(69:203:0x1670): Script 203, offset 0x1670: [62] o5_stopScript()
(69:203:0x1672): Script 203, offset 0x1672: [2C] o5_cursorCommand()
(69:203:0x1674): Script 203, offset 0x1674: [2C] o5_cursorCommand()
(69:203:0x1676): Script 203, offset 0x1676: [A8] o5_notEqualZero()
(69:203:0x167B): Script 203, offset 0x167b: [46] o5_increment()
(69:203:0x167E): Script 203, offset 0x167e: [48] o5_isEqual()
(69:203:0x1685): Script 203, offset 0x1685: [2A] o5_startScript()
Nun benötigt man noch einen Vergleichswert, was passiert, wenn man den richtigen Code eingibt:
(69:203:0x1670): Script 203, offset 0x1670: [62] o5_stopScript()
(69:203:0x1672): Script 203, offset 0x1672: [2C] o5_cursorCommand()
(69:203:0x1674): Script 203, offset 0x1674: [2C] o5_cursorCommand()
(69:203:0x1676): Script 203, offset 0x1676: [A8] o5_notEqualZero()
(69:203:0x17C3): Script 203, offset 0x17c3: [48] o5_isEqual()
(69:203:0x17CA): Script 203, offset 0x17ca: [2A] o5_startScript()
Offensichtlich wird also an Offset 0x1676 in der Datei 69.lfl auf die Gültigkeit der Eingabe geprüft und dementsprechend erfolgt dann ein Sprung ins Spiel.
Sucht man nun an besagtem Offset die von SCUMMvm gelisteten Kommandos, so wird man nicht wirklich fündig:
166F: 9D 33 D3 FD D3 FB 57 90 72 B7 FE B9 9C FF B7
Merkwürdig… Des Rätsels Lösung findet sich dann nach einigem Suchen im SCUMMVM Wiki: In der Version V3 OldBundle, welche das Spiel benutzt, sind die Dateien mit 0xFF verXORt. Also einfach mal mit XOR arbeiten, und siehe da:
166F: 62 CC 2C 02 2C 04 A8 6F 8D 48 01 46 63 00
Rot sind hier die einzelnen Kommandos wie oben beschrieben. Wenn also die Variable 6F 8D nicht 0 ist, dann wurde der Code falsch eingegeben und er wiederholt die Abfrage. Das Ziel ist es also, die Variable 6F D8 auf 0 zu setzen und das Spiel anschließend zu starten. Mithilfe der SCUMM Opcodeliste tauscht man nun das o5_notEqualZero gegen ein o5_move und füllt die Variable mit 0. Weiters kann man sich aus den Aufzeichnungen des Vorgangs, bei welchem der Code angenommen wurde, den Offset zum Sprungziel errechnen und entsprechend ein o5_jumpRelative Kommando einfügen, um das Spiel starten zu lassen. Und schon hat man den Kopierschutz “ausgehebelt”.
Gepatcht ergeben sich dann also folgende Opcodes:
166F: 62 CC 2C 02 2C 04 1A 6F 8D 00 00 18 4C 01
Die blauen bytes sind hierbei die geänderten Bytes. Wenn man das Ganze nun noch mit 0xFF verXORt, so hat man dann einen funktionierenden Crack.
Netzwerkverbindungen trennen bei Systemfehler 1219
Unter Windows kommt es ja öfters vor, dass man mal schnell über UNC-Pfad auf einen Server zugreift. Da erscheint dann ein Dialog, in welchem man Benutzername und Kennwort angeben soll, um sich am Server zu authentifizieren.
Nun kann es vorkommen, dass, sofern man sich mit einem gültigen Benutzernamen angemeldet hat, man sich auf dem Server mit einem anderen Benutzernamen anmelden will aber Windows zeigt natürlich den Dialog zur Eingabe von Benutzername und Kennwort nicht mehr an, da man sich ja schon mit einem gültigen Konto angemeldet hat.
Nachdem man über einen UNC-Pfad operiert hat gibt es auch keine zugewiesenen Laufwerksbuchstaben für Netzlaufwerke, die man trennen könnte und so endet dann jeder Verscuh, sich mit einem anderen Bentuzernamen anzumelden mit Systemfehler 1219: “Mehrfache Verbindungen zu einem Server oder einer freigegebenen Ressource von demselben Benutzer unter Verwendung mehrerer Benutzernamen sind nicht zulässig.”
Die Lösung ist eigentlich naheliegend, trotzdem habe ich für meinen Teil etwas gebraucht um draufzukommen, nachdem ja kein LAufwerksbuchstabe zugeordnet war. Am Commandprompt:
net use
Das zeigt mal alle Verbindungen an, auch welche ohne Laufwerksbuchstabe nur mit UNC-Pfad (Steht in der Spalte Remote). Für jede Verbindung dann einfach ausführen:
net use [UNC-Pfad] /delete
und schon kann man sich mit dem Server wieder neu verbinden.
Windows XP in Terminalserver verwandeln
Bin neulich zufällig über folgenden Link gestolpert. Ist zwar nicht wirklich legal, aber eine interessante Möglichkeit:
http://deepxw.blogspot.com/2009/04/universal-termsrvdll-patch.html
Damit kann man die Remotedesktop-Funktionen von Windows XP besser nutzen. Und so gaaanz illegal ist es ja nun auch nicht, denn Microsoft hat in der frühen Beta von Windows XP SP2 die Beschränkung auf eine Verbindung schonmal aufgehoben gehabt. Aber das ist eine andere Geschichte…
Überschreitung der Maximalen Pfadlänge und Explorer
Heute hatte ich bei einem Kunden einen interessanten Fall:
Dieser hatte in seinem “Eigene Bilder” Verzeichnis in verschiedneen Unterverzeichnissen Bilddateien abgespeichert.
In einigen Unterordnern wurde bei Bildern kein Vorschaubild angezeigt. Weiters gab es keine Möglichkeit, die Datei umzubenennen (Beep bei F2), auch kopieren, ausschneiden, verschieben usw. war nicht möglich. Im Kontextmenü fehlte ebenfalls der Menüpunkt “Eigenschaften”. Öffnen der Datei war natürlich auch nicht möglich, weder mit Doppelklick noch mit “öffnen”.
In der Eingabeaufforderung wurde die Datei mit dem dir Kommando angezeigt, bei attrib jedoch nicht. cacls * stoppte bei der ersten problematischen Datei mit einer Fehlermeldung.
Versuchte man im “Öffnen”-Dialog einer Applikation, die Datei zu öffnen, so wurde vermeldet, dass diese nicht gefunden werden kann.
Ein chkdsk lieferte keine Probleme im Dateisystem.
Beim Vergleich der funktionierenden und nicht funktionierenden Dateien fiel mir auf, dass nur Dateien mit relativ langen Dateinamen betroffen waren. Der Ordner, in dem die Dateien gespeichert waren, hatte ebenfalls einen relativ langen Nnamen. Als Programmierer fiel mir aufgrund dieser Gemeinsamkeiten dann irgendwann die MAX_PATH Konstante ein. Die gibt die maximale Länge eines Verzeichniseintrags, aber gleichzeitig auch die Maximallänge eines Pfades an! Nimmt man nun den tatsächlichen Pfad zum Eigene Dateien Verzeichnis und die Ordnernamen zusammen, so wurde die maximale Pfadlänge überschritten und damit funktionierte das Ganze dann nicht mehr, was zu den merkwürdigen Symptomen führte. Die Probe aufs Exempel: Kürzung des Ordnernamens (Dateiname kann ja nicht editiert werden bei Überschreitung): Siehe da, plötzlich konnte man die Dateien wieder verwenden.
Also: Falls die oben genannten Symtome auftreten, einfach mal die Pfadlänge prüfen.
Outlook Express von totem System migrieren
Es ist ja hinlänglich bekannt, wie man Outlook Express-Daten migriert: Einfach aus dem “Dokumente und Einstellungen\[User]\Lokale Einstellungen\Anwendungsdaten\Identities” Ordner die .dbx Fiels kopieren.
Dadurch werden jedoch die Einstellungen nicht übertragen. Um diese ebenfalls zu übertragen kann man sich das Feature zum Laden von Strukturen des Windows Registry Editors zunutze machen.
Folgende Vorgehensweise bietet sich daher an:
1) Kopieren des Ordners Dokumente und Einstellungen\[User]\Lokale Einstellungen\Anwendungsdaten\Identities
in denselben Ordner der neuen Installation
2) Kopieren des Adressbuchs aus Dokumente und Einstellungen\[User]\Lokale Einstellungen\Anwendungsdaten\Microsoft\Address Book
in das neue Verzeichnis.
3) Laden der alten Registry-Struktur im Registry-Editor. Hierzu geht man auf den Schlüssel HKEY_USERS, dann im Menü Datei auf Struktur laden… und gibt als Strukturname z.B. “alt” ein.
4) Exportieren folgender Schlüssel unterhalb des “Alt”-Zweigs in eine .reg Datei:
HKEY_CURRENT_USER\Identities
HKEY_CURRENT_USER\Software\Microsoft\Internet Account Manager
5) Schlüssel “Alt” mittels Datei/Struktur entfernen… wieder entladen.
6) Die exportierten .reg files editieren und den Pfad von HKEY_USERS\alt auf HKEY_CURRENT_USER ändern.
7) .reg Dateien importieren
8 ) Outlook Express starten und die Passwörter für die Accounts neu eingeben.
Könnte man eventuell acuh mit einem Programm automatisieren, aber händisch ist es auch nicht soviel Arbeit.
site update
hardwarefetish.com wurde mit heute auf wordpress umgestellt.
daher: rss feed läuft nun über feedburner und befindet sich hier: hardwarefetish.com/feed.
neues design und evtl. ein paar komfortable features folgen demnächst, die alten inhalte werden nach möglichkeit in den nächsten tagen wieder hergestellt.
danke für die aufmerksamkeit.
Debian Server ueber NEtzwerk auf neuen RAID1-Server migrieren
Am Wochenende hatte ich die Aufgabe, einen bestehenden Server auf einen neuen Rechner migrieren. Der neue Rechner
hat 2 Festplatten drin, die man als Software-RAID1 gespiegelt im Verbund betreiben kann.
Im Internet habe ich einige Anleitungen gefunden, wie man ein laufendes System zu einem RAID-1 Verbund konvertiert, aber der Aufwand ist in diesem Fall ja nicht nötig, da man ja übers Netzwerk auf ein komplett neues System migrieren kann.
Ich habe micht daher etwas herumgespielt und diese Anleitung entwickelt.
Vielleicht kann ja mal jemand was damit anfangen.
Erzeugung von core dump erzwingen trotz eigenem SIGSEGV handler
Ein Problem mit Programmen ist, dass diese immer mal wieder abstürzen. Der Kunde mault, der Entwickler ist ratlos wie es dazu gekommen ist. Um post-mortem noch etwas über den Crash der Applikation feststellen zu können, gibt es unter *nix coredump-files.
Nun kann man mit ulimit -c unlimited
die Erstellung dieser coredump zwar einschalten, aber das nützt nix, wenn man einen eigenen Signal handler für SIGSEGV hat, in dem man z.B. einen Stacktrace generieren und in ein Logfile zur Schnellanalyse schreiben kann.
Zufällig bin ich auf einen Mailinglisteneintrag gestoßen, wo erklärt wird, wie man den Signalhandler so setzt, dass trotzdem noch ein Stacktrace generiert wird. Prinzipiell muss man mit sigaction
mithilfe des Flags SA_RESETHAND
einstellen, dass der Signal-handler selbst auch wieder ein signal absetzen darf und im Signal-handler dann mit raise
das Signal nochmals senden, sodass der Kernel den Coredump produziert.
Ich habe den Code noch etwas erweitert, um z.B. die Erstellung eines Coredumps trotz ulimit -c 0 zu ermöglichen
und in meinem Signal handler gibt’s einen Stracktrace auf stderr.
Den Beispielcode findet man hier
Das weitere Debuggen des coredumps sollte dann ohnehin bekannt sein:
gdb [executable] [coredump]
thread apply all bt
Defekte Windows XP Registry wiederherstellen
Nachdem ich heute mal wieder einen Fall hatte, bei dem die Windows XP Registry-Datei (konkret der SYSTEM hive) im Eimer war, bin ich auf diesen Link gestoßen, wo erklärt wird, wie man mithilfe von Systemweiderherstellungspunkten die Registry-Datei wiederherstellen kann.
Konkret geht’s relativ einfach: Mit Bart PE booten, im “System Volume Information” Ordner den neuesten Systemwiederherstellungspunkt (RP* Verzeichnis mit der höchsten Nummer) suchen und die jeweilige Registry-Datei in %systemroot%\system32\repair\ zurückkopieren.
Das Mapping der Files steht ebenfalls beschrieben:
copy c:\windows\tmp\_registry_machine_software c:\windows\system32\config\software
copy c:\windows\tmp\_registry_machine_system c:\windows\system32\config\system
copy c:\windows\tmp\_registry_machine_sam c:\windows\system32\config\sam
copy c:\windows\tmp\_registry_machine_security c:\windows\system32\config\security
copy c:\windows\tmp\_registry_user_.default c:\windows\system32\config\default
c:\windows\tmp natürlich durch den jeweiligen RP-Ordner ersetzen.
SIL3112 SATA-Controller des P4G8X Mainboards für Platten >750GB (z.B. 1TB) einrichten
Habe gestern ein P4G8X Mainboard geschenkt bekommen und wollte den neuen Rechner auch gleich entsprechend “würdigen”, indem ich ihm eine 1TB SATA-Platte verpasse.
Also schnell mal eine 1TB Platte gekauft, reingesteckt und…. …ernüchterung. Der SATA Controller bleibt beim Erkennen der Platte hängen. Na Prima! Also mal auf der Mainboard-Herstellerseite nach einem BIOS-Update suchen.. Fehlanzeige, das neueste BIOS ist von 2003. Was also tun?
Glücklicherweise bin ich dann auf folgenden Thread gestoßen: http://forums.seagate.com/stx/board/message?board.id=ata_drives&thread.id=970&view=by_date_ascending&page=1.
Dort wird erklärt, dass man mit MMTOOL das neue Controllerbios in das BIOS-Image hineinpatchen kann.
Mit dem dort vorgeschlagenen MMTOOL geht’s aber nur für AMI-BIOS wies scheint, also nichts für mein Board mit AWARD-BIOS. Jedoch habe ich bei meiner Recherche dann folgendes nützliche Tool entdeckt: AWDBEDIT.
Folgende Schritte habe ich durchgeführt, um mir ein BIOS mit aktuellem SATA-Controllerbios zu erzeugen:
1) Aktuelle BIOS-Version vom Hersteller laden.
2) Wie im Thread oben angegeben Aktuelles SATA-ControllerBIOS laden.
3) AWDBEDIT laden
4) Alles In ein Verzeichnis auf der Platte laden.
5) AWDBEDIT hatte bei mir einen Bug und hat die Plugins nicht im Unterordner gefunden, habe daher die Files aus dem Plugins-Ordner ins Programmverzeichnis (also eine Verzeichnisebene höher) kopiert.
6) In AWDBEDIT die 1006G.awd geöffnet
7) Die Fehlermeldung, dass das kein gültiges BIOS-Image ist ignoriert und mit “JA” trotzdem das Laden bestätigt.
8) In der Kategorie Font ROMs den FONT0 ROM ausgewählt. Dort müsste die rom\storage\4224.bin drin sein.
9) Actions / Replace File..
10) 4284.bin aus dem zuvor entpackten Controllerbios eingefügt und dann unter Filename rom\storage\4284.bin genannt.
11) File / Save
12) Neues gepatches File geflasht.
Viell. kann den Tip ja auch mal wer brauchen.