Diskuze: Delphi
Člen
Zobrazeno 14 zpráv z 14.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Pokud hledáš okno podle jeho názvu (titulku), specifikuj jej jako druhý parametr funkce FindWindows. První parametr je interpretován jako třída okna. Čirou náhodou má Poznámkový blok tu třídu takto pojmenovanou.
Viz dokumentace
https://msdn.microsoft.com/…=vs.85).aspx
Neřeším poznámkový blok, ten to najde.
Nenajde to ten VCDS
Takto nenajde paní ten notepad.
WndHandle := FindWindow(Nil,'NOTEPAD');
http://www.swissdelphicenter.ch/en/showcode.php?…
procedure TForm1.Button4Click(Sender: TObject);
var
hWordWindow: HWND;
begin
hWordWindow := FindWindow ('NOTEPAD', nil);
ShowWindow(hWordWindow, SW_HIDE);
Sleep(2000);
ShowWindow(hWordWindow, SW_SHOW);
end;
procedure TForm1.Button5Click(Sender: TObject);
var
hWordWindow: HWND;
begin
hWordWindow := FindWindow ('VCDS', nil);
ShowWindow(hWordWindow, SW_HIDE);
Sleep(2000);
ShowWindow(hWordWindow, SW_SHOW);
end;
Oba dva programy mam spuštěne a v pamětí je vidím.
Notepad jde do hide a ten druhý ne.
Proč?
No a jakou tedy vrací FindWindow v tom negativním případě chybu (GetLastError)? Je to dané okno vlastněno programem s vyššími nebo stejnými právy oproti tomu, který volá FindWIndow?
FindWindow vrací "neplatný popisovač okna", nebo tuto chybu vrací ShowWindows?
A zkoušel jsi hledat i podle titulku okna (což je ten druhý parametr FindWIndow), nejen podle třídy? Jistě, pak to nenajde přímo notepad, protože titulek jeho okna může být různý (závisí mj. na souboru, který je v něm otevřený), a proto jej v tom odkazovaném článku hledají prostě tak, že projdou všechna okna aplikace a dívají se na okna, co v titulku obsahují řetězec notepad.
Vypadá to že se v tom pořádně zaplavávám.
Poradite?
O co mi jde.
Je exe program, spustím ho.
winhex - memory - a najdu si ho a načtu.
Jsou tam řetězce.
Třeba 38-Roof Electronics
Chtěl bych aby můj program tento řetězec vyhledal a přepsal.
Pokud to chceš celé automatizovat (a jen případně zadávat řetězce, které chceš přepsat), tak postup je následunící:
Tak fungovat to funguje.
Ještě by byl dotaz.
Mam 2 verze stejného programu (32 a 64 bit)
U 32 bit je to ok.
U 64 bit mi to nedovolí přepsat.
Důvod je že resource je úplně na jiné adrese a vyhodí mi to system error
code 998 (nepřestupný přístup k paměťovému místu).
Jde to nějak pořešít?
Z 32bitového procesu se rozumně nedá přepisovat paměť 64bitového (opačně to lze). Myslím, že existuje nějaká málo dokumentovaná (pokud vůbec) funkce, jak může 32bitový proces číst paměť 64bitového, ale to je asi tak všechno.
Řešení je jednoduché – prostě budeš mít dvě binárky tvé aplikace, jednu pro 32bitová a jednu pro 64bitová Windows.
Ale nejsem si úplně jistý, zda jsem pochopil, na co se ptáš, je to tak trošku výzva .
Ano. Otázka je, jaké zpravy toho exe souboru máš na mysli (tzn. jak moc bude potřeba v paměti měnit strukturu).
Pokud bys strukturu měnit moc nepotřeboval, můžeš ten soubor namapovat za pomoci OS (tzn. oddře za tebe většinu práce) skrz CreateFile -> CreateFIleMapping se SEC_IMAGE*** --> MapViewOfFile. Pokud budeš chtít měnit oblasti, který jsou mapovány jen pro čtení, tak bude třeba použít VirtualProtect pro změnu oprávnění (stálo by za pokus ale zkusit WriteProcessMemory na tyto oblasti ve vlastním procesu).
Pokud se jedná o větší modifikace, tak si asi budeš muset provést celé načítání toho EXE souboru sám (tzn. většinu úprav, kterou systém dělá, když načítá spustitelný soubor do paměti – protože tyhle soubory vypadají v paměti jinak než na disku).
Zobrazeno 14 zpráv z 14.