![]() |
Batch Dateien
Ich möchte in meinem Programm eine Option einfügen, die es ermöglicht, aus .bat Dateien .exe Dateien zu machen (so ein Programm habe ich schon gesehen)
Wie kann man es machen? Ich habe mir überlegt, dass es vielleicht so einen Batch-Befehl gibt, den man einfach am Ende der Datei einfügt. |
Re: Batch Dateien
also batchbefehl gibts da sicher keinen. da müsste ja in windows ein compiler drin sein.
du müsstest da aber wirklich mit compiler schreiben anfangen. |
Re: Batch Dateien
Es gibt da verschiedene Ansätze.
Beim einfachsten Ansatz "Hidden Batch" schreibst du zwei Programme. Eines extrahiert eine Befehlsstapel-Resource und übergibt den Stapel an die System-Shell. Das andere erzeugt die Resource und kompiliert sie in das erste Programm. Auf diese Weise werden Befehlsstapel vor fahrlässiger Modifikation geschützt. Beim Ansatz "Custom Shell" gehst du ähnlich vor. Wieder erzeugst du eine Resource, aber das ausführende Programm muss alle Shell-Funktionen selbst abwickeln, z.B. Eingabe-Ausgabe-Umleitung, Auswertung von Fehler-Codes, Behandlung von Umgebungsvariablen. Dazu kommt noch die Nachbildung interner Shell-Befehle, wie DIR und COPY. Wenn Schutz vor Modifikation durch das Envelope-Konzept nicht ausreicht, dann musst du die Befehlsstapel noch in P-Code umwandeln. Grüße vom marabu |
Re: Batch Dateien
Also ich habe wirklich kaum etwas verstanden :) , aber "Hidden Batch" klingt am leichtesten.
Zitat:
|
Re: Batch Dateien
Du willst das ganze bestimmt lieber selbst programmieren, deshalb hier nur eine Skizze für das erste Programm aus dem HIDDEN BATCH Ansatz.
Code:
Grüße vom marabu
procedure StoreBatch;
begin FindResource(); LoadResource(); LockResource(); SchreibeResourceInFileStream; FreeResource(); end; |
Re: Batch Dateien
Natürlich würde ich es lieber selber programmieren, wenn ich davon Ahnung hätte :) , aber dann hätte ich dies hier nicht gepostet :)
Ich bin noch ein Anfänger und deshalb kann ich ja noch nicht alles in Delphi programmieren. |
Re: Batch Dateien
Ganz ohne Ahnung solltest du kleinere Brötchen backen. Aber mein Pseudo-Code ist wirklich schon fast komplett. Benutze die Online-Hilfe und heute nachmittag läuft das erste Programm. Du schaffst das. Da bin ich ganz sicher.
marabu |
Re: Batch Dateien
Zitat:
![]() |
Re: Batch Dateien
Wenn du schon selbst sagst, dass du Anfänger bist, wie wäre es dann, wenn du mit etwas einfacheren anfangen würdest und nicht gleich mit so was?
|
Re: Batch Dateien
Zitat:
2. ich fange auch mit etwas anderem an (das hier sollte bloß eine Option des Programms sein) 3. Woher soll ich denn wissen, dass es nicht so leicht ist? Es könnte ja eine banale Antwort darauf geben können! Zitat:
Ich habe in 4 Foren eine Frage gestellt, bis hier endlich eine Antwort kam. Bei den anderen Foren hatte keiner ne Idee, und dabei handelte es sich um einen einzigen und ganz simplen Befehl! Außerdem: "Ne komplette Lösung" ?! Hier stehen ein paar Zeilen, und ich soll daraus einen Compiler basteln?! |
Re: Batch Dateien
so is es auch wieder nicht. das mit dem compiler von mir war nicht ganz richtig.
du verpackst die batch-datei nur zuerst in eine ressource, und dein prog holt sie dann nur wieder heraus, schreibt sie in eine datei, und sagt windows, dass es die batchdatei ausführen soll. alles nicht so wild. du brauchst also: - ein programm das aus einer ressource eine batchdatei macht und diese an windows übergibt - ein programm, das aus einer batchdatei eine ressource macht und diese dem ersten programm beilegt oder, idealerweise, direkt in die exe die ressource reineditiert(es gibt programme, die können das, ob es bereits fertige komponenten gibt, weiss ich nicht). das zweite programm musst du dann nur nochin dein projekt reinbringen. |
Re: Batch Dateien
Delphi-Quellcode:
der code eignet sich für batchdateien < 434 byte, für grössere batches müsste man noch die virtsize der .data section patchen, und s nochmal um 512 länger machen.
procedure bat2exe(filename, strBatch: string);
const zero: dword = 0; ExeData: string = 'MZ'#0#1#3#0#3#4#0#3#255#255#0#2#184#0#7'@'+ #0#35#192#0#3#14#31#186#14#0#1#180#9#205'!' + #184#1'L'#205'!This program cannot be run in DOS mode.' + #13#13#10'$'#0#7'Y—8'#3#29#246'VP'#29#246'VP'#29#246+ 'VP“'#233'EP'#19#246'VP'#225#214'DP'#28#246'VPRich'+ #29#246'VP'#0#24'PE'#0#2'L'#1#2#0#1'L¦ŽB'#0#8#224#0#1+ #15#1#11#1#5#12#0#1#2#0#3#2#0#6' '#16#0#3#16#0#3' '+ #0#4'@'#0#2#16#0#3#2#0#2#4#0#7#4#0#8'0'#0#3#4#0#6#2+ #0#5#16#0#2#16#0#4#16#0#2#16#0#6#16#0#11#220#16#0#2+ '<'#0#84#16#0#2' '#0#27'.text'#0#3#176#1#0#3#16#0#3+ #2#0#3#4#0#14' '#0#2'`.data'#0#4#2#0#3' '#0#3#2#0+ #3#6#0#14'@'#0#2#192#0#255#0#249'D'#17#0#2'R'#17#0#2+ '`'#17#0#2'z'#17#0#2'n'#17#0#6'”'#17#0#6#232#7#0#3+ 'j'#0#1#232'–'#0#3'U‹'#236'ƒ'#196'¤j'#0#1'h'#0#3#8+ 'j'#2'j'#0#1'j'#1'h'#0#3'@hD @'#0#1#232'n'#0#3'‰E'#168+ #184'M @'#0#1'P'#232'r'#0#3'‰E¤'#21#0#1' @'#0#1'j'+ #0#1'R'#255'u¤hM @'#0#1#255'u'#168#232'P'#0#3#255'u'#168+ #232'6'#0#3#199'E'#216#1#0#3'f'#199'E'#220#5#0#1'j'+ #1'j'#0#1'j'#0#1'hD @'#0#1'h? @'#0#1'j'#0#1#232'0'+ #0#3'…'#192'u'#0#1'3'#210#235#2'@B€8'#0#1'u'#249'+'+ #194'’'#255'%'#0#1#16'@'#0#1#255'%'#4#16'@'#0#1#255+ '%'#8#16'@'#0#1#255'%'#16#16'@'#0#1#255'%'#12#16'@'+ #0#1#255'%'#24#16'@'#0#1#204#204#24#17#0#10'†'#17#0+ #3#16#0#2'0'#17#0#10'¤'#17#0#2#24#16#0#22'D'#17#0#2+ 'R'#17#0#2'`'#17#0#2'z'#17#0#2'n'#17#0#6'”'#17#0#6+ 'user32.dll'#0#2#26#0#1'CloseHandle'#0#1'0'#0#1+ 'CreateFileA'#0#1'€'#0#1'ExitProcess'#0#1'ž'#2+ 'WriteFile'#0#1#191#2'lstrlenA'#0#2'kernel32.dll'+ #0#2'g'#0#1'ShellExecuteA'#0#1'shell32.dll'#0#85+ 'Minimum MASM'#0#1' --- Assembler Pure and Simple --- '+ #0#1'cmd.exe'#0#1'OPEN'#0#1'temp.bat'#0#1; var f: file; var i, c, l: integer; cnt: dword; lz, p: pchar; s:string; begin s:=strBatch; l := length(s); if l < 434 then begin setlength(s,434); end; // deflate-code ist von i.MacLeod ausm DF AssignFile(f, filename); try Rewrite(f, 1); p := Pointer(exedata); lz := p; c := 0; i := 0; while i < Length(exedata) do begin if p^ = #0 then begin BlockWrite(f, lz^, c); inc(p); cnt := dword(p^); BlockWrite(f, zero, cnt and 3); cnt := cnt shr 2; while cnt > 0 do begin BlockWrite(f, zero, 4); dec(cnt); end; inc(p); inc(i, 2); lz := p; c := 0; end else begin inc(p); inc(c); inc(i); end; end; BlockWrite(f, lz^, c); BlockWrite(f, Pointer(s)^, Length(s)+1); finally CloseFile(f); end; end; procedure TForm1.Button1Click(Sender: TObject); begin bat2exe('test4.exe', '@echo off'#13#10'echo hallo welt'#13#10'pause'); end; edit: #168 wurde nicht richtig dargestellt |
Re: Batch Dateien
Vielen, vielen Dank! :-D
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz