SHUTDOWN.COM

Diskussion zum Thema Programmierung unter DOS (Intel x86)
Antworten
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

SHUTDOWN.COM

Beitrag von oDOSseus »

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

;Connect real-mode interface
XOR     BX, BX     ;Device ID (BIOS==0000h)
MOV     AX, 5301
INT     15h
;Driver version
XOR     BX, BX     ;Device ID (BIOS==0000h)
MOV     CX, 0102   ;Version 1.2
MOV     AX, 530E
INT     15h
;Set power state
MOV     CX, 0003   ;State. 0003h==Off
MOV     BX, 0001   ;Device ID. Not supported for APM v1.0. 0001h==All devices
MOV     AX, 5307
INT     15
;I do not understand the following code
RET
PUSH    SI
DB      65
JB      0194
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: SHUTDOWN.COM

Beitrag von freecrac »

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
Benutzeravatar
oDOSseus
LAN Manager
Beiträge: 239
Registriert: Di 10. Aug 2010, 15:21

Re: SHUTDOWN.COM

Beitrag von oDOSseus »

Aaaah vielen herzlichen Dank,

das hat mir die Sache erhellt.
mfG
Antworten