Externes Programm ausführen?

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

Moderatoren: crack, Marwin, Krüsty

Antworten
Darthshoot
Member
Beiträge: 23
Registriert: Dienstag 11. Juli 2006, 20:25

Externes Programm ausführen?

Beitrag von 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!

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

Beitrag von 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

Darthshoot
Member
Beiträge: 23
Registriert: Dienstag 11. Juli 2006, 20:25

Beitrag von Darthshoot » Sonntag 16. Juli 2006, 16:26

Hallo.

Hmm also mit anderen Worten das geht auch nicht für ein DOS Script? -_-
Hallo! Hallo!

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

Beitrag von 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

Darthshoot
Member
Beiträge: 23
Registriert: Dienstag 11. Juli 2006, 20:25

Beitrag von 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!

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

Beitrag von 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

Antworten