[DOS] Exe Signature ausgeben



  • Hi,

    Der Titel sagt alles, wieso kommen hier nur komische Zeichen? (Es sollte MZ/ZM) kommen:

    Code:

    .MODEL small
            .STACK 100h 	;(256Byte)
            .DATA
    
    DOS	EQU mov ah,4Ch
    OUTPUT	EQU mov ah,09h
    
            .CODE
    Start:  mov dx,00h
            OUTPUT
            int 21h
    
    	DOS
    	int 21h
    
            END Start
    

    Herzlichen Dank, Gruss Bitschupser



  • Hi.

    Die .exe-Datei wird nicht einfach so wie sie ist in den Speicher geladen. Das gibt's nur bei .com-Dateien. Der .exe-Header wird von DOS nur intern benutzt, um die Segmente der .exe-Datei zu laden/einzurichten. Dabei wird DOS den Header hoechstwahrscheinlich in irgendeinen Puffer laden - da kommst du aber nicht ran.
    Wenn du DS nicht initialisierst, wird es wahrscheinlich aufs PSP zeigen.

    Wenn du den .exe-Header ausgeben willst, musst du zunaechst die .exe-Datei oeffnen, den Header in einen Puffer einlesen und diesen dann ausgeben.

    BTW:
    Funktion 09h erwartet einen "$"-terminierten String. Wenn du dieser Funktion einen Pointer ins Nirgendwo uebergibst, bekommst du schnell (naja, in der Praxis dauert's dann doch eher laenger 😃 ) einen Screen voller Schrott und ein Beep-Konzert. 😉



  • Hi,

    Nobuo T:
    Danke für die schnelle Antwort. Das $ *hmpf*!... Danke!.

    Du sagtest:
    Wenn du den .exe-Header ausgeben willst, musst du zunaechst die .exe-Datei oeffnen, den Header in einen Puffer einlesen und diesen dann ausgeben.

    Kannst du mir bitte ein (Code) Beispiel geben, denn ich kann mir davon so nix vorstellen.

    So habe ich es intepretiert:
    Brauche ich dafür ein zweites Programm, welches vom ersten Programm die ersten 100h einliest, und dann 00h ausgibt?

    thanks, Gruss Bitschupser.



  • Noe, wenn du ein Programm startest, kannst du es doch auch seine eigene Programmdatei oeffnen lassen. KA, was du mit dem .exe-Header willst, aber wenn du nur die MZ-Signatur ausgeben willst, reicht es, wenn du die ersten 2Byte dieser Datei in irgendeinen Puffer laedst und den dann ausgibst. KA, wieso du meinst es sollten die ersten 100h byte sein, bzw. was mit 00h gemeint ist.

    egal - kleiner Beispielcode:

    ;DS muss auf's Datensegment zeigen!
    mov    dx, offset DeinProgPfad ;Offset eines 0-terminierten Strings, der den Pfad zu diesem Programm enthaelt zB. db "c:\test.exe", 00h
    mov    ax, 3D00h ;Datei mit Handle oeffnen - ReadOnly
    int    21h
    ;CF gesetzt, wenn's daneben ging...
    ;Ansonsten File-Handle in ax
    mov    dx, offset MeinPuffer ;Puffer, in den die Signatur eingelesen wird...
    ;sieht hier sinnvollerwiese vielleicht so aus: db "  $" 
    mov    bx, ax ;FileHandle nach bx
    mov    cx, 0002h ;2Byte einlesen
    mov    ah, 3Fh
    int    21h
    ;CF gesetzt, wenn's daneben ging. ax enthaelt Anzahl gelesener Bytes
    mov    ah, 3Eh
    int    21h ;Datei schliessen...
    ;dx zeigt noch auf den Puffer...
    ;2Byte wurden eingelesen (spaces ueberschrieben) 3. Zeichen ist "$" zum Terminieren
    mov    ah, 09h
    int    21h ;ausgeben.
    


  • Nobuo T schrieb:

    Noe, wenn du ein Programm startest, kannst du es doch auch seine eigene Programmdatei oeffnen lassen. KA, was du mit dem .exe-Header willst, aber wenn du nur die MZ-Signatur ausgeben willst, reicht es, wenn du die ersten 2Byte dieser Datei in irgendeinen Puffer laedst und den dann ausgibst.

    Ja, ich will nur die MZ/ZM Signatur ausspucken.

    Nobuo T schrieb:

    KA, wieso du meinst es sollten die ersten 100h byte sein, bzw. was mit 00h gemeint ist.

    In meinem "DOS" ASM Buch ist eine Tabelle:
    00h - Signatur (MZ/ZM)
    ...
    Wahrscheinlich habe ich sie falsch interpretiert.

    Vielen Dank Nuobu T für den Beispielcode.

    PS: Da im Forum gibt es keine Beschränkung: Linux assembly, dos assembly, win assembly oder?

    Gruss
    Bitschupser



  • Bitschupser schrieb:

    PS: Da im Forum gibt es keine Beschränkung: Linux assembly, dos assembly, win assembly oder?

    Jo, keine Beschraenkung. Hauptsache es hat irgendwo noch was mit Assembler zu tun.


Anmelden zum Antworten