Delphi-PRAXiS

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 & Zugreifen auf Edit (https://www.delphipraxis.net/76442-dll-injection-zugreifen-auf-edit.html)

robert23 4. Sep 2006 17:04


DLL Injection & Zugreifen auf Edit
 
Hey,

ich habe jetzt in eine fremde Anwendung eine DLL injeziert, nun möchte ich gerne
das Edit dieser Anwendung auslesen. Nur finde ich weder in hook noch dll tutorials
etwas brauchbares.

Danke, Robert

robert23 5. Sep 2006 17:19

Re: DLL Injection & Zugreifen auf Edit
 
Ich habe nun schon msdn abgesucht, auch nichts gefunden. Mehr als nen Tutorial wie ich die DLL injecte finde ich nirgends, weiterführende Lektüre is einfach nicht auffindbar.

Keiner ne Idee?

Robert

alzaimar 5. Sep 2006 17:23

Re: DLL Injection & Zugreifen auf Edit
 
Du willst ein Editcontrol auslesen? Schonmal FindWindow probiert?

Lemmy1 5. Sep 2006 17:25

Re: DLL Injection & Zugreifen auf Edit
 
Schau mal hier: http://www.codeproject.com/dll/RemoteLib.asp

Ist zwar C++ aber vielleicht hilft das ja weiter. Auf CodeProject habe ich schon öfters Artikel zum Thema "DLL Injection" gefunden. Einfach mal dort die Suche bemühen :)

robert23 5. Sep 2006 17:49

Re: DLL Injection & Zugreifen auf Edit
 
Ich habe gerade das kleine programm winspy + source gefunden.
Nun sieht es für mich so aus als ob eine DLL Injection zum auslesen des Textes garnicht nötig ist,
denn Winspy injeziert nur um ein Edit auszulesen was ein Passwort beinhaltet.
Nur wird bei winspy das ganze mit der Maus bewerkstelligt - also es gibt da schon so schöne
Funktionen die gleich das Handle zum passenden Fenster unter der Maus besorgen.
Mein Ziel war es aber das ganze ohne Maus zu machen, sondern nur die Target EXE anzugeben.
Da Winspy in C++ geschrieben ist seh ich aber bei dem ganzen nicht so 100% durch,
also es besteht immer noch hilfebedarf :cry:

toms 5. Sep 2006 17:52

Re: DLL Injection & Zugreifen auf Edit
 
Hallo

Mein Winspy Tool generiert dir gleich den Findwindow-Code

robert23 5. Sep 2006 19:10

Re: DLL Injection & Zugreifen auf Edit
 
Dein Programm zeigt mir an das die Komponente der Classe "Afx:400000:20" ist,
dies ist ja nun kein Edit oder so, kann ich so eine Komponente trotzdem auslesen?
Vom aussehen sieht die Komponente aus wie ein Memo.

Robert

Olli 7. Sep 2006 12:22

Re: DLL Injection & Zugreifen auf Edit
 
Das kommt drauf an. Wenn es eine Subklasse ("Derivat") von EDIT ist, kannst du es auf gleichem Wege auslesen. Ist ja nicht so, daß WM_GETTEXT (und die entsprechende Funktion) nicht auch für andere Fensterklassen als EDIT funktionieren würde. Die Fensterklasse muß halt nur diese Nachricht unterstützen ...

Nachdem im Sommer 2002 EDA mit Source in der c't war, schossen irgendwie gleichartige Delphitools wie Pilze aus dem Boden ... :gruebel: :mrgreen:
http://assarbad.info/stuff/eda_previ...2003-10-12.rar (neueste und bisher letzte aktualisierte Version)


Nachtrag: Aussehen ist nicht immer relevant. Beispielsweise sehen viele der Widgets in Firefox so aus, wie man sie von Windows gewohnt ist, dennoch haben die eine ganz andere Methode zum Zeichnen und die EDITs sind z.B. keine. Wenn das Fenster aber schon direkt ein eigenes Handle hat und du anhand der Umrandung feststellen kannst, daß nur dieses vermeintliche Memo mit dem Klassennamen gemeint ist, hast du gute Chancen. Versuche es also.

Folgende beide Funktionen sind aus EDA 2.7
Delphi-Quellcode:
function GetTextFromWndW(hwnd: HWND): WideString;
(*
  Functionality:
    This function gets the text associated with the given window.
    [GENERIC]
*)
var
  l: integer;
  pwc: PWideChar;
begin
// Get length of text ... could cause buffer overflow if not error checked!!!
  l := SendMessageW(hwnd, WM_GETTEXTLENGTH, 0, 0);
  if l > 0 then
  begin
// Allocate memory
    l := l + 2;
    pwc := GetMemory(l * sizeof(pwc^));
    if Assigned(pwc) then
    try
// Fill allocated memory with zeroes
      ZeroMemory(pwc, l * sizeof(pwc^));
// Get text (max len = l-1 characters)
      SendMessageW(hwnd, WM_GETTEXT, l - 1, Integer(pwc));
{
  For the problems concerning InternalGetWindowText(), see its declaration!

      InternalGetWindowText(hwnd, pwc, l);

  GetWindowText(hwnd, pwc, l) also does not work, because it can only retrieve
  the text of your own application. Not that of another process!
}
// Set return value
      SetString(result, pwc, lstrlenW(pwc));
    finally
// Free allocated memory
      FreeMemory(pwc);
    end;
  end;
end;

function GetTextFromWndA(hwnd: HWND): AnsiString;
(*
  Functionality:
    This function gets the text associated with the given window.
    [GENERIC]
*)
var
  l: integer;
  pc: PAnsiChar;
begin
// Get length of text ... could cause buffer overflow if not error checked!!!
  l := SendMessageA(hwnd, WM_GETTEXTLENGTH, 0, 0);
  if l > 0 then
  begin
// Allocate memory
    l := l + 2;
    pc := GetMemory(l);
    if Assigned(pc) then
    try
// Fill allocated memory with zeroes
      ZeroMemory(pc, l);
// Get text (max len = l)
      SendMessageA(hwnd, WM_GETTEXT, l - 1, Integer(pc));
// Set return value
      SetString(result, pc, lstrlenA(pc));
    finally
// Free allocated memory
      FreeMemory(pc);
    end;
  end;
end;
Desweiteren gibt es etwas zu beachten bei Windows 9x/Me wenn man den Klassennamen ermitteln will:
Delphi-Quellcode:
function GetClassNameFromWndW(hwnd: HWND): WideString;
(*
  Functionality:
    This function fills a string with the classname of the window given as the
    parameter.
    [GENERIC]
*)
var
  pwc: PWideChar;
const
  maxbufsize = 32767 * sizeof(WideChar);
  //Win9x does not like buffer size above 32k-1 - I also reported this to MS
  //after 8 month I got no feedback yet ... I guess this is MS's policy 2002-10-31
begin
// Default return value
  result := emptystring;
// Allocate memory
  pwc := GetMemory(maxbufsize);
// If successful ...
  if Assigned(pwc) then
  try
// Fill with zeroes
    ZeroMemory(pwc, maxbufsize);
// If Window still exists ...
    if IsWindow(hwnd) then
// Get its class name and write it into PC
      if GetClassnameW(hwnd, pwc, maxbufsize) > 0 then
// Copy PC as return value
        SetString(Result, pwc, lstrlenW(pwc));
  finally
// Free allocated memory
    FreeMemory(pwc);
  end;
end;

function GetClassNameFromWndA(hwnd: HWND): AnsiString;
(*
  Functionality:
    This function fills a string with the classname of the window given as the
    parameter.
    [GENERIC]
*)
var
  pc: PAnsiChar;
const
  maxbufsize = 32767;
//Win9x does not like buffer size above 32k-1 - I also reported this to MS
//after 8 month I got no feedback yet ... I guess this is MS's policy 2002-10-31
begin
// Default return value
  result := emptystring;
// Allocate memory
  pc := GetMemory(maxbufsize);
// If successful ...
  if Assigned(pc) then
  try
// Fill with zeroes
    ZeroMemory(pc, maxbufsize);
// If Window still exists ...
    if IsWindow(hwnd) then
// Get its class name and write it into PC
      if GetClassname(hwnd, pc, maxbufsize) > 0 then
// Copy PC as return value
        SetString(Result, pc, lstrlen(pc));
  finally
// Free allocated memory
    FreeMemory(pc);
  end;
end;

robert23 9. Sep 2006 12:52

Re: DLL Injection & Zugreifen auf Edit
 
Erstmal danke Olli, der Source hat sehr nützliche Funktionen zum auslesen von Texten.
Nuja, ok. EDA nutzt ja ein Mouse Hook - ich will aber ohne das ich aktiv am pc werden muss
den Text eines Edits in einer Anwendung auslesen.

Welchen Hook muss ich dafür nehmen? Ich habe da an WH_CALLWNDPROC gedacht.
Und wie gehe ich dann weiter vor? Muss ich dann Filtern welche Daten an mein Edit
geschickt werden und diese dann auslesen?
Irgendwo sehe ich noch nicht den roten Faden beim
Thema Hooks.
Oder brauch ich garkeinen Hook für meine Anwendung? :gruebel:

Olli 9. Sep 2006 14:01

Re: DLL Injection & Zugreifen auf Edit
 
Zitat:

Zitat von robert23
Erstmal danke Olli, der Source hat sehr nützliche Funktionen zum auslesen von Texten.
Nuja, ok. EDA nutzt ja ein Mouse Hook - ich will aber ohne das ich aktiv am pc werden muss
den Text eines Edits in einer Anwendung auslesen.

Es nutzt einen Maushook, aber nur einen lokalen um beim untersten Button eine Beschreibung des Elements über dem die Maus sich gerade befindet anzuzeigen ;)

Wenn du mit der Maus außerhalb des EDA-Fensters auf irgendwas zeigst, läuft das unter Mauscapturing ;)


Zitat:

Zitat von robert23
Welchen Hook muss ich dafür nehmen? Ich habe da an WH_CALLWNDPROC gedacht.
Und wie gehe ich dann weiter vor? Muss ich dann Filtern welche Daten an mein Edit
geschickt werden und diese dann auslesen?
Irgendwo sehe ich noch nicht den roten Faden beim
Thema Hooks.
Oder brauch ich garkeinen Hook für meine Anwendung? :gruebel:

IMO brauchst du keinen Hook sondern solltest dir die Eigenschaften des Zielfensters genau anschauen. Wenn du beispielsweise sagen kannst, daß das Fenster immer einen bestimmten Klassennamen und eine bestimmte ID hat, kannst du das zur Identifikation heranziehen und dann über FindWindow oder eine der Methoden die zB in EDA verwendet werden das Handle herausfinden. Das schöne an EDITs ist, daß sie zu jenen Controls zählen, die seit Win16 existieren und damit keine Beschränkungen in Sachen Prozessgrenze kennen. Du kannst also ohne weiteres bei einem anderen Prozess den Inhalt eines EDITs verändern.

Mit Vista könnte das allerdings schon Geschichte sein ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 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