Autor |
Beitrag |
Wotan89
      
Beiträge: 22
|
Verfasst: Sa 10.11.07 13:34
Die Dll-Injection klappt sonst einwandfrei, aber wenn ich mit der dll ein Formular erzeugen möchte, klappt diese plötzlich sofort wieder zusammen
injection-script:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
{$R *.dfm}
function InjectIntoProcess(lpProcessID: Cardinal; lpDllname: String):Boolean; var hProc: Cardinal; oAlloc: Pointer; cWPM: Cardinal; hRemThread: Cardinal; begin result := false; SetLastError(ERROR_SUCCESS); hProc := OpenProcess(PROCESS_ALL_ACCESS, false, lpProcessID); oAlloc := VirtualAllocEx(hProc, 0, length(lpDllname), MEM_COMMIT, PAGE_EXECUTE_READWRITE); WriteProcessMemory(hProc, oAlloc, PChar(lpDllName), length(lpDllName), cWPM); CreateRemoteThread(hProc, nil, 0, GetProcAddress(GetModuleHandle('kernel32.dll'), 'LoadLibraryA'), oAlloc, 0, hRemThread); if GetLastError = ERROR_SUCCESS then result := true; CloseHandle(hProc); end;
procedure TForm1.Button1Click(Sender: TObject); var pid,h:cardinal; begin h:=findwindow(nil,pchar(edit1.Text)); getwindowthreadprocessid(h,@pid); label1.Caption:=booltostr(InjectIntoProcess(pid,'E:\Dokumente und Einstellungen\Stefan_Admin\Eigene Dateien\Programmierung\code-injection3\project1.dll'),true); end;
end. |
Meine dll: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| library Project1;
uses Forms, Unit1 in 'Unit1.pas' ;
{$R *.res}
begin Form1.showform; end. |
und meine Unit für die dll: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| + unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls;
type TForm1 = class(TForm) Timer1: TTimer; procedure Timer1Timer(Sender: TObject); procedure FormCreate(Sender: TObject); private public Function showform:boolean ; end;
var Form1: TForm1;
implementation
{$R *.dfm}
Function TForm1.showform:boolean ; begin result:=false; Form1:=Tform1.Create(Application); Form1.Show; result:=true; end;
end. |
Wenn ich application.Initialize usw. drin stehen lasse, fährt sich der Prozess, in welchen ich die dll injeziere fest und geht erst weiter, wenn mein Formular beendet wird...[/quote]
|
|
Wotan89 
      
Beiträge: 22
|
Verfasst: Mo 12.11.07 18:13
Hat denn keiner eine Idee, wie das funktionieren köntte oder was ich noch beachten müsste? Wäre echt toll, wenn mir jemand weiterhelfen könnte 
|
|
R4Y
      
Beiträge: 41
|
Verfasst: So 02.12.07 14:16
ich weiß net ob du das so meinst aber so klappt es bei mir ...
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure Show; var Form2:TForm; begin Form2:=TForm.Create(nil); Form2.Name:='Form1'; Form2.Show; end;
export Show; |
Erstellt eine Form die leer ist..
Moderiert von Narses: Code- durch Delphi-Tags ersetzt
|
|
dummzeuch
      
Beiträge: 593
Erhaltene Danke: 5
Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
|
Verfasst: So 02.12.07 14:55
Hi,
Wotan89 hat folgendes geschrieben: | Die Dll-Injection klappt sonst einwandfrei, aber wenn ich mit der dll ein Formular erzeugen möchte, klappt diese plötzlich sofort wieder zusammen
Delphi-Quelltext
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| type TForm1 = class(TForm) public Function showform:boolean ; end;
var Form1: TForm1;
implementation
{$R *.dfm}
Function TForm1.showform:boolean ; begin result:=false; Form1:=Tform1.Create(Application); Form1.Show; result:=true; end; |
|
Auah, das tut ja schonmal ziemlich weh:
1. form1.ShowForm ruft eine Methode einer nicht initialisierten Variable form1 auf. Das funktioniert nur deshalb, weil Du in ShowForm nicht auf eine virtuelle Methode oder ein Feld des Formulars zugreifst. Mach daraus mal schlenigst eine Klassenmethode und rufe sie als solche auf:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| TForm1.ShowForm
type TForm1 = class(TForm) public class Function showform:boolean ; end; |
2. Innerhalb einer DLL auf Application zuzugreifen ist zumindest gefaehrlich, wenn man nicht im Hinterkopf behaelt, dass diese globale Application-Variable eine andere ist als die im Hauptprogramm. Ich wuerde das komplett rauslassen und als Owner des Formulars nil angeben.
3. Die globale Variabel Form1 sollte man sich am Besten komplett schenken (Deklaration loeschen), es sei denn, man laesst das Formular automatisch erzeugen (was ich in der Regel nur fuer das Haupt-Formular eines Programmes mache). Sonst ist die Gefahr zu gross, dass man ueber diese Variable von anderen Programmteilen aus direkt auf das Formular zugreift, obwohl nicht sichergestellt ist, dass es ueberhaupt schon erzeugt wurde.
Meine Vermutung ist, dass 2. Dein Problem ausloest.
twm
|
|
|