Read-process-memory - nawet wujek google nie wie :)

0

Cześć,
Od dawna gnębi mnie to więc postanowiłem się was zapytać :)

Na wstępie powiem, że wiem jak korzystać z funkcji readprocessmemory i szukałem na forum i na google lecz bezskutecznie.

Mój problem polega na tym, że mam sobie pewien program, chcę z niego wyciągnąć pewne dane(string), no więc znajduje sobię adres tsearchem i wrzucam do mojego programu owy adres aby go zczytał. Wszystko jest OK, program czyta co jest pod owym adresem ale... kiedy uruchomie program ponownie (ten z którego chce wyciągnąc dane) i odpalam moj programik napisany w delphi to zwraca mi zupelnie nie to co trzeba. Z tego co zauwazylem to po prostu adres w pamieci programu (ktorego chce zczytac dane) sie ZMIENIŁ (i tak za każdym razem).
Tak więc jak sobie z tym poradzić? jak uzyskać zawsze poprawny adres skoro nie znam jego wartości?

Znalazłem temat na forum z identycznym problemem:
http://4programmers.net/Forum/264417#264417
lecz: odpowiedź misiekd to tylko wykorzystanie funkacji readprocessmemory wiec nic mi to nie da, za to dRum napisal ze adres zawsze bedzie zmienny (co jest nieprawdą bo raz na jakiś czas (lecz bardzo rzadko adres potrafi się powtórzyć)

Pozdrawiam ;)

0

dRum napisał prawidłowo - adres może będzie 'zmienny', co nie jest równoznaczne z zawsze 'różny'. Jeśli pamięć jest dynamicznie alokowana, to nie możesz w kodzie podać adresu jako stałej wartości. Po prostu w konkretnym procesie musisz odnaleźć nowy adres i dopiero zmienić to co pod nim się znajduje.

.. i nie jest tak, że wujek nie wie. Po prostu nie wiesz czego szukasz..

0

pozwolicie ze dolacze do tematu jedno pytanie (zeby nie zasmiecac forum, z reszta ostatnio ktos mnie chyba nie zrozumial i wywalil moj post do kosza :-/ ):
tez wiem jak sie poslugiwac ReadProcessMemory tylko nie jestem pewien czy dobrze robie pewna rzecz:
jesli chce odczytac pamiec calego procesu (pod xp)... to
jako lpBaseAddressdaje pointer(0); ?
a co z iloscia bajtow? nSize na PPROCESS_MEMORY_COUNTERS.WorkingSetSize ?

dzieki
pozdr.

0

szczawik, ale niby na jakiej zasadzie miało by to działać?
Nie znam przeciez wartości wiec skad mam wiedziec gdzie w pamieci programu ukrywaja sie adresy ktore wlasnie chcę wydobyć?

Pozdrawiam

0
kokoszka1 napisał(a)

szczawik, ale niby na jakiej zasadzie miało by to działać?
Nie znam przeciez wartości wiec skad mam wiedziec gdzie w pamieci programu ukrywaja sie adresy ktore wlasnie chcę wydobyć?

Pozdrawiam

..i na tym właśnie polega problem pisania trainerów - bez wiedzy o wewnętrznych strukturach aplikacji, jedną z niewielu możliwości, jaka Ci zostaje, jest znalezienie obecnej wartości, przy jej zmianie upewnienie się, że to na pewno to miejsce w pamięci, a podmiana to już bułka z masłem, jak to się mówi. Inną metodą jest szukanie innej stałej lub znanej wartości, która zawsze występuje w równej odległości od poszukiwanej (często jakieś nagłówki czy inne statystyki, które się rzadko zmieniają).

@cimak_nielog: a zajrzałeś choć na sekundę do dokumentacji? Coś mi się nie wydaje..

0

Może spróbuj poszukać Pointera do Pointera... Jeśli coś znajduje się przykładowo pod adresem $000000FF to zamień Pointer na Integer ($ff=256) i szukaj tego jeszcze raz tego Integera. Integer 256 znajdujesz pod adresem $0000FFFF -> szukasz tego inta ... i tak powtarzasz do skutku aż nic już nie znajdzie (gorzej jeśli znajdzie za dużo). Wtedy bardzo prawdopodobne ze odczytanie powiedzie się jeśli odwrócisz ten schemat. W końcu program też musi wiedzieć gdzie są zmienne, więc gdzieś powinna być ta zmienna której pozycja się nie zmienia. Może źle rozumuję (i jest to bardzo prawdopodobne :p) ale kiedyś udało mi się w ten sposób poszukać coś w procesie Tibii

1 użytkowników online, w tym zalogowanych: 0, gości: 1