AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DLL-Injection mit Freelibrary

Ein Thema von Wotan89 · begonnen am 27. Nov 2007 · letzter Beitrag vom 10. Mär 2009
Antwort Antwort
Seite 1 von 3  1 23      
Wotan89

Registriert seit: 20. Nov 2007
77 Beiträge
 
Delphi 2005 Personal
 
#1

DLL-Injection mit Freelibrary

  Alt 27. Nov 2007, 19:23
Ich möchte, dass nach dem Ausführen meines Quelltextes der DLL, sie wieder "entladen wird". Aber dies klappt nicht. Mein Quelltext des Programmes:
Delphi-Quellcode:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function InjectIntoProcess(lpProcessID: Cardinal; lpDllname: String):Boolean;
var
  hProc: Cardinal;
  t:file of cardinal;
  func:pointer;
  hRemThread:cardinal;
  addr:pointer;
  cWPM: Cardinal;
  hdll:cardinal;
begin
  result := false;
  SetLastError(ERROR_SUCCESS);
  hProc := OpenProcess(PROCESS_ALL_ACCESS, false, lpProcessID);
  addr:=VirtualAllocEx(hProc, 0, length(lpDllname), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  WriteProcessMemory(hProc, addr, PChar(lpDllName), length(lpDllName), cWPM);
  CreateRemoteThread(hProc, nil, 0,GetProcaddress(getmodulehandle('kernel32.dll'),'LoadLibraryA') , addr, 0, hRemThread);
  if GetLastError = ERROR_SUCCESS then
   result := true;
   sleep(1000);
   assignfile(t,'e:\windows\HALLO.txt'); //{in der Datei HALLO.txt speichert meine DLL das Handle der DLL (hmod)}
   reset(t);
   read(t,hdll);
   closefile(t);

   addr:=Virtualallocex(hproc,0,sizeof(hdll),MEM_COMMIT,PAGE_EXECUTE_READWRITE);
   writeprocessmemory(hproc,addr,pointer(hdll),sizeof(hdll),cWPM);
   createremotethread(hproc,nil,0,getprocaddress(getmodulehandle('kernel32.dll'),'FreeLibrary'),addr,0,hremthread);
  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-injection\project1.dll'),true);
end;

end.
und hier meine DLL:
Delphi-Quellcode:
library Project1;

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, mmsystem;


{$R *.res}

procedure Timecallback(TimerId,Msg:Cardinal;dwuser,dw1,dw2:longword); pascal;
var t:file of cardinal; g:cardinal;
begin
g:=integer(getmodulehandle('project1.dll'));
assignfile(t,'e:\windows\HALLO.txt');
rewrite(t);
write(t,g);
closefile(t);
end;

procedure timeevent; stdcall;
begin
TimeSetEvent(1,0,@Timecallback,0,TIME_ONESHOT);
end;


begin
showmessage('hallo');
timeevent;
end.
Ich hoffe ihr könnt mir helfen oder etwas optimieren...
  Mit Zitat antworten Zitat
R4id
(Gast)

n/a Beiträge
 
#2

Re: DLL-Injection mit Freelibrary

  Alt 27. Nov 2007, 20:06
Ich kenn mich zwar nicht so aus, aber ich glaube du musst die Proceduren in Export einsetzten.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

Re: DLL-Injection mit Freelibrary

  Alt 27. Nov 2007, 20:21
Naja erstmal ist der Code unsauber, weil du nicht sicher sein kannst, dass das Handle auch wirklich schon geschrieben wurde. Da nützt auch das Sleep(1000) nichts.

Delphi-Quellcode:
addr:=Virtualallocex(hproc,0,sizeof(hdll),MEM_COMMIT,PAGE_EXECUTE_READWRITE);
   writeprocessmemory(hproc,addr,pointer(hdll),sizeof(hdll),cWPM);
   createremotethread(hproc,nil,0,getprocaddress(getmodulehandle('kernel32.dll'),'FreeLibrary'),addr,0,hremthread);
  CloseHandle(hProc);
Willst du einen Zeiger auf die Speicherstelle von HDLL oder einen Zeiger auf den Speicherinhalt? Denke ja mal eher an den Inhalt, von daher mal statt Pointer(HDLL), @HDLL versuchen.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: DLL-Injection mit Freelibrary

  Alt 27. Nov 2007, 20:23
Bist du dir sicher, dass in der Datei überhaupt etwas steht? Warum benutzt du einen Timer dafür (und wahrscheinlich sind dessen Argumente falsch; TIME_CALLBACK_FUNCTION muss noch in den letzten Parameter)?
Und warum nimmst du zum übertragen keine Messages?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Wotan89

Registriert seit: 20. Nov 2007
77 Beiträge
 
Delphi 2005 Personal
 
#5

Re: DLL-Injection mit Freelibrary

  Alt 27. Nov 2007, 20:39
Die Timerfunktion funktioniert, denn in meine Datei wird auch der Inhalt hineingeschrieben. Ich habe ersteinmal die Timerfunktion genommen, da die DLL beim Laden kein Handle mit Getmodulehandle "ausgespuckt" hat. Ich wusste nicht, wie ich es mit einer Messagefunktion machen sollte, deswegen habe ich übergangsweise alles einfach in eine Datei geschrieben. Ich habe statt Pointer(HDLL) @HDLL genommen. Funktioniert zwar dann noch immer nicht, aber ich denke meine Variante war trotzdem falsch .
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

Re: DLL-Injection mit Freelibrary

  Alt 27. Nov 2007, 21:08
Finde das hier sieht nett aus. Ist zwar auf Spanisch oder sowas, aber den Code kann man gut verstehen:
http://pasotech.altervista.org/delphi/articolo62.htm
  Mit Zitat antworten Zitat
Wotan89

Registriert seit: 20. Nov 2007
77 Beiträge
 
Delphi 2005 Personal
 
#7

Re: DLL-Injection mit Freelibrary

  Alt 28. Nov 2007, 14:41
Danke für den Link, der hat mir wirklich weitergeholfen .Ich habe jetzt Teile des spanischen Quelltextes übernommen.

Hier mein Quelltext:
Delphi-Quellcode:
 unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, TLHelp32;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Button2: TButton;
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }

   function BaseAddrDllProcess(PID: Cardinal; DLLName: string): Cardinal;

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
     hProc: Cardinal;
     hthread:cardinal;
  TID:cardinal;
  addr:pointer;
  cWPM: Cardinal;
  hdll:cardinal; processid:cardinal;
