folgenden Code haben ich in dem Loader eines DOS 16Bit Spiel gefunden
der Großteil des Loader Codes ist mir klar (das Spiel selber habe ich
noch nicht angeschaut) - nur ist hier ein Happen der mit absolut gar
nichts sagt
der Loader ist in Assembler geschrieben das Spiel selbst in Turbo C
(laut IDA)
der Loader erstellt aus n Dateien eine Exe im Speicher die dann als
Sub-Prozess gestartet wird
in dem restlichen Loader Code gibt es keine Stelle wo der 0xF0 Interrupt
gesetzt wird - das Spiel ist kein TSR - hat jemand eine Idee was das
sein könnte?
Für mich sieht es danach aus als wenn Segment/Offset vom 0xF0-Interrupt
als so eine Art Flag genutzt werden - und dann wird der 0xF0 mit ah=0x0E
aufgerufen??, oder ist das irgendein ganz alter Hardware-Test oder
sowas?
Jemand eine Idee?
hier noch der leicht kommentierte Original opcode
ganz vergessen:
-das ist der Shutdown/Exit Code des Loaders
-in der Ralph Brown Interrupt List habe ich zu dem 0xF0 Interrupt nichts
gefunden
-16Bit Realmode - kein 32Bit oder Protected Mode, ganz alter Kram
-der Code hat teilweise extra Support für DOS 2 - also alles ein wenig
alt
Content B. schrieb:> 0x0F ist der Interrupvector vom Parallelport. Dongle fürs Spiel?>> Edit: http://manmrk.net/tutorials/DOS/PSBOOK/book2/intlist.htm
hatte ich auch schon gesehen, aber:
-es gibt kein Dongle in der Originalfassung - aber vielleicht war der
vorgesehen?
-warum den Dongle nur so kurz vor dem Programende nur 1 mal ansprechen?
sonst wird der F0 Interrupt nirgends im Loader aufgerufen oder sonst wie
angesprochen
mysteriös ...
Sieht so aus wie ein Test, ob irgend ein bestimmtes Programm-Modul unter
INT F0h läuft. Zumindest das OR oben kann ich erklären, das setzt das
Zero-Flag für den nachfolgenden Sprung. Aber wozu oder welches Programm
da erwartet wird... keine Ahnung, das sind die Freiheiten von x86
Assembler auf einem frühen Betriebssystem. Da konnte man machen was man
will...
IGFM könnten Initialen sein. Der Code bei loc_809 ist auch aus irgend
einem Compiler entstanden, ein Mensch hätte MOV AX,4c00h genutzt.
Für Shutdown_Loader gilt das Gleiche, das hat kein Mensch geschrieben.
Bspw. wird DS auf den Stack geladen und wiederhergestellt, obwohl es gar
nicht verändert wird. Oder die Kombination MOV AX,CS MOV DS,AX -
Menschen haben gerne PUSH CS POP DS genutzt, weil zwei Byte kürzerer
Code. Genau wie das REP MOVSB mit fester gerade Länge (CX=14h), ein
Mensch nimmt dafür REP MOVSW mit CX=14h/2.
Könnte es eventuell ein Teil eines Viruses sein, der sich an das
Programm geheftet hatte? Es gibt ja welche mit Stealth-Mode und
selbstveränderlichen Code
Sehr unwahrscheinlich. Ich will nicht ausschließen, daß irgend jemand
sowas programmiert haben könnte, aber meine TSR-Stealthviren haben sich
einfach in den DOS-Interrupt reingehängt.
Zum Verständnis, die Funktionsweise davon ist ziemlich einfach, im
Grunde entsteht eine lange Kette von allen geladenen Programmen, durch
die INT-Aufrufe hindurchgehen bis irgend ein Programm was damit anfangen
kann. Der DOS-Kern wurde zuerst geladen, also steht er ganz am Ende
dieser Kette. Der Virus steht irgendwo davor, sprich bevor ein
INT-Aufruf z.B. eines Virenscanners zum Öffnen einer Datei zu DOS
durchdringt, kann der (später geladene) Virus diesen Aufruf untersuchen
und ggf. Maßnahmen ergreifen. Ein Stealth-Virus kann z.B. beim Öffnen
einer Datei schauen, ob das ein infiziertes Programm ist. Wenn ja, wird
der anhängende Virencode entfernt bevor der INT-Aufruf an DOS
weitergereicht wird. Beim Schließen der Datei wird das Programm dann
wieder neu infiziert. Dadurch bekommt der Virenscanner nur "saubere"
Programmdateien zu sehen.
Ben B. schrieb:> das hat kein Mensch geschrieben.
Ich bin schon sehr oft auf handgeschriebenen Assembler Code gestossen
den ein Kompiler so nicht erzeugt hätte :)
Der Loader Code ist definitiv in Assembler geschrieben weil er Teile
seines eigenen Codes zum speichersparen mit geladenen Dateien
ueberschreibt, sowas laesst sich schwer in C, Pascal oder anderen
Kompilern aus der Zeit realisieren
Content B. schrieb:> Könnte es eventuell ein Teil eines Viruses sein, der sich an das> Programm geheftet hatte? Es gibt ja welche mit Stealth-Mode und> selbstveränderlichen Code
Nein definitiv nicht, die Arbeitsweise des Loaders ist mir 98% klar, hab
den ganzen Code reversed und bin dabei den nach C zu portieren, da ist
nichts stealthiges im Code :)
Ich finde aber leider absolut gar nichts zu diesem Interrupt 0xF0 und
Basic im Internet, ist wohl sehr sehr alt
Das ist ein Software-Interrupt, Du kannst da so ziemlich alles
draufschmeißen was Du möchtest. Man hätte auch genau so gut einen
anderen höchstwahrscheinlich unbenutzten Interrupt nehmen können.
Und ich glaube immer noch nicht, daß das ein Mensch geschrieben hat.
Noch ein weiterer Anhaltspunkt - das Programm lädt oben CX und DX mit
[SI+2] und [SI+4]. Ein Mensch hätte nur eines der Register benutzt und
das zweite MOV erst nach dem ersten CMP/JNZ ausgeführt weil's erst dort
interessant wird. Spart ein Register (die waren beim frühen x86 oft
Mangelware, jeder ernstzunehmende Assembler-Programmierer war bestrebt,
so viel wie möglich davon einzusparen) und eine Anweisung falls der
erste Sprung ausgeführt wird. Das sieht aus wie ein 32Bit-Compare aus
einem Compiler, nicht wie handgeschriebener Assemblercode. Oder der Typ
der das geschrieben hat war ein Noob ohne Ahnung von solchen
Optimierungen.
habs mit dem Dosbox Debugger durch debuggt
wenn ich den Loader starte und gleich wieder beende (ohne Grafik-Karte
wählen und Spiel-Start) dann steht in der Interrupt-Tabelle beim
Interrupt 0xF0 nur Nullen und der Interrupt 0xF0 wird nicht aufgerufen
wenn ich aber das Spiel aus dem Loader starte dann wird der 0xF0
Interrupt vom Spiel selbst gesetzt und hinter der Adresse steht dann
auch ab Stelle 2 diese Signatur
also wird der Interrupt vom Spiel auf diesen Code verbogen
1
jmpshortloc_D
2
3
aIfgmAdlibdb'IFGMADLIB',0
4
5
loc_D:
6
pushds
7
pushes
8
pushsi
9
pushdi
10
pushbx
11
pushcx
12
pushbp
13
cld
14
movbx,cs
15
movds,bx
16
xorbx,bx
17
movbl,ah
18
callcs:off_EFF[bx]
19
popbp
20
popcx
21
popbx
22
popdi
23
popsi
24
popes
25
popds
26
iret
wenn jetzt noch jemand eine Idee hat zu dem C-String "IFGM ADLIB" :)
Ben B. schrieb:> Das sieht aus wie ein 32Bit-Compare aus> einem Compiler, nicht wie handgeschriebener Assemblercode. Oder der Typ> der das geschrieben hat war ein Noob ohne Ahnung von solchen> Optimierungen.
ich hab schon ein paar Games disassembliert und es gibt einige bei denen
der Game-Code in C geschrieben ist und der Grafik-Engine/Sound Code in
Assembler - das sieht man relativ deutlich wenn plötzlich Calls nur noch
mit Registern arbeiten (kein Watcom) oder nur noch globale Variablen
verwendet werden und alles voll ist mit Dead-Code Schnipseln,
Far-Pointer pushen und dann als Segment doch hart DS verwenden usw. -
Kompiler machen so was nicht
100% Spekulation, aber:
IFGM ADLIB klingt sehr nach einem Soundkarten Treiber. "Interface
General Midi Adlib" würde Sinn machen. Vielleicht findest Du im Code ja
auch irgendwo den String "IFGM MPU401" oder "IFGM MPU-401". Dann wäre
die Sache klar.
Ansonsten probiere doch einfach mal den Programmierer zu kontaktieren.
cppbert3 schrieb:> int 0F0h ; Info von IDA Pro: used by BASIC while in> interpreter
Naja offenbar weiß IDA es schon,
das Programm ist in basic geschrieben und er prüft ob er im Interpreter
läuft und verhält sich dann anders (zB debug-Infos ausgeben oder
dergleichen)
Beim Kompilierten Programm (ja es gab compiler) überspringt er dann
bestimmte Abschnitte
honko schrieb:> cppbert3 schrieb:>> int 0F0h ; Info von IDA Pro: used by BASIC while in>> interpreter>> Naja offenbar weiß IDA es schon,> das Programm ist in basic geschrieben und er prüft ob er im Interpreter> läuft und verhält sich dann anders (zB debug-Infos ausgeben oder> dergleichen)> Beim Kompilierten Programm (ja es gab compiler) überspringt er dann> bestimmte Abschnitte
ich hab vor 1h
(Beitrag "Re: DOS 16Bit: Interrupt 0xF0, hat jemand eine Idee was das ist?")
geschrieben das der Interrupt durch das Spiel verbogen wird - das ist
kein Basic mehr, z.B. die Dosbox implementiert das gar nicht mehr, die
IDA Information ist veraltet oder hier nicht passend
der Interrupt wird für die Soundausgabe des Spiel zweckentfremdet
Nils Pipenbrinck schrieb:> 100% Spekulation, aber:>> IFGM ADLIB klingt sehr nach einem Soundkarten Treiber. "Interface> General Midi Adlib" würde Sinn machen. Vielleicht findest Du im Code ja> auch irgendwo den String "IFGM MPU401" oder "IFGM MPU-401". Dann wäre> die Sache klar.
das klingt plausibel
> Vielleicht findest Du im Code ja...
erstmal muss ich den Loader noch in ein Tool portieren der mir das "im
Speicher Exe erzeugen" in eine echte Exe auf Platte ersetzt die der IDA
dann lieber mag :) - (und nein ich will kein Image des Memories dumpen)
> Ansonsten probiere doch einfach mal den Programmierer zu kontaktieren.
das mache ich immer erst dann wenn ich gar nicht weiterkomme
oft können die sich selbst nicht daran erinnern weil das irgendjemand
anderes programmiert hat
cppbert3 schrieb:> das mache ich immer erst dann wenn ich gar nicht weiterkomme> oft können die sich selbst nicht daran erinnern weil das irgendjemand> anderes programmiert hat
Ich letztes Jahr irgendwann, auf gut Glück, an eine E-Mail Adresse aus
dem Text-File eines Shareware Programms von 1993 geschrieben und nach
Code gefragt.
Die Mail kam an, das war auch der Gewünschte. Der konnte sich aber nicht
mehr an das Programm erinnern. Paar Tage später kam ein zip-Datei mit
dem Vermerk, dass Disketten wohl langlebiger als Gehirne seien :)