Skocz do zawartości

Dynamiczna alokacja pamięci...


Exigo

Rekomendowane odpowiedzi

Czy istnieje jakiś sposób aby 'zneutralizować' lub ominąć dynamiczną alokację pamięci? Bowiem używam program Cheat Engine do wyszukiwania adresów w rożnych grach. Niestety adresy te zmieniają się po restarcie aplikacji... czy istnieje jakiś sposób, żebym nie musiał za każdym razem szukać ich od nowa?

 

PS: Jeśli możecie, powiedzcie, do czego jest to coś jak dynamiczna alokacja pamięci, bo jak narazie to tylko sprawia kłopoty. :P

Odnośnik do komentarza
Udostępnij na innych stronach

Jak pozbyć się problemów z DMA ? Hmm... czasami wystarczy, że znajdziesz tylko adres wskaźnika do wartości w pamięci i odczytasz wartość, mniej więcej tak:

GML
// wskaznik na adres w ktorym znajduje sie adres wartosci (np. attack speed)

AttackSpeedPointer = $1234ABCD;

// odczyta adres wartosci (np. attack speed)

AttackSpeedAddress = process_read_long( process, AttackSpeedPointer );

// odczyta wartosc

AttackSpeed = process_read_long( process, AttackSpeedAddress );

czasami musisz dowiedzieć się, jaki jest wskaźnik by go znaleźć, bo adres wartości jest odczytywany z dodanym offsetem do wskaźnika tzn. przykładowo:

Adres jakiejś wartości to 0x00100050, ale wskaźnika nie możesz znaleźć w pamięci, bo adres jest obliczany z offsetem, więc prawidłowym wskaźnikiem może być 0x00100000 i trzeba wtedy do niego dodawać 0x50 by dostać się do wartości.

Tylko jak to znaleźć ? Niektóre edytory pamięci mają jakieś opcje dzięki którym można znaleźć ten prawidłowy wskaźnik (oczywiście najczęściej nie wyskoczy Ci jeden adres tylko ok. >= 1000 ), ale o wiele lepszym sposobem jest podejrzenie tego w debugerze (podstawy asemblera wymagane).

W najgorszym wypadku będzie trzeba szukać całych łańcuchów wskaźników czyli wskaźniki na wskaźniki które wskazują kolejne wskaźniki (czasami trzeba dodać offsety), aż w końcu dojdziesz do adresu struktury/wartości ;D (czasami potrzeba większej znajomości asemblera). Ogólnie róźnie z tym bywa...

 

A dynamiczna alokacja pamięci to dynamiczna alokacja pamięci. (pamięć jest alokowana w trakcie działania gry/programu, dlatego przydzielane są różne regiony pamięci...)

 

BTW: Apostrof != cudzysłów.

 

cienko z anglikiem..

więc ciężko będzie z gamehackingiem...

Odnośnik do komentarza
Udostępnij na innych stronach

I masz tu przykład ominięcia DMA :D Ten skrypt wyświetla wartości wszystkich zmiennych globalnych typu real (czy tam double) i ich adresy z wybranej gry GM7 (procesu) ;p

GlobalVarStructPtr to adres wskaźnika na strukturę listy zmiennych, w której można znaleźć adres do ilości zmiennych globalnych (offset: 0x08h) i wskaźnik do adresu tablicy zmiennych globalnych (offset: 0x04h), w której pierwszy element przesunięty jest o +0x10h ;p

GML
// Inicjacja

init_xtend();

process = process_id_from_name( get_string( "Nazwa procesu ? (gra GM7)", filename_name( parameter_string( 0 ) ) ) );

if ( process == 0 ) {

show_message( 'Nie znaleziono procesu' );

game_end();

}

 

// Adres (stały!) struktury obiektu listy zmiennych globalnych (?)

GlobalVarStructPtr = $589720;

 

// ** liczba zmiennych globalnych ** //

// Odczytaj adres w ktorym znajduje sie ilosc zmiennych globalnych:

GlobalVarNumAddr = process_read_long( process, GlobalVarStructPtr ) + $8; // + offset 0x08h

// Odczytaj ilosc zmiennych:

GlobalVarNum = process_read_long( process, GlobalVarNumAddr );

 

// ** Adres tablicy zmiennych globalnych ** //

// Odczytaj wskaznik do adresu tablicy zmiennych globalnych:

GlobalVarPtr = process_read_long( process, GlobalVarStructPtr ) + $4; // + offset 0x04h

// Odczytaj adres tablicy zmiennych globalnych:

GlobalVarTableAddr = process_read_long( process, GlobalVarPtr ) + $10; // + offset 0x10h

// odczytywanie i wyswietlanie zmiennych globalnych (tylko real)

var CurrentGlobalVal;

for (i = 0; i < GlobalVarNum; i += 1) {

// Pobieranie wartosci z tablicy obiektow (?) zmiennych globalnych (rozmiar elementu: 0x28h)

CurrentGlobalVal = process_read_double( process, GlobalVarTableAddr + i * $28 );

// wyswietlanie listy zmiennych i ich wartosci

draw_text( 10, 10 + i * 15, 'Globalna ' + string( i ) + ': ' + string( CurrentGlobalVal ) +

' (' + real_to_hex( GlobalVarTableAddr + i * $28, 8 ) + ')' );

}

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...