NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Bimbo
Člen
Avatar
Bimbo:5.10.2017 7:40

Zdravím Vás a přejí krasný den ;-)
Muže mi někdo vysvětlit proč to nefunguje?

procedure TForm1.Button1Click(Sender: TObject);
var
  WndHandle : HWND;
  begin
    WndHandle := FindWindow('VCDS',Nil);
  if WndHandle = 0 then
    begin
     ShowMessage('Nenalezeno');
    end
  else
  begin
     ShowMessage('Nalezeno');
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
WndHandle : HWND;
begin
WndHandle := FindWindow('NOTEPAD',Nil);
  if WndHandle = 0 then
    begin
     ShowMessage('Nenalezeno');
    end
  else
  begin
     ShowMessage('Nalezeno');
  end;

VCDS nenalezeno
NOTEPAD nalezeno

Editováno 5.10.2017 7:42
 
Odpovědět
5.10.2017 7:40
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Bimbo
Martin Dráb:5.10.2017 10:56

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

Nahoru Odpovědět
5.10.2017 10:56
2 + 2 = 5 for extremely large values of 2
Avatar
Bimbo
Člen
Avatar
Odpovídá na Martin Dráb
Bimbo:5.10.2017 11:24

Neřeším poznámkový blok, ten to najde.
Nenajde to ten VCDS
Takto nenajde paní ten notepad.
WndHandle := FindWindow(Nil,'NO­TEPAD');
http://www.swissdelphicenter.ch/en/showcode.php?…

 
Nahoru Odpovědět
5.10.2017 11:24
Avatar
Bimbo
Člen
Avatar
Bimbo:5.10.2017 11:41
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č?

 
Nahoru Odpovědět
5.10.2017 11:41
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Bimbo
Martin Dráb:5.10.2017 13:47

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?

Nahoru Odpovědět
5.10.2017 13:47
2 + 2 = 5 for extremely large values of 2
Avatar
Bimbo
Člen
Avatar
Bimbo:5.10.2017 14:00

Je to normální exe program, který má na obrazovce form.
Vrací to "neplatný popisovač okna".

 
Nahoru Odpovědět
5.10.2017 14:00
Avatar
Bimbo
Člen
Avatar
Bimbo:5.10.2017 14:31

Něco dělám špatně nebo jsem to špatně pochopil :-(
Ono mi to funguje jen u toho notepadu.

Když to zkouším na jakýkoliv jiný exe soubor tak to vyhazuje to "neplatný popisovač okna"
Proč?

 
Nahoru Odpovědět
5.10.2017 14:31
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Bimbo
Martin Dráb:5.10.2017 14:55

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.

Nahoru Odpovědět
5.10.2017 14:55
2 + 2 = 5 for extremely large values of 2
Avatar
Bimbo
Člen
Avatar
Bimbo:5.10.2017 15:29

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.

Editováno 5.10.2017 15:32
 
Nahoru Odpovědět
5.10.2017 15:29
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Bimbo
Martin Dráb:5.10.2017 22:27

Pokud to chceš celé automatizovat (a jen případně zadávat řetězce, které chceš přepsat), tak postup je následunící:

  1. Získat handle cílového procesu s oprávněními PROCESS_VM_OPE­RATION, PROCESS_VM_READ, PROCESS_VM_WRITE a PROCESS_QUERY_IN­FORMATION (funkce OpenProcess).
  2. Zjistit, jaké části adresového prostoru procesu jsou tvořeny pamětí, kterou lze číst (VirtualQueryEx).
  3. Postupně tyto oblasti číst (ReadProcessMe­mory) a vyhledávat v nich požadované řetězce.
  4. Nalezené řetězce upravovat (WriteProcessMe­mory... není třeba přes VirtualProtextEx povolovat možnost zápisu, WriteProcessMemory to dělá interně sama).
  5. Po dokončené práci zrušit handle procesu (CloseHandle).
Nahoru Odpovědět
5.10.2017 22:27
2 + 2 = 5 for extremely large values of 2
Avatar
Bimbo
Člen
Avatar
Bimbo:12.10.2017 8:02

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?

Editováno 12.10.2017 8:03
 
Nahoru Odpovědět
12.10.2017 8:02
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Bimbo
Martin Dráb:12.10.2017 17:10

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 :-).

Nahoru Odpovědět
12.10.2017 17:10
2 + 2 = 5 for extremely large values of 2
Avatar
Bimbo
Člen
Avatar
Bimbo:18.10.2017 0:51

Děkují moc, funguje ;-)
Bych měl ještě poslední.
Když bych chtěl v delphi jen nahrát exe program do pamětí, pak ho upravit a pak teprve spustit.
Půjde to?

 
Nahoru Odpovědět
18.10.2017 0:51
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Bimbo
Martin Dráb:18.10.2017 1:29

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 WriteProcessMe­mory 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).

Nahoru Odpovědět
18.10.2017 1:29
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 14 zpráv z 14.