ReadProcessMemory i dynamiczne adresy

ReadProcessMemory i dynamiczne adresy
NM
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 14 lat
0

Witam. Mam pytanie dla tych, którzy próbowali już coś robić z odczytywaniem adresów pamięci. Wiem, że do odczytania adresów używa się funkcji ReadProcessMemory i ona działa. Jednak problem jest w tym, że obecnie podaje na sztywno adres konkretnej komórki pamięci, a jest on inny na różnych komputerach (podobny, ale inny). Czy można to jakoś inaczej rozwiązać? Adresy wyciągałem programem Cheat Engine, a nie w C++. Będę wdzięczny za pomoc. Pozdrawiam

msm
Administrator
  • Rejestracja:około 16 lat
  • Ostatnio:5 miesięcy
0

Adresy wyciągałem programem Cheat Engine, a nie w C++.

To wyciągaj w C++... Czego być wymagał od funkcji? SetPlayerHealthPointsInProcess?

Jeśli pamięć z komórką której szukasz jest przydzielana dynamicznie to powodzenia. Możesz spróbować znaleźć jakieś miejsce (stałe) gdzie program się do tej komórki odnosi (wątpię żeby się udało coś takiego znaleźć). Możesz spróbować zrobić to co cheat engine tylko w kodzie (ale to nie wypali).

Ogólnie to nie mam pomysłu na jakieś uniwersalne rozwiązanie. Może ktoś inny tutaj ci pomoże...

NM
  • Rejestracja:około 16 lat
  • Ostatnio:ponad 14 lat
0

Ma ktoś inny pomysł?

I przy okazji chciałbym zapytać jak taki adres: char adres[] = "0x00020008"; przystosować do funkcji ReadProcessMemory? Próbowałem różnych sposobów rzutowania (nie jestem pewien czy tak to się nazywa) na void, lpcvoid, ale cały czas źle pokazuje. Mógłby ktoś w tym pomóc?

quetzalcoatl
  • Rejestracja:ponad 18 lat
  • Ostatnio:ponad 6 lat
0

Poczytaj o tym, jak zbudowany jest "obraz procesu" w pamieci, oraz jaka jest ogolna budpowa pliku PE. Odkryjesz, co to sa sekcje/segmenty, w jaki sposob system operacyjny "rozpakowuje" plik exe do jego faktycznej postaci 'pamieciowej', dowiesz sie automatycznie, czemu na roznych komputerach adresy maja_prawo byc, ale nie musza, inne.
Wiedzac to juz, dorzuc do tego fakt, ze zazwyczaj programy nie uzywaja z w/w powodow adresow bezwzglednych, tylko wzgledne - np. liczone wzgledem poczatku jakiegos segmentu. Tak, widzisz to jako 0x1234 ale to jest adr. segmentu 0x1200 plus adres wzgledny 0x34.. a teraz zastanow sie, czy jesli inny system operacyjny na innym komputerze umiesci jakis segment w innym miejscu, to czy adres interesujacego jego kawalka sie zmieni diametralnie, czy bedzie "podobny"? w czym podobny? a adres wzgledny? a na tym innym-komputerze, jak segment dostanie od OS inny-adres-bazowy, to dasz rade jakos znalezc w pamieci ten segment i wykryc jaki jest jego obecny adres?


no to pojechałem z nieobecnością.. chwila przerwy i prawie rok przeleciał
KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:6 miesięcy
  • Postów:2514
0

char adres[] = "0x00020008"; //to jest tekst

DWORD adres = 0x00020008; // to jest liczba


░█░█░█░█░█░█░█░█░█░█░█░
O1
  • Rejestracja:około 18 lat
  • Ostatnio:ponad 12 lat
0
NeMoO napisał(a)

I przy okazji chciałbym zapytać jak taki adres: char adres[] = "0x00020008"; przystosować do funkcji ReadProcessMemory? Próbowałem różnych sposobów rzutowania (nie jestem pewien czy tak to się nazywa) na void, lpcvoid, ale cały czas źle pokazuje. Mógłby ktoś w tym pomóc?
Jeśli nie widzisz różnicy między tekstem a liczbą, to lepiej nie <ort>majstrój</ort> z pamięcią. A jak chcesz to skonwertować to atoi() lub coś pobodnego albo strstream czy jak mu tam. W każdym razie żadne proste rzutowanie tego nie zrobi.

Martwi mnie tylko, żebyś przez takie pomyłki w typach nie wykrzaczył programu w którego pamięci będziesz grzebał...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.