implementation

{$R *.dfm}



function InjectIntoProcess(lpProcessID: Cardinal; lpDllname: PChar):Boolean;
begin
  result := false;
  SetLastError(ERROR_SUCCESS);
  processid:=lpProcessID;
 hProc := OpenProcess(PROCESS_ALL_ACCESS, false, lpProcessID); //{prozesshandle besorgen}
   //{freien Speicher im Prozess reservieren und dem Zeiger auf den Speicherblock}
   //{den DLL-Namen in den Prozess schreiben}
  addr:=VirtualAllocEx(hProc, nil, length(lpDllname), MEM_COMMIT, PAGE_READWRITE);
  WriteProcessMemory(hProc, addr, Pointer(lpDllName), length(lpDllName),cWPM);

   hthread:=CreateRemoteThread(hproc, nil, 0,GetProcaddress(getmodulehandle('kernel32.dll'),'LoadLibraryA') , addr, 0, TID);
  WaitforSingleObject(hThread,INFINITE);
   Virtualfreeex(hproc,addr,0,MEM_Release);
  
  if GetLastError = ERROR_SUCCESS then
   result := true;
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-injection\project1.dll'));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
hdll:=BaseAddrDllProcess(ProcessID,'project1.dll');
 if hdll=0 then
 begin
 showmessage('keine entsprechende DLL gefunden');
 exit;
 end;
   addr:=Virtualallocex(hproc,0,sizeof(hdll),MEM_COMMIT,PAGE_READWRITE);
   writeprocessmemory(hproc,addr,pointer(hdll),sizeof(hdll),cWPM);
   hthread:=createremotethread(hproc,nil,0,getprocaddress(getmodulehandle('kernel32.dll'),'FreeLibrary'),addr,0,TID);
   WaitforSingleObject(hthread,INFINITE);
   VirtualFreeex(hproc,addr,0,MEM_Release);

end;


