Externes Programm ausführen?

Hier könnt ihr sowohl zur x86 Architektur als auch zu Win32ASM Fragen stellen.

Moderatoren: crack, Krüsty, Marwin

Externes Programm ausführen?

Beitragvon Darthshoot » Samstag 15. Juli 2006, 19:32

Hallo!

Ich will durch ein ASM Script eine Datei erstellen lassen und diese dann ausführen.

Code: Alles auswählen
   mov ah, 3ch
   lea dx, File
   xor cx, cx
   int 21h

   xchg ax, bx

   mov ah, 40h
   lea dx, Data
   mov cx, (offset Ende - offset Data)
   int 21h

   mov ah, 3eh
   int 21h

   mov ah, 4bh
   mov al, 00h
   lea dx, File
   int 21h


Also er schreibt alles rein, aber führt es nicht aus.
Hallo! Hallo!
Darthshoot
Member
 
Beiträge: 23
Registriert: Dienstag 11. Juli 2006, 20:25

Beitragvon crack » Sonntag 16. Juli 2006, 15:59

Hallo Darthshoot,

Code: Alles auswählen
mov ah, 3ch
lea dx, File
xor cx, cx
int 21h                ; Hier wurde eine Datei geöffnet, bzw. neu erstellt

xchg ax, bx

mov ah, 40h
lea dx, Data
mov cx, (offset Ende - offset Data)
int 21h                ; Die Datei wird auf die HDD geschrieben

mov ah, 3eh                ; Die Datei wird geschlossen
int 21h
; Hier müsste eine Abfrageschleife stehen die testet ob der Name der neu geschriebenen
; Datei schon in dem Verzeichnis des Laufwerks auftaucht, der Hintergrund ist folgender:
; wenn Du per Int oder auch per API Procedure den Befehl zum speichern erteilst wird
; dieser an den HDD Controller weitergereicht, dieser Übernimmt das speichern der
; Datei während das Programm schon fortgesetzt wird, was wiederum bedeutet das u.U.
; sich die zu speichernde Datei gerade erst im Cache der HDD befindet, und noch nicht
; ‚Von Platte’ ausgeführt werden kann …
mov ah, 4bh
mov al, 00h
lea dx, File
int 21h

Noch ein Problem:
der Aufruf 4bh des Interrupt 21 benötigt nicht nur den Dateinamen in DS:DX, er braucht ausserdem in ES:BX einen Zeiger auf eine Struktur die als ‚Programm Parameter Block’ bezeichnet wird. Ich konnte über diese Struktur noch keine näheren Angaben finden, aber ich vermute das sie Informationen über die Speicherverwendung des aufzurufenden Programms bereitstellen muss, da ich mit folgendem Experiment:
Code: Alles auswählen

org 0100
mov ah, 04b
mov al, 00
mov dx, offset _dingens
int 021
jnc exit
cmp ax, 1
jne X1
mov dx, offset falschefunktion
mov ah, 9
int 021
jmp exit
X1:
cmp ax, 2
jne X2
mov dx, offset falscherpfad
mov ah, 9
int 021
jmp exit
X2:
cmp ax, 8
jne X3
mov dx, offset speicher
mov ah, 9
int 021
jmp exit
X3:
cmp ax, 0a
jne X4
mov dx, offset environment
mov ah, 9
int 021
jmp exit
X4:
cmp ax, 0a
jne X5
mov dx, offset falscheraufruf
mov ah, 9
int 021
jmp exit
X5:
mov dx, offset unbekannt
mov ah, 9
int 021
exit:
mov ax, 04c00
int 021
_dingens: db 'fake.bat',0
falschefunktion: db ' falsche Funktion!$'
falscherpfad: db ' Datei oder Pfad nicht gefunden!$'
speicher: db '>>Memory Overflow<< $'
environment: db 'falscher Umgebungsblock!$'
falscheraufruf: db 'falscher Aufruf!$'
unbekannt: db 'unbekannter Fehler :-S$'
; Auftretendes Problem: Durch den fehlenden 'Programmparameterblock'
; (Zeiger in ES:BX soll auf diese Struktur zeigen), kommt es auch bei
; einem Sehr kleinen Programm zu einem Speicherüberlauf.
; das Windows Equivalent zu int 021 funtk. 04b ist die API Funktion: 'ShellExecute'

auch bei einem recht kleinen ‚Programm’ (fake.bat):
Code: Alles auswählen
@rem dies ist ein test...
@pause

ständig den Fehler ‚Speicherüberlauf’ erhielt. Eine Alternative zu dem Int 21 Aufruf 4bh währe der API Call ‚ShellExecute’.
Code: Alles auswählen
.386
.model flat,stdcall

option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\shell32.inc
include \masm32\include\user32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\user32.lib


.data
    Titel   db 'Prozess aufruf',0
    Msg     db 'Klicken Sie auf OK um den Prozess zu starten !',10,13,' 2006 by H.V.Viehof',0
    szOpen  db "open",0
    szDatei db "fake.bat",0

.code
start:
    invoke  MessageBox, 0, addr Msg, addr Titel, MB_YESNOCANCEL+MB_ICONEXCLAMATION
    cmp eax,2
    jz start
    cmp eax,7
    jz xt
    invoke  ShellExecute, NULL, addr szOpen, addr szDatei, NULL, NULL, SW_SHOWDEFAULT
    jmp start
xt: invoke  ExitProcess, 0
end start
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Beitragvon Darthshoot » Sonntag 16. Juli 2006, 16:26

Hallo.

Hmm also mit anderen Worten das geht auch nicht für ein DOS Script? -_-
Hallo! Hallo!
Darthshoot
Member
 
Beiträge: 23
Registriert: Dienstag 11. Juli 2006, 20:25

Beitragvon crack » Montag 17. Juli 2006, 09:52

Hm, musst Du mal probieren ob das geht:
Hier ist die Info zum:
Programm Parameter Block
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf

Beitragvon Darthshoot » Montag 17. Juli 2006, 14:14

Also die Liste ist schon hilfreich. Aber leider habe ich das mit Executen immer noch nicht verstanden :/ (Diesen Parametern)
Hallo! Hallo!
Darthshoot
Member
 
Beiträge: 23
Registriert: Dienstag 11. Juli 2006, 20:25

Beitragvon crack » Montag 17. Juli 2006, 14:32

Darthshoot hat geschrieben:Also die Liste ist schon hilfreich. Aber leider habe ich das mit Executen immer noch nicht verstanden :/ (Diesen Parametern)


Also die Kommandozeile sind die Parameter, die an das Programm übergeb en werden (das was Du in einer Dos Box hinter dem Programmnamen eintippst.

FCB1 und FCB2 sind 'FileControlBlocks' also Strukturen die Dateinamen usw. enthalten ... nähere Erläuterung, bis DOS 3.3 wurden Dateieoperationen immer mit den FCBs gesteuert danach übernahmen Handles diese Aufgabe.

Der Umgebungsblock dürfte eine Struktur mit den Umgebungsvariablet sein, also Path, Set, Comspec im wesentlichen.
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf


Zurück zu Assembler

 


  • { RELATED_TOPICS }
    Antworten
    Zugriffe
    Letzter Beitrag

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron