Hab das schon vor längerem geschrieben und benutze es auch ab und zu...
Die Idee war, Informationen in einen Prozess ein zu bringen BEVOR er gestartet wird via der CreateProcess
API. Dabei wollte ich auch binäre daten "versteckt" übermitteln (Parameter kann man global einsehen)...
Das einzigste Problem WAR, Windows Vista 64Bit, hab aber dann dazu einen Workaround gefunden ( getestet und funktioniert
), es angepasst und sollte nun ohne Probleme auch auf Windows 2000 (Bis Win8.1 x64) funktionieren.
Bitte beachtet dass manche Programme auf lpReserved2 angewiesen sind, hatte aber mit Delphi Applikationen noch keine Probleme.
Das Limit beschränkt sich auf 65535 bytes, jedoch kann man darüber ganz einfach hinaus und vor dem start nochmals Speicher anfordern mit VirtualAllocEx, etc. und weitere Zeiger miteinander kombinieren.
Mehr Infos gibt es hier
http://www.catch22.net/tuts/undocumented-createprocess (Pass arbitrary data to a child process!)
Delphi-Quellcode:
program CreateProcessTest;
{$APPTYPE CONSOLE}
uses
Windows;
var
SI : TStartupInfo;
PI : TProcessInformation;
Buffer : array of byte;
WideStr : WideString;
VistaWorkAround : DWORD;
Const
AuthString = WideString ('delphipraxis.net');
begin
SetLength(Buffer, (Length (AuthString) * SizeOf(WideChar)) + SizeOf(DWORD) + SizeOf(WideChar) );
if ParamStr(1) = '' then begin
ZeroMemory(@Buffer[0], Length(Buffer));
VistaWorkAround := ((( Length(Buffer) - 4) div 5) + 2);
CopyMemory (@Buffer[0], @VistaWorkAround, SizeOf(DWORD));
CopyMemory (@Buffer[4], @AuthString[1], Length(AuthString) * SizeOf(WideChar));
Si.cbReserved2 := Length(Buffer);
Si.lpReserved2 := @Buffer[0];
if CreateProcess (pchar(paramstr(0)), '- CreateProcessTest' , NIL, NIL, False, 0, NIL, NIL, SI, PI) then begin
Exit;
end else begin
writeln ('Error - CreateProcess failed.');
end;
end else begin
GetStartupInfo(SI);
if Si.lpReserved2 <> NIL then begin
SetLength(Buffer, SI.cbReserved2 - SizeOf(DWORD));
ZeroMemory(Buffer, Length(Buffer));
CopyMemory (@Buffer[0], Pointer(Integer(SI.lpReserved2) + 4), Length(Buffer));
if PWideChar(@Buffer[0]) = AuthString then begin
writeln ('Success - lpReserved2 injection was successfull.');
end else begin
writeln ('Error - lpReserved2 injection was NOT successfull.');
end;
end else begin
writeln ('Error - lpReserved2 is NIL');
end;
end;
writeln ('');
writeln ('Thank you for testing!');
readln;
end.
Mein erster Beitrag, bitte nicht so kritisch, jedoch bin ich gerne eines besseren belehrt