function TForm1.BaseAddrDllProcess(PID: Cardinal; DLLName: string): Cardinal;
var
  me: TModuleEntry32;
  hSnap: THandle;
begin
  Result := 0;
  hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, pid);
  me.dwSize := sizeof(TModuleEntry32);
  Module32First(hSnap, me);
  repeat
    if LowerCase(me.szModule) = LowerCase(DLLName) then
      begin
        result := Cardinal(me.modBaseAddr);
        break;
      end;
  until (not (Module32Next(hSnap, me)));
  CloseHandle(hSnap);
end;

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
closehandle(hproc);
end;

end.
meine DLL wird aber nicht entladen. Zumindest kann ich sie nicht löschen und ich kann keine erneute Injection mehr machen. Den Quelltext meiner DLL habe ich auf eine Showmessage-Function beschränkt um zu sehen, ob die Injection klappt.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

Re: DLL-Injection mit Freelibrary

  Alt 28. Nov 2007, 15:38
Was ist hiermit?

Delphi-Quellcode:
function UnloadDll(PID: dword; DLL: string; synch: Boolean; var success: Boolean): Boolean;
var
  BytesWritten, hProcess, hThread, TID: Cardinal;
  Parameters: pointer;
  BaseAddr: Cardinal;
  pThreadStartRoutine: Pointer;
  lpExitCode: Cardinal;
begin

  Result := False;
  if PID = 0 then
    Exit;
  BaseAddr := BaseAddrDllProcesso(PID, DLL);
  if BaseAddr = 0 then
    Exit;
  hProcess := 0;
  hThread := 0;
  pThreadStartRoutine := nil;

  try
    hProcess := OpenProcess(PROCESS_CREATE_THREAD +
                            PROCESS_QUERY_INFORMATION +
                            PROCESS_VM_OPERATION +
                            PROCESS_VM_WRITE +
                            PROCESS_VM_READ,
                            False,
                            PID
                            );
    if hProcess = 0 then
      begin
        ErrStr('OpenProcess');
        Exit;
      end;

    pThreadStartRoutine := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), 'FreeLibrary');
    if pThreadStartRoutine = nil then
      begin
        ErrStr('GetProcAddress');
        Exit;
      end;

    hThread := CreateRemoteThread(hProcess,
                                  nil,
                                  0,
                                  pThreadStartRoutine,
                                  Pointer(BaseAddr),
                                  0,
                                  TID);

    if hThread = 0 then
      begin
        ErrStr('CreateRemoteThread');
        Exit;
      end;

    //mi metto in attesa della terminazione del thread
    if synch then
      begin
        case WaitForSingleObject(hThread, INFINITE) of
          WAIT_FAILED:
            begin
              ErrStr('WaitForSingleObject');
              Exit;
            end;
        end;
        if not GetExitCodeThread(hThread, lpExitCode) then
          begin
            ErrStr('GetExitCodeThread');
            Exit;
          end;
        success := (lpExitCode > 0);
      end;

    Result := True;

  finally

    if hThread <> 0 then
      begin
        if not CloseHandle(hThread) then
          begin
            ErrStr('CloseHandle');
          end;
      end;

    if hProcess <> 0 then
      begin
        if not CloseHandle(hProcess) then
          begin
            ErrStr('CloseHandle');
          end;
      end;

  end;

end;
  Mit Zitat antworten Zitat
Wotan89

Registriert seit: 20. Nov 2007
77 Beiträge
 
Delphi 2005 Personal
 
#9

Re: DLL-Injection mit Freelibrary

  Alt 28. Nov 2007, 15:44
Wenn du dir meine Button2-Procedure anguckst wirst du feststellen, dass meins das selbe ist, nur ohne auffwendige Fehlerbehandlung. Der Fehler kommt bei mir doch schon bei der Injection... Da bin ich genauso weit wie vorher...
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#10

Re: DLL-Injection mit Freelibrary

  Alt 28. Nov 2007, 15:50
Deshalb sollst du doch mal die Funktionen MIT Fehlerbehandlung 1 zu 1 übernehmen. Dann könntest du auch posten WELCHER Fehler WO genau auftritt. Anders ist es schwer zu helfen. Diese AccessViolation ist ziemlich allgemein und ich kann damit wenig anfangen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz