Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Handle einer DLL rausfinden (https://www.delphipraxis.net/118896-handle-einer-dll-rausfinden.html)

darkdonald 17. Aug 2008 14:07


Handle einer DLL rausfinden
 
Hallo!
Ich habe folgendes Problem: Ich habe ein Plugin für QIP (so ähnlich wie ICQ) geschrieben, dass per SharedMem neue Messages an ein kleines Tool von mir schickt. Die Message wird dann auf einem LCD Display angezeigt. Funktioniert auch wunderbar. Nun möchte ich umgekehrt auf dem Display eine Antwort auswählen und diese per SharedMem zurück an das Plugin senden. Das Plugin ist eine DLL. Leider kriege ich es nicht hin, weil ich irgendwie nicht dass Plugin-Handle finde. Wie muss ich vorgehen? Bekannt sind der Exe-Name der Hauptanwendung (QIP), der DLL-Name, der Klassenname des Plugins. Ich habe schon alles mögliche versucht, aber das Plugin reagiert nicht. Ich denke weil das Handle falsch ist... Oder gibt eine Möglichkeit im Plugin das eigene Handle rauszufinden? Dann könnte ich das mit der ersten Message an mein Tool verschicken?!?

Ratlos...

Gruss
Donald

marabu 17. Aug 2008 14:34

Re: Handle einer DLL rausfinden
 
Hallo Donald,

ich habe nicht auf Anhieb feststellen können, wie ein Plugin für QIP aussieht, aber wenn es eine DLL sein sollte, dann erhält diese ihr Handle beim Aufruf der Initialisierungsfunktion DllMain().

Freundliche Grüße

Deep-Sea 18. Aug 2008 07:48

Re: Handle einer DLL rausfinden
 
Verstehe ich das richtig? Die DLL wird von QIP geladen, und du möchstest jetzt das Handle, was QIP beim laden dieser DLL bekommen hat, in einem anderen Prozess herausfinden? Wenn das stimmt, dann wird das nicht klappen. :shock:

Zacherl 18. Aug 2008 14:57

Re: Handle einer DLL rausfinden
 
Natürlich geht das :) Du musst allerdings mittels WriteProcessMemory und CreateRemoteThread bisschen rumtricksen, sodass du GetModuleHandle mit dem DLL Namen als Parameter injizierst und z.b. den Rückgabewert des Thread dann auf das Module Handle setzt.

Deep-Sea 18. Aug 2008 15:47

Re: Handle einer DLL rausfinden
 
Zitat:

Zitat von Zacherl
Natürlich geht das :) Du musst allerdings mittels WriteProcessMemory und CreateRemoteThread bisschen rumtricksen, sodass du GetModuleHandle mit dem DLL Namen als Parameter injizierst und z.b. den Rückgabewert des Thread dann auf das Module Handle setzt.

(Es war ya zu erwarten, das irgend ein kranker Geist mit solch' verrückten Methoden ankommt :mrgreen: :wink: )

Zacherl 18. Aug 2008 16:06

Re: Handle einer DLL rausfinden
 
:mrgreen: Ist allerdings nicht viel komplizierter als DLL Injection. Aber halt, es geht noch einfacher. In der Unit TlHelp32 gibt es eine API, mit der man z.b. alle Prozesse auflisten kann. Genauso aber kann man damit z.b. alle geladenen Module eines bestimmten Prozesses auflisten lassen (CreateToolhelpSnapshot heißt die API).

Gruß Zacherl

Deep-Sea 18. Aug 2008 16:20

Re: Handle einer DLL rausfinden
 
(Ahh, schon ok *klappe halt* :mrgreen:)

Zacherl 18. Aug 2008 17:25

Re: Handle einer DLL rausfinden
 
Auf die Schnelle:

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  hSnapshot,
  PID: Cardinal;
  Proc32: TProcessEntry32;
  Mod32: TModuleEntry32;
begin
  PID := 0;

  hSnapshot := TlHelp32.CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if (hSnapshot <> 0) and (hSnapshot <> INVALID_HANDLE_VALUE) then
  begin
    try
      if Process32First(hSnapshot, Proc32) then
      begin
        while Process32Next(hSnapshot, Proc32) do
        begin
          if AnsiUppercase(Proc32.szExeFile) = 'QIP.EXE' then
          begin
            PID := Proc32.th32ProcessID;
            Break;
          end;
        end;
      end;
    finally
      CloseHandle(hSnapshot);
    end;
  end;

  if PID <> 0 then
  begin
    hSnapshot := TlHelp32.CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID);
    if (hSnapshot <> 0) and (hSnapshot <> INVALID_HANDLE_VALUE) then
    begin
      try
        if Module32First(hSnapshot, Mod32) then
        begin
          while Module32Next(hSnapshot, Mod32) do
          begin
            if AnsiUppercase(Mod32.szModule) = 'PLUGIN.DLL' then
            begin
              // Modul Handle steht jetzt in
              // Mod32.hModule
              Break;
            end;
          end;
        end;
      finally
        CloseHandle(hSnapshot);
      end;
    end;
  end;
end;

brechi 18. Aug 2008 17:49

Re: Handle einer DLL rausfinden
 
Moment!
ShareMem = MemoryMappedFiles?
Senden = SendMessage?

Dann brauchst du das Fensterhandle von QIP und die Dll muss einen Messagehook installieren.

Wenn du wirklich das Handle der Dll brauchst: Ruf innerhalb von der Dll GetModuleHandle('dllname') auf, bzw. VirtualQuery oder einfach dllhandle := hinstance (wenn ich micht net irre) und teil es deinem Programm über SharedMem mit.

Auch wenn man fast alles mittels Injecten machen kann ist das hier doch irgendwie sinnlos. Genauso wie das Handle extern bekommen was will man damit wenns eh nur im eigenen Prozess gültig ist.

Zacherl 18. Aug 2008 19:08

Re: Handle einer DLL rausfinden
 
Er braucht das Handle ja für einen zweiten Prozess, der mit dem Plugin kommmuniziert. Wozu das Handle hier konkret benötigt wird weiß ich allerdings auch nicht ..


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:44 Uhr.
Seite 1 von 2  1 2      

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