![]() |
AW: Undokumentierter Sendmessage-Befehl
ReadProcessMemory ... Was denkst du, wie ich den Speicher rüberkopiere? :zwinker:
Aber das Problem hierbei ist, erstmal rauszubekommen wo sich was befindet. Es gibt eben keine direkte statische Zuordnung zwischen Handle (HWND) und TControl ... ist alles schön dynamisch und schön verschachtelt. Und beim TLabel gibt es noch nichtmal ein Handle, weswegen man sich dort durch noch mehr verschachtelungen wurschteln muß. Bei den anderen Controls kann man ja leicht an den Text kommen, da sich das HWND suchen und dann über die WinAPI (z.B. WM_GETTEXT) dieser auslesen läßt, aber z.B. dem TLabel kannst du keine Message schicken. Wenn ich dir eine hochauflösende Luftaufnahme von Europa gebe, dann wirst du es dennoch schwer haben mich darauf zu finden. :wink: |
AW: Undokumentierter Sendmessage-Befehl
Guten Morgen liebe Delphi-Gemeinde!
@ Himitsu: Tja, das ist das Ergebnis wenn der Scheffe solche Sachen nur einem einzigen Mann überlässt, weil er Zitat "Vollstes Vertrauen" hat. Ubd der hat das Programm mehr oder weniger in seiner Freizeit gecodet, womit es eigentlich kein Firmeneigentum ist.. Tja, und dann kommt da noch ne Frau ins Spiel.. Die des Programmierers. Den Rest kann man sich ja dann wohl denken.. Dein Programm Form5 ist ja die Wucht, aber so richtig weiterhelfen tuts mir eigentlich nicht :( Wozu dienen die Komponenten auf Panel1?? Ich hab gestern auf Maloche das Proggie mit nem Resource-Viewer (nicht mit ResHacker, wie von Morphie vorgeschlagen, weil der abstürzte, wenn ich die betreffende Form öffnen wollte sondern mit XN Resource Editor) gecheckt, und jetzt kommts noch schlimmer: Das was ich für Labels hielt, sind in Wirklichkeit TDBText Objekte... die haben ja keine Caption oder nen Text.. bim momentan etwas ratlos und kurz vorm aufgeben..... :cry::cry::cry::cry::cry: glaube ich brauche bald mal nen Reset :cheers: Obigen Quelltext von Sirius hab ich etwas abgewandelt, und man kann damit tatsächlich sämtliche Labels (wenn der Name bekannt ist) auslesen.. Aber jetzt gehts plötzlich um TDBText... Edit: Hab grade festgestellt daß TDBText doch ne Caption haben... lässt sich schreiben und lesen. Taucht nur nicht in der OH auf.. |
AW: Undokumentierter Sendmessage-Befehl
Zitat:
Zitat:
Davon mal abgesehen, was versucht du eigentlich zu erreichen? Eventuell gibt es ja eine bessere Möglichkeit. Viele Grüße, BruceSpringsteenFan. |
AW: Undokumentierter Sendmessage-Befehl
Zitat:
Viele Grüße, NKOTBFan |
AW: Undokumentierter Sendmessage-Befehl
Hallo Sirius!!
Von dir stammt also dieses schöne Stückchen Code!! Ich hoffe du hast nichts dagegen dass ich dein geistiges Eigentum in mein Proggi einbaue?? *liebfrag* Wie kommt man auf sowas bzw. woher hast du solche Informationen?? edit: @Luckie (sorry): Frau des Prgrammierers---Scheffe > Bett > Programmierer sauer > Programmierer will sich rächen usw usw usw Edit: Aber das erzählt man sich nur so.. gerüchteweise... Ich hab Sirius' Code mal mit DBText probiert, und es funzt!! Wichtig dabei ist nur, dass der Name des Labels exakt stimmt, d.h. auch Groß- und Kleinschreibung!! Meine Quick and Dirty Lösung kann ich ja mal anhängen, wenn Interesse daran besteht.. |
AW: Undokumentierter Sendmessage-Befehl
Klar kannst du das verwenden.
(Außerdem gehört alles hier um Forum ![]() Mein Code-Beispiel, mit dem ich das gelernt habe, kam seinerzeit von Hagen: ![]() Veröffentlichen wäre nicht schlecht. Du hast ja wahrscheinlich auch hier und da noch etwas geändert. Aber wie oft, willst du derartig "schmutzige" Tricks noch anwenden. Du brauchst doch sicher mehr als ein TDBText.Caption aus dem anderen Programm. Willst du nicht vielleicht doch schauen, ob du bspw. die SQL-Abfragen mit dem Ressourcen-Hacker rausbekommst. |
AW: Undokumentierter Sendmessage-Befehl
Liste der Anhänge anzeigen (Anzahl: 1)
Also dann:
Aber wiegesagt: Quick'n Dirty..
Delphi-Quellcode:
unit readlabel;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, DBCtrls; const mymsg=WM_User+1; type TSearchtype=(sClassName,sName,sCaption); type PMemory=^TMemory; TMemory=packed record Thread:array[0..1023] of char; Postmessage:function(wnd:hwnd;msg,wparam,lparam:cardinal):bool;stdcall; exitthread:procedure(exitcode:integer);stdcall; getwindowlong:function(wnd:hwnd;index:integer):cardinal;stdcall; watchwnd:hwnd; backwnd:hwnd; backmsg:integer; count:integer; SearchType:TSearchtype; vgl:array[0..31] of char; vgllength:integer; end; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Edit1: TEdit; Edit2: TEdit; Label4: TLabel; Edit3: TEdit; Label1: TLabel; Label2: TLabel; DBText1: TDBText; Button3: TButton; Label3: TLabel; procedure Button2Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure GetMyCaption(var msg:TMessage);message mymsg+1; procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } myhandle:hwnd; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function injectThread(memory:Pmemory):integer; stdcall; var pi,p,pm:ppointer; i,a:integer; c:pchar; left,top,width,height:smallint; same:boolean; wparam,lparam:cardinal; begin wparam:=0; lparam:=0; p:=pointer(memory^.getwindowlong(memory^.watchwnd,gwl_wndproc)+9); pm:=pointer(integer(p^)+16); for a:=0 to pinteger(integer(pm^)+8)^-1 do begin p:=pointer(integer(pm^)+4); p:=pointer(integer(p^)+4*a); pi:=p; p:=pointer(integer(p^)+8); p:=p^; c:=pchar(p); if (pbyte(p)^=memory^.vgllength)or(memory^.SearchType in[sName,sCaption]) then begin if memory^.SearchType=sClassName then inc(c); same:=false; for i:=1 to memory^.vgllength do begin if memory^.vgl[i-1]<>c^ then break; same:=i=memory^.vgllength; inc(c); end; if same then begin dec(memory^.count); if (memory^.count=0)or(memory^.SearchType in [sName,sCaption]) then begin if memory^.SearchType=sCaption then begin p:=pointer(integer(pi^)+$64); wparam:=cardinal(p^); c:=pchar(p^); while c^<>#0 do begin inc(c); inc(lparam); end; inc(memory^.backmsg); end; break; end; end; end; end; memory^.Postmessage(memory^.backwnd,memory^.backmsg,wparam,lparam); result:=0; memory^.exitthread(0); end; procedure endpoint; //ohne Funktion nur zum finden des Address-endes von injcetThread asm nop end; procedure TForm1.Button2Click(Sender: TObject); begin close; end; procedure TForm1.Button1Click(Sender: TObject); var mem:TMemory; lib:THandle; size:integer; process:cardinal; processid:cardinal; procmem:PMemory; tmp:cardinal; threadID:cardinal; thread:THandle; help:string; k:Integer; begin try myhandle:=strtoint(Edit1.Text); except myhandle:=findwindow(nil,PChar(Edit1.Text)); end; if myhandle=0 then exit; mem.backwnd:=self.Handle; mem.backmsg:=mymsg; mem.watchwnd:=myhandle; mem.count:=6; mem.vgl:=''; help:=Edit2.Text; for k:= 0 to Length(Help) do mem.vgl[k-1]:=help[k]; mem.vgllength:=Length(Help); mem.SearchType:=sCaption; size:=integer(@endpoint)-integer(@injectThread); move(injectthread,mem.thread,size); lib:=getmodulehandle('user32.dll'); mem.Postmessage:=getprocaddress(lib,'PostMessageA'); mem.getwindowlong:=getprocaddress(lib,'GetWindowLongA'); lib:=getmodulehandle('kernel32.dll'); mem.exitthread:=getprocaddress(lib,'ExitThread'); getwindowthreadprocessid(myhandle,@processid); process:=openprocess(PROCESS_ALL_ACCESS,false,processid); procmem:=virtualallocex(process,nil,sizeof(Tmemory),MEM_COMMIT,PAGE_EXECUTE_READWRITE); writeprocessmemory(process,procmem,@mem,sizeof(TMemory),tmp); thread:=createremotethread(process,nil,0,@procmem.thread,procmem,0,threadid); waitforsingleobject(thread,infinite); closehandle(thread); virtualfreeex(process,procmem,0,mem_decommit); closehandle(process); end; procedure TForm1.GetMyCaption(var msg:TMessage); var process,processID,tmp:cardinal; s:string; begin if myhandle=0 then exit; getwindowthreadprocessid(myhandle,@processid); process:=openprocess(PROCESS_VM_READ,false,processid); setlength(s,msg.LParam); readprocessmemory(process,pointer(msg.wparam),@s[1],msg.lparam,tmp); closehandle(process); Label4.Caption:= 'Caption von "'+Edit2.Text+'" in Fenster "'+Edit1.Text+'":'; Edit3.Text:=s; end; procedure TForm1.Button3Click(Sender: TObject); begin edit3.Text:=dbtext1.Caption; end; procedure TForm1.FormCreate(Sender: TObject); begin DBText1.Caption:='Test Xaverl'; end; end. |
AW: Undokumentierter Sendmessage-Befehl
TDBText ist zwar von TCustomLabel abgeleitet, aber holt sich den Text aus dem angehängten DataLink.
|
AW: Undokumentierter Sendmessage-Befehl
Zitat:
Ich hab letztes Jahr ne Weltreise gemacht.. Aber da fahr ich nicht mehr hin... :-D |
AW: Undokumentierter Sendmessage-Befehl
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:06 Uhr. |
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