oDOSseus hat geschrieben:Hallo zusammen.
Ich habe eine COM gefunden, die den PC ausschaltet. Sie tut das gleiche, wie wenn man auf den Power-Knopf drückt. Ist also eher Spielerei. Ich habe es mir mit debug und -U deassemblieren lassen nur verstehe ich den Quellcode nicht. Währe nett Wenn ihr ihn mir erklären könntet (Kommentare sind von mir):
Code: Alles auswählen
;I do not understand the following code
RET
PUSH SI
DB 65
JB 0194
Der RET-Befehl(Opcode C3) veranlasst die CPU in diesem Fall in den PSP zu springen wo DOS beim Starten ein "int 20" plaziert hat und damit wird das Programm ohne Errrorlevel beendet.
Siehe dazu den PSP Offset 0:
http://de.wikipedia.org/wiki/Program_Segment_Prefix
Das ist eine oft verwendete Methode um ein Com-Programm schnell und mit nur einem Byte zu beenden. Die nachfolgenden Bytes sind damit bedeutungslos und werden nicht ausgeführt.
Bist du sicher das diese nachfolgenden Bytes überhaupt dazugehöhren? Wenn man eine Anwendung in DEBUG einläd dann steht danach in BX(high) und CX(low) die Dateilänge. Mit R + Return werden uns die Register aufgelistet.
Um nur bis zu diesem Ende die Befehle aufzulisten kann man eine Längenangabe(mit "l") machen. Beispiel es sollen nur 16 Bytes aufgelistet werden: "u cs:0100 l10".
Gewöhnlich wird eine Rücksprungadresse durch einen Call-Befehl auf den Stack geschoben und wenn danach ein RET ausgeführt wird, dann wird die Rücksprungadresse vom Stack geholt und dorthin zurückgesprungen.
Vergleichsweise kann man aber auch eine Adresse selber auf den Stack schieben und danach zu dieser Adresse mit einem RET-Befehl springen.
RBIL->inter61b.zip->INTERRUP.F
--------D-20---------------------------------
INT 20 - DOS 1+ - TERMINATE PROGRAM
CS = PSP segment
Return: never
Notes: (see INT 21/AH=00h)
this function sets the program's return code (ERRORLEVEL) to 00h
SeeAlso: INT 21/AH=00h,INT 21/AH=4Ch
Dirk