Exigo Opublikowano 21 Sierpnia 2008 Udostępnij Opublikowano 21 Sierpnia 2008 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 Więcej opcji udostępniania...
Pieter Opublikowano 21 Sierpnia 2008 Udostępnij Opublikowano 21 Sierpnia 2008 Pointers, Pointers, Pointers... http://forum.cheatengine.org/viewforum.php?f=14 Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Exigo Opublikowano 22 Sierpnia 2008 Autor Udostępnij Opublikowano 22 Sierpnia 2008 Hm.. poczytałem troszkę na temat tych 'pointerów' i rozumiem tylko zarys... zapewne dlatego, że cienko z anglikiem.. Czy mógł by ktoś to 'objaśnić' ? :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Snake Opublikowano 23 Sierpnia 2008 Udostępnij Opublikowano 23 Sierpnia 2008 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 Więcej opcji udostępniania...
Pieter Opublikowano 23 Sierpnia 2008 Udostępnij Opublikowano 23 Sierpnia 2008 i Reverse Engineering'iem xP i działami spokrewnionymi :P w sumie to nie jest takie trudne ;) podstawy anglika Ci starczą... Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Snake Opublikowano 23 Sierpnia 2008 Udostępnij Opublikowano 23 Sierpnia 2008 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę