AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi DLL Injection & Zugreifen auf Edit
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Injection & Zugreifen auf Edit

Ein Thema von robert23 · begonnen am 4. Sep 2006 · letzter Beitrag vom 9. Sep 2006
Antwort Antwort
robert23

Registriert seit: 16. Aug 2006
20 Beiträge
 
#1

DLL Injection & Zugreifen auf Edit

  Alt 4. Sep 2006, 17:04
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
  Mit Zitat antworten Zitat
robert23

Registriert seit: 16. Aug 2006
20 Beiträge
 
#2

Re: DLL Injection & Zugreifen auf Edit

  Alt 5. Sep 2006, 17:19
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
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: DLL Injection & Zugreifen auf Edit

  Alt 5. Sep 2006, 17:23
Du willst ein Editcontrol auslesen? Schonmal FindWindow probiert?
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von Lemmy1
Lemmy1

Registriert seit: 28. Nov 2004
Ort: Ismaning
184 Beiträge
 
Delphi 2006 Professional
 
#4

Re: DLL Injection & Zugreifen auf Edit

  Alt 5. Sep 2006, 17:25
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
Daniel
www.nemu.com - The N64 Emulator
  Mit Zitat antworten Zitat
robert23

Registriert seit: 16. Aug 2006
20 Beiträge
 
#5

Re: DLL Injection & Zugreifen auf Edit

  Alt 5. Sep 2006, 17:49
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
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#6

Re: DLL Injection & Zugreifen auf Edit

  Alt 5. Sep 2006, 17:52
Hallo

Mein Winspy Tool generiert dir gleich den Findwindow-Code
Thomas
  Mit Zitat antworten Zitat
robert23

Registriert seit: 16. Aug 2006
20 Beiträge
 
#7

Re: DLL Injection & Zugreifen auf Edit

  Alt 5. Sep 2006, 19:10
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
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#8

Re: DLL Injection & Zugreifen auf Edit

  Alt 7. Sep 2006, 12:22
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 ...
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;
  Mit Zitat antworten Zitat
robert23

Registriert seit: 16. Aug 2006
20 Beiträge
 
#9

Re: DLL Injection & Zugreifen auf Edit

  Alt 9. Sep 2006, 12:52
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?
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#10

Re: DLL Injection & Zugreifen auf Edit

  Alt 9. Sep 2006, 14:01
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 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?
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 ...
  Mit Zitat antworten Zitat
Antwort Antwort


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 22:17 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