Hi,
Also ich habe es jetzt mit der
DLL-Injektion versucht. Das funktioniert auch sogar schon - manchmal.
Bzw. nicht bei allen Programmen...
Injection-Programm:
Delphi-Quellcode:
const
WM_GETMODULE = WM_USER + 1;
type
type
TWMGetModule =
packed record
Msg: Cardinal;
Handle: hModule;
Unused1: Longint;
Unused2: Longint;
end;
Taber =
class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
hExplore: THandle;
procedure OnModule(
var Msg: TWMGetModule);
message WM_GETMODULE;
end;
const
DLLName = '
dll.dll';
implementation
procedure Taber.FormCreate(Sender: TObject);
var id: Cardinal;
begin
// z.B. (klappt mit IrfanView nicht, Klassenname stimmt (Mit Winspy überprüft), Handle etc auch alles in Ordnung.)
GetWindowThreadProcessId(FindWindow('
IrfanView',
nil),id);
hExplore := OpenProcess(PROCESS_ALL_ACCESS,true,id);
end;
procedure Taber.Button1Click(Sender: TObject);
var Params: Pointer;
LoadLibAddr: Pointer;
bw,tid: Cardinal;
begin
Params := VirtualAllocEx(hExplore,
nil,Length(DLLName),MEM_COMMIT,PAGE_READWRITE);
WriteProcessMemory(hExplore,Params,@DLLName[1],Length(DLLName),bw);
LoadLibAddr := GetProcAddress(GetModuleHandle('
kernel32.dll'),'
LoadLibraryA');
CreateRemoteThread(hExplore,
nil,0,LoadLibAddr,Params,0,tid);
end;
procedure Taber.OnModule(
var Msg: TWMGetModule);
begin
ShowMessage(IntToStr(Msg.Handle));
end;
DLL:
Delphi-Quellcode:
library DLL;
uses
Windows, Messages, Dialogs;
{$R *.res}
var wnd: hwnd;
begin
ShowMessage('
DLL geladen!');
// Fast alles auschließlich zum testen.
wnd := FindWindow('
Taber',
nil);
SendMessage(wnd,WM_USER+1,hInstance,0);
end.
Erklärung:
Also das ganze funktioniert weitgehend. Aber nur bei einigen Programmen. Bei selbst erstellten Anendungen (mit Delphi) geht es und auch bei der Delphi-
IDE. Bei den Programmen bei denen ich es sonst versucht habe (u.a. WinRAR, Irfan-View) funktionierte es nicht, das heißt ich bekam die Message "
Dll geladen!" nicht. CreateRemoteThread liefert mir aber IMMER ein gültiges hThread-
Handle und die Ziel-Andwendung stürzt nicht ab (Bei falschen Parametern passiert das bei mir immer^^).
Das einzige was noch nicht so ganz funktioniert, auch nicht bei den Programmen wo es funktioniert (
) ist das senden des Modul-Handles, um die
DLL in der Fremden Anwendung wieder freigeben zu lassen. Schreibe ich in die OnModule-Methode
FreeLibrary(Msg.Handle);
dann stürzt MEIN Programm ab.
Gruß
Neutral General