Hledání hodnoty v paměti procesu – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Hledání hodnoty v paměti procesu – .NET – Fórum – Programujte.comHledání hodnoty v paměti procesu – .NET – Fórum – Programujte.com

 

ingiraxo+15
Grafoman
13. 10. 2012   #1
-
0
-

Caf,

mám takový problém a nějak nevim jak to přesně vyřešit... jde o to, že skenuju pamět procesu, ale rychlost je uplně nesnesitelná... když hledám hodnotu přes CheatEngine, tak to je během snad 2s a u mě to je v řádech několika minut (možná i desítek)...

Takže by mě zajímalo jak na to no :)

hledám pole byte např. (0x10, 0x20, 0x00, 0x00) čili integer z rozmezí paměti 0x400000 až 0xFFFFFFFE

procházím to vlastně byte po bytu (snad rozumíte - posunuju 4byte po 1byte dopředu) =)

PS: zkoušel jsem i odfiltrovat sektory, který jsou třeba jen pro čtení nebo tam nemám opravnění, abych to urychlil, ale výsledek skoro žádnej :/

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
zlz
~ Anonymní uživatel
634 příspěvků
14. 10. 2012   #2
-
0
-

Každé čtení paměti jiného procesu má dost velkou režiji. Kolik toho načítaj najednou? Načti vždycky co největší kus paměti k sobě a až pak ho prohledávej. A jak filtruješ ty "sektory"? Nejdřív zjisti rozsahy, které má ten proces namapované a jen ty čti.

Nahlásit jako SPAM
IP: 80.188.216.–
ingiraxo+15
Grafoman
14. 10. 2012   #3
-
0
-

#2 zlz
z počátku, když jsem psal ten topic, tak jsem byl trochu brutální, že jsem četl pamět vždy po každým posunu.. dneska v noci mě něco osvítilo, že jsem začal číst po segmentech, takže čtu po 32768, značně se to zrychlilo, ale stále to je několik sekund (v CheatEnginu to je během 1s - úplně to samí co vyhledávám já)

a filtruju to potom až ke konci, páč jsem zjistil, že to nejde dělat v druhým cyklu, kterej prochází každej segment zvlášt.. jinak to dělám přes VirtualQueryEx, kterej mi vrací info o adrese v paměti - filtruju pouze READWRITE

rozsahy, který má namapovaný? to jde zjistit? já vždy procházím od 0x400000 do 0x7FFFFFFF

další věcí je, že počet adres který najdu v CheatEngine je odlišnej než z mého skenu... hlavně pokud nastavim velkej segment pro čtení z paměti, tak se mi některý adresy vynechaj a nevim proč (pomocí modula si zjištuju zbytek, kterej ke konci cyklu projdu zvlášť)

Můj cíl je, abych se aspoň přiblížil rychlosti hledání jako má CheatEngine, zatim to mám stále pomalejší asi o 4-5s při stejným hledání hodnoty - a to nepočitám ten fakt, že počet výsledků je v obou případech jinej :(

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
ingiraxo+15
Grafoman
14. 10. 2012   #4
-
0
-

no výborně.. v cheatengine 2 výsledky a já mám i s filtrem na READWRITE 12075 výsledků.. myslim, že potřebuju pomoct =D

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
ingiraxo+15
Grafoman
14. 10. 2012   #5
-
0
-

Kdyžtak přikládám aktuální alg. pro vyhledání pole bytů v paměti.. je to na 2 věci, vůbec mi výsledky neodpovídaj jako v CE :(

begin - počáteční pamět (0x400000)
end - konečná (0x7FFFFFFF)
data - pole bytů, který se mají hledat (např. 0x10, 0x20, 0x00, 0x00) (int)

Objekt MemoryBlock jen obsahuje adresu jako IntPtr a byte[] na té adrese

        public List<MemoryBlock> Scan(int begin, int end, params byte[] data)
        {
            List<MemoryBlock> addresses = new List<MemoryBlock>();

            if (data != null && data.Length > 0 && end > begin + data.Length)
            {
                // velikost paměti, která se má procházet
                int memorySize = end - begin;
                // zjistí velikost segmentu podle velikosti vstupních dat
                int segment = MEM_SEGMENT_SIZE; // 20480 (po jakých částech se má číst pamět)

                DateTime start = DateTime.Now; // pouze pro měření času

                if (memorySize >= segment)
                {
                    // počet hlavních cyklů, pro získání bloku paměti
                    int loops = memorySize / segment;
                    // velikost paměti, která se projde ke konci (zbytek segmentu)
                    int restMemorySize = memorySize % segment;
                    // rozdíl počáteční velikosti ve všech cyklech krom prvního
                    int dataLength = data.Length - 1;
                    // počáteční adresa
                    int address = begin;
                    // buffer pro přečtené byty
                    byte[] buffer;
                    // kolik bytů se přečetlo
                    int read;

                    // hlavní cyklus pro čtení segmentů paměti
                    for (int i = 0; i < loops; i++)
                    {
                        if (Read(address, segment, out buffer, out read) && read > 0)
                        {
                            Parallel.For(0, buffer.Length - dataLength, j =>
                            {
                                // porovná byte po bytu
                                if (CompareBytes(data, buffer, j))
                                {
                                    addresses.Add(new MemoryBlock(address + j, data));
                                    Console.WriteLine("SCAN: " + addresses[addresses.Count - 1]);
                                }
                            });
                        }
                        address += ((buffer == null) ? segment : buffer.Length) - dataLength;
                        segment = MEM_SEGMENT_SIZE + dataLength;
                    }
                    // projde zbývající paměť
                    if (restMemorySize > 0)
                    {
                        if (Read(address, end - address, out buffer, out read) && read > 0)
                        {
                            Parallel.For(0, buffer.Length - dataLength, j =>
                            {
                                // porovná byte po bytu
                                if (CompareBytes(data, buffer, j))
                                {
                                    addresses.Add(new MemoryBlock(address + j, data));
                                    Console.WriteLine(addresses[addresses.Count - 1]);
                                }
                            });
                        }
                    }
                    Filter(hProcess, addresses, PageProtect.PAGE_READWRITE);
                }
                TimeSpan endl = new TimeSpan(DateTime.Now.Ticks - start.Ticks);
                addresses.ForEach(m => { Console.WriteLine("OUT: " + m); });
                Console.WriteLine("COUNT: " + addresses.Count + " -> " + endl);
            }
            return addresses;
        }

Budu rád za každou pomoc.. klidně raďte i jak by to bylo v c++ (nemám problém to upravit do c#)

hlavní problém je, že výsledky neodpovídaj jako jsou v CE a rychlost hledání je strasně velká.. v CE to je tak 1s a tady několik (kolem 8s asi při stejným hledání)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
liborb
~ Redaktor
+18
Guru
15. 10. 2012   #6
-
0
-

K té rychlosti ... možná by stálo za to zkusit, jak dlouho trvá jen samotné načítání bez porovnávání. Dále k porovnávání ... vlastně ti stačí na zjištění, jestli to má cenu opravdu zkoušet testovat, otestovat jen jeden bajt z těch 4 (dle uložení intu v paměti) a pouze pokud souhlasí, tak zjišťovat podrobněji. Nevím, jak je implementována CompareBytes, ale režije jejího volání by mohla být veliká.

Nahlásit jako SPAM
IP: 188.75.135.–
ingiraxo+15
Grafoman
15. 10. 2012   #7
-
0
-

#6 liborb
vše jsem testoval, compareBytes sice něco žere, ale je to nutný zlo... ten mám dobře optimalizovanej, protože se nejčastěji používá - jakmile 1 byte nesouhlasi vrací false

ale já už to předělávám do c++ kde neprocházím nějakej můj blok paměti ale rovnou celej region stejných bytů, takže rychlost je skoro srovnatelná a CE a hlavně mám stejný vysledky.. ale stale resim jak to jeste zrychlit

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 36 hostů

Podobná vlákna

Hledaní hodnoty v range. — založil Frantisek Rad

Historie procesů PC — založil xeonikx

Pozastavení procesů — založil dragon124

Synchronizace procesu — založil _Dudo_

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý