Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DLL-Injection mit Freelibrary (https://www.delphipraxis.net/104122-dll-injection-mit-freelibrary.html)

worker 10. Mär 2009 12:59

Re: DLL-Injection mit Freelibrary
 
Hallo,

habe zu der Routine aus Beitrag #20 mal eine Frage.

Und zwar habe ich diese Routine so bei mir implementiert.
Allerdings schmiert meine Testanwendung (Notepad) beim Aufruf der folgenden Codezeile ab:

Delphi-Quellcode:
th := createremotethread(hproc, Nil, 0, getprocaddress(getmodulehandle('kernel32.dll'), 'FreeLibrary'), Pointer(result), 0, hremthread);
Die Injizierung hat vorher problemlos funktioniert.

Muss ich in der DLL noch irgendetwas implementieren?

Habe schon folgendes probiert:

Delphi-Quellcode:
Procedure DllMain(Reason: Integer);
Var
   hThread: Cardinal;
Begin
   Case Reason Of
      DLL_PROCESS_ATTACH: CreateThread(Nil, 0, TFNThreadStartRoutine(@CreateIt), Nil, 0, hThread);
      DLL_THREAD_ATTACH: ;
      DLL_THREAD_DETACH: ;
      DLL_PROCESS_DETACH: ;
   End;
End;
[...]
Begin
   DllProc := @DllMain;
   DllProc(DLL_PROCESS_ATTACH);
End.
Delphi-Quellcode:
Procedure DllMain(Reason: Integer);
Var
   hThread: Cardinal;
Begin
   Case Reason Of
      DLL_PROCESS_ATTACH: CreateThread(Nil, 0, TFNThreadStartRoutine(@CreateIt), Nil, 0, hThread);
      DLL_THREAD_ATTACH: ;
      DLL_THREAD_DETACH: ;
      DLL_PROCESS_DETACH: CreateThread(Nil, 0, TFNThreadStartRoutine(@DestroyIt), Nil, 0, hThread);
   End;
End;

Procedure DestroyIt;
Begin

   //Alte WndProc wieder zurücksetzen
   setWindowLong(xNotepad, GWL_WNDPROC, LongInt(@pWndProc));
End;
[...]
Begin
   DllProc := @DllMain;
   DllProc(DLL_PROCESS_ATTACH);
End.
Delphi-Quellcode:
Procedure DllMain(Reason: Integer);
Var
   hThread: Cardinal;
Begin
   Case Reason Of
      DLL_PROCESS_ATTACH: CreateThread(Nil, 0, TFNThreadStartRoutine(@CreateIt), Nil, 0, hThread);
      DLL_THREAD_ATTACH: ;
      DLL_THREAD_DETACH: ;
      DLL_PROCESS_DETACH: CreateThread(Nil, 0, TFNThreadStartRoutine(@DestroyIt), Nil, 0, hThread);
   End;
End;

Procedure DestroyIt;
Begin

   //Alte WndProc wieder zurücksetzen
   setWindowLong(xNotepad, GWL_WNDPROC, LongInt(@pWndProc));
FreeLibrary(HInstance);
End;
[...]
Begin
   DllProc := @DllMain;
   DllProc(DLL_PROCESS_ATTACH);
End.
Bringt aber leider alles nichts - Notepad schmiert weiterhin ab :(

worker 10. Mär 2009 14:36

Re: DLL-Injection mit Freelibrary
 
Habe ergänzend noch herausgefunden, das alles lecker ist, wenn ich darauf verzichte, die WndProc von Notepad umzubiegen:
Delphi-Quellcode:
   
//pWndProc := Pointer(GetWindowLong(oNotepad, GWL_WNDPROC));
//setWindowLong(oNotepad, GWL_WNDPROC, LongInt(@NewWndProc));
Bringt mich persönlich nicht weiter, aber vielleicht denjenigen, der mir bei diesem Problem helfen kann.

Apollonius 10. Mär 2009 14:43

Re: DLL-Injection mit Freelibrary
 
Warum erzeugst du für jeden Piep einen neuen Thread? Beim Zurücksetzen der WndProc musst du LongInt(pWndProc) angeben.

worker 10. Mär 2009 15:04

Re: DLL-Injection mit Freelibrary
 
Zitat:

Zitat von Apollonius
Beim Zurücksetzen der WndProc musst du LongInt(pWndProc) angeben.

Was so ein kleines @ doch alles vermasseln kann ;)

Zitat:

Zitat von Apollonius
Warum erzeugst du für jeden Piep einen neuen Thread?

Das ist bei meinen 5 Millionen Versuchen, das Problem in den Griff zu bekommen, dabei rausgekommen.
Dachte, es liegt vielleicht daran, dass es nur innerhalb von Threads funktioniert.

Ein Einfacher Aufruf von
Delphi-Quellcode:
DLL_PROCESS_DETACH: DestroyIt;
tut's auch.


Fazit: es funktioniert - danke Dir :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:11 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz