pamięć procesu, wskaźnik

0

Czytając proces pewnej gry, gdy postawi się gre lokalną, można odczytać graczy znajdujących się na serwerze. Mój problem polega na tym, że program za każdym razem w innym miejscu w pamięci zapisuje tych graczy i za każdym razem kiedy chce dostać sie do pamięci w poszukiwaniu graczy, musze skanować całą pamięć, co zajmuje ok 3-4 sek. gra na pewno gdzies przechowuje sobie wskaznik do tego miejsca w pamięci,pytanie gdzie ?
czy w tej samej samej pamięci ? i jak to znaleźć ?
printscreen skanu pamięci:

http://img695.imageshack.us/i/skanpamieciw3.jpg/

Czy powinienem w pamieci poszukać wartości 0xD7C0000, gdyż jest to adres początku informacji o graczach ? i zapamiętach gdzie program za każdym razem przechowuje ten adres ? jak to rozwiązać ? czekam na sugestie

0

Jeżeli to wina przydzielania pamięci wirtualnej to robisz proste odejmowanie początkowego adresu kiedy jesteś rozeznanya nowym przydziałem następnie obliczyć adres dodając/odejmując tę wartość od 0xD7C0000.

Inne lepsze rozwiązanie to znalezienie adresu w pamięci (pamiętaj że będzie odwrucony tzn 00 00 C0 D7) ta wartość już powinna być w stałym miejscu zapisywana i odnajdujesz ją jak wyżej napisałem i przechodzisz tam gdzie wskazuje (namiochałem ale chyba się domyślisz :)

0

Pobierz z SysInternals VMMap (http://technet.microsoft.com/pl-pl/sysinternals/dd535533(en-us).aspx) i sprawdź do jakiego obszaru pamięci należy blok, pod którym znajdują się te dane - czy jest to sterta, czy surowy blok pamięci wrtualnej, sprawdź rozmiar bloku, zabezpieczenie stron - dzięki tego typu informacjom powinieneś być w stanie zawęzić obszar przeszukiwanej pamięci...

lord_zero

0

@lord_zero, widać, że to nowy blok sterty. Wypadałoby się danym przyjrzeć i poszukać pointera do nich...

0

pytanie : czy adres 0xD7C0000 to adres bezwzględny czy względny, tzn. czy jest to adres względem początku adresu gry, czy całej pamięci ( dotyczy to zapewne pamięci ram ? )

Poradziłem sobie tak jak napisał Fallen , czyli poszukałem tego odwróconego adresu , dzięki :). Pytanie, dlaczego on jest odwrócony ?

0

Ech, to adres wewnątrz przestrzeni adresowej, taki sam jak wartość zwracana chociażby przez malloc. Na oko to właśnie jakiś nowy blok stery.

http://pl.wikipedia.org/wiki/Kolejność_bajtów#Little_endian - tu masz wytłumaczone dlaczego są odwrotnie.

0

oke, dzięki, dokształciłem się :). A jeszcze jedno pytanko: Czy można wybrać nicki tych graczy z pomocą jakiegoś hooka ( jakiegokolwiek ) , albo przez inject dll ?

0

A nie możesz po prostu użyć ReadProcessMemory? Najpierw odczytujesz pointer, jak ma sensowną wartość (!= NULL) to odczytujesz sobie kolejne nicki/cały blok leżące pod tym adresem (nie chce mi się patrzeć jak to jest zrealizowane).

0

moge i już tak zrobiłem , ale pytam po prostu z ciekawości , bo widziałem inne programy wukorzystujące pliki np. warcraft_hook.dll

0
friko16 napisał(a)

oke, dzięki, dokształciłem się :). A jeszcze jedno pytanko: Czy można wybrać nicki tych graczy z pomocą jakiegoś hooka ( jakiegokolwiek ) , albo przez inject dll ?

zwykly program+readprocessmemory: tak, można
hook ktory np. bedzie kompilowal w/w program .exe uzywajacy R-P-M: tak, mozna
inject ktory np. bedzie rejestrowal w/w hook'a: tak, też mozna
hibernacja komputera+hexeditor+Ty szukajacy recznie nickow w hexach: tak, tak też się da
hibernacja komputera+hexeditor+100trenowanych małp szukajacych nickow w hexach: tak, one też kiedyś to znajdą

wybacz uszczypliwość, ale liczę, że się rozumiemy

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