ReadProcessMemory i dynamiczne adresy

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

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

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?

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?

0

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

DWORD adres = 0x00020008; // to jest liczba

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! 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ł...

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