Wenn wir eine EXE-Datei ausführen, wird eine kompilierte Dateien folge herunter gearbeitet und von Windows dargestellt. Dass sich aber in der EXE-Datei weitere EXE-Dateien befinden könnten, das sehen und merken wir nicht. Wenn diese EXE-Datei mit einem Disassembler veranschaulicht wird, wird man sich wundern, wie viele Produkthersteller so verfahren. Das kann aus verschiedenen Gründen sein, wie z. B. das Verbergen von Informationen ggü. dem Benutzer oder das Schützen von bestimmten Prozessen, von denen man nicht will, dass sie wahr genommen werden sollen.
Das hört sich jetzt vielleicht etwas eigenartig an, doch in der heutigen Welt von Microsoft ist das eine Selbstverständlichkeit.
Das folgende Beispiel zeigt, wie man solche EXE-Dateien herstellen und ausführen kann.
Schritt 1 :
Erstellt ein neues Projekt, speichert es in einem Ordner und legt die Datei "MyRes.rc" an.
Schritt 2 :
Kopiert folgende Code Zeile in die
"MyRes.rc" Datei und speichert es.
TESTFILE EXEFILE my.exe
Schritt 3 :
Kopiert die "brcc32.exe" aus dem ..\Delphi\bin\.. Ordner in euren Projektordner.
Schritt 4 :
Kopiert eine beliebige eigenständige EXE-Datei in euren Projektordner und benennt sie um in "my.exe".
Schritt 5 :
Nun müsst ihr die
"MyRes.rc" Datei per Drag&Drop auf die
"brcc32.exe" ziehen um die "MyRes.res" Datei zu erzeugen. Dort befindet sich jetzt die "my.exe" Datei.
Schritt 6 :
Öffnet eure Projektdatei mit Delphi.
Schritt 7 :
Nun kommen wir zum Code.
uses ShellApi
var
Form1: TForm1;
EXE_FILE: string;
//
{$R *.dfm}
{$R MyRes.res} // HIER WIRD DIE MY.EXE IN DAS HAUPTFENSTER MIT IMPLEMENTIERT
// Ermittelt den Temporären Ordner des Systems von dort aus die my.exe augeführt wird.
function GetTempDir: string;
var
Buffer: array[0..MAX_PATH] of Char;
begin
GetTempPath(SizeOf(Buffer) - 1, Buffer);
Result := StrPas(Buffer);
end;
// Extrahiert die my.exe in den Temporären Ordner des Systems
function ExtractRes(ResType, ResName, ResNewName: string): Boolean;
var
Res: TResourceStream;
begin
Result := False;
Res := TResourceStream.Create(Hinstance, Resname, PChar(ResType));
try
Res.SavetoFile(ResNewName);
Result := True;
finally
Res.Free;
end;
end;
// Übergibt dem Hauptfenster den Befehl "Führe aus und warte auf Befehl".
// Das heisst das Heuptfenster kann nicht geschlossen werden solange die my.exe läuft.
// Bei Abänderung des Codes ist das natürlich auch möglich.
procedure ShellExecute_AndWait(FileName: string);
var
exInfo: TShellExecuteInfo;
Ph: DWORD;
begin
FillChar(exInfo, SizeOf(exInfo), 0);
with exInfo do
begin
cbSize := SizeOf(exInfo);
fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
Wnd := GetActiveWindow();
ExInfo.lpVerb := 'open';
lpFile := PChar(FileName);
nShow := SW_SHOWNORMAL;
end;
if ShellExecuteEx(@exInfo) then
begin
Ph := exInfo.HProcess;
end
else
begin
ShowMessage(SysErrorMessage(GetLastError));
Exit;
end;
while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
Application.ProcessMessages;
CloseHandle(Ph);
end;
// Bestimmt den Namen der EXE im Temporären Ordner
procedure TForm1.FormCreate(Sender: TObject);
begin
EXE_FILE := GetTempDir + 'my.EXE';
end;
Ausführen der my.exe Datei :
procedure TForm1.Button1Click(Sender: TObject);
begin
if ExtractRes('EXEFILE', 'TESTFILE', EXE_FILE) then
if FileExists(EXE_FILE) then
begin
ShellExecute_AndWait(EXE_FILE); // Ausführung
DeleteFile(EXE_FILE); // Löschen der my.exe Datei nach dem Beenden
end;
end;
Wir haben eine EXE-Datei in unsere Projekt EXE mit eingebaut. Durch die Ausführung des Hauptprogramms wurde die my.exe in den temporären Ordner kopiert und wartet dort zeitlich begrenzt auf den Befehl des Hauptfensters. Der Befehl kann durch einen Button oder durch jede andere Komponente des Hauptfensters erteilt werden. Nach dem Beenden des Hauptfensters wird die my.exe automatisch aus dem temporären Ordner gelöscht.
Diese Vorgehensweise kann natürlich auch Probleme mit sich bringen, z.B. mit Viren-Agenten, die die my.exe Datei als "Virus:DropperGen2" identifiziert.
Keine Kommentare:
Kommentar veröffentlichen