Autor Wątek: Game hacking...  (Przeczytany 5951 razy)

Offline Silther

  • Użytkownik

# Marzec 27, 2006, 17:56:18
Wracająd do tej modyfikacji pamięci to najpierw trzeba ją (pamięć) przeszukać. Zainteresowało mnie to więc ja również przeszukałem internet w poszukiwaniu jakiś przydatnych funkcji. Znalazłem tylko to: http://3miasto.net/~chq/c/memview.html, ale ponieważ nie zadowala mnie przedstawiona tam funkcja, postanowiłem się spytać tutaj. Znacie może jakieś funkcje, które umożliwiają przeglądanie pamięci, a później ewentualnie zmianę wartości. Może macie linka do źródeł takiego "podglądacza pamięci".

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline mINA87

  • Użytkownik

# Marzec 27, 2006, 18:46:01
to jest akurat sposób mocno archaiczny i związany z kompilatorem chyba :] Ciebie chyba zainteresuje wykorzystanie WinAPI do tego:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/writeprocessmemory.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/debug/base/readprocessmemory.asp
a tutaj sa funckje zwracające co można odczytwyać:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/perfmon/base/tool_help_functions.asp
sry za brak czegoś konkretniejszego, ale nie mogłem na szybkiego znaleźć ;] może coś znajdę to dam znać.
//edit1:
może to Ci się troszkę przyda:
http://72.14.203.104/search?q=cache:OR-QhzRECXsJ:www.gamehacking.com/(...)

// edit
Proszę nie rozciągać strony długimi odnośnikami.
« Ostatnia zmiana: Marzec 27, 2006, 19:30:20 wysłana przez bies »

Offline Silther

  • Użytkownik

# Marzec 27, 2006, 18:55:58
Dzięki, naprawdę fajne funkcje :D muszę je jeszcze przetestować. Chodziło mi o dokładnmie coś takiego, ale żeby odnosiło się do całej pamięci, a nie pamięci przydzielonej wybranemu procesowi.

Offline mINA87

  • Użytkownik

# Marzec 27, 2006, 19:04:17
to ni dy rydy bo pamięć jest chroniona przez windę i każdy proces ma dostęp tylko do swojej pamięci, chyba że uzyska dostęp do innego procesu z flagami do zapisu/odczytu, wtedy może sobie czytać pamięć.. Wyjątkami bardzo specyficznymi są nakłądki na Dos'a(Win9x) gdzie możesz się zbliżyć do sprzętu na krok i poużywać INT'ów, albo jądro systemu w Windach serii NT, wydaje mi się że w Ring0 można robić co się chce z pamięcią, wyżej pewnie też jest ciekawie..... A tutaj znalazłem genialny przykład, niestety w VB:
http://www.freevbcode.com/ShowCode.Asp?ID=4115

//EDIT:
qrcze, a mnie interesuje jak ustawić hardware breakpoint'a na adres, z poziomu przyziemnego... Nic ciekawego nie znalazłem :/ A procki Microsoftu do debugowania umożliwiają co nieco, ale po wysłaniu komunikatów z programu debugowanego, więc lipa :/
« Ostatnia zmiana: Marzec 27, 2006, 19:07:34 wysłana przez mINA87 »

Offline Silther

  • Użytkownik

# Marzec 27, 2006, 19:06:50
Kiedyś widziałem skaner całej pamięci w asmi'e, ale nie znam się na łączeniu tych języków, więc nie chcę tego robić, ale skoro asm może, to czemu c++ ma być ograniczany ?

Offline mINA87

  • Użytkownik

# Marzec 27, 2006, 19:12:16
Ale na jaki sprzęt i/lub system to jest! Możesz w C++ uzyskać dostęp do dowolnego fragmentu pamięci, ale taki kod spowoduje wystąpienie blędu - Windows nie pozwala procesowi na zapis do fragmentów pamięci do niego nie należących.. Taki zapis to niemal na 100% niepoprawne działanie programu - lewy wskaźnik or sth. Jeśli by pozwolił na zapis gdziekolwiek, to ja niechciałbym pracować w takim systemie... Głupi WinAMP mógłby Ci tak rozwalić pamięć że masakra ;]

Offline Silther

  • Użytkownik

# Marzec 27, 2006, 19:27:27
Tamten program w asmie działał mi pod XP'kiem. Po prostu odczytywał podany zakres adresów w pamięci, a następnie zapisywał je do pliku.
 
Cytuj
Możesz w C++ uzyskać dostęp do dowolnego fragmentu pamięci, ale taki kod spowoduje wystąpienie blędu
O tym przekonałem się już dawno - napisałem programik, który najpierw prosił użytkownika o podanie adresu w pamięci, a następnie tworzył wskaźnik do tego adresu i wypisywał (czysto teoretycznie bo na prawde nigdy nie wypisał ;D) wartość ze wskazanego miejsca na ekranie... Oczywiście program za każdym razem mi się rozkraczał :D. Doświadczalnie dowiedziałem się, że Window$ ogramicza mi dostęp do pamięci.

Offline mINA87

  • Użytkownik

# Marzec 27, 2006, 19:30:38
wow.... jak masz gdzies taki link to zapodaj, ale pewnie gdzieś tu jest jakiś haczyk ;]

Offline Silther

  • Użytkownik

# Marzec 27, 2006, 19:31:48
Link do czego?

Offline mINA87

  • Użytkownik

# Marzec 27, 2006, 19:35:56
czt się zaczyna robić, ale przynajmniej w temacie :]
no piszesz o jakimś źródle w ASM'ie, które umożliwiało *dowolne* odczytywanie pamięci pod XP, więc proszę Cię abyś się takim czymś pochwalił ^^ bo mnie to troszke zaintrygowało i zastnawiam się czy Ten programik:
- czyta swoja pamiec
- czyta czyjas pamiec w/g standardow M$
- czyta pamiec wszytskich w/g standardow M$
- czyta pamiec jak chce bo olał standardy M$ i dostał się na jakiś Ring0 czy coś w tym stylu ;]

Offline shyha

  • Użytkownik
    • Shyha@Flickr

# Marzec 27, 2006, 20:20:18
Doświadczalnie dowiedziałem się, że Window$ ogramicza mi dostęp do pamięci.

Tak na prawdę to pewnie nie jest Windows tylko sam procesor :) W końcu do tego sa, między innymi, deskryptory :)

Offline Silther

  • Użytkownik

# Marzec 30, 2006, 19:09:03
Sorki, że to tyle trwało, ale musiałem znaleźć to w sieci. Ściągnij sobie kurs asma offline by Grzegorz Złotowicz z jakiejś strony o asmie (nie znalazłem onlinowego). Tam jest kod źródłowy programiku o wymownej nazwie "Zapisywanie na dysk pierwszego MB pamięci" (albo coś w tym stylu, nie pamiętam  :P) Żeby rozszerzyć zakres zapisywanej pamięci wystarczało zmienić jedną liczbę w kodzie.

Offline shyha

  • Użytkownik
    • Shyha@Flickr

# Marzec 30, 2006, 19:45:36
W win32 na jądrze NT ?

Offline Silther

  • Użytkownik

# Marzec 30, 2006, 19:50:52
Cytuj
W win32 na jądrze NT ?
Działało pod XP'kiem.

Mam nadzieję, że twórca (ani moderatorzy) nie będzie miał nic przeciwko temu, żebym umieścił tu kod z kursu (zachowałem komentarze), ot on:
;Zapis pierwszego MB pamieci do pliku na dysk
;
;
 ;Przykladowy program z pakietu
;"Kurs podstaw assemblera" by Grzegorz Zlotowicz
;
;Linie zaczynajace sie znakiem ; sa ignorowane przy kompilacji.
cseg segment
assume cs:cseg, ds:cseg, es:cseg
org 100h
start:
  mov ah,3ch
  xor cx,cx     ; najprostsze wyzerowanie rejestru
  lea dx,nazwa  ;to samo co mov dx,offset(nazwa)
  int 21h       ;utworzenie pliku - zob. opis przerwania 21h
  xchg ax,bx    ;do pozostalych funkcji operacji na plikach, bx=uchwyt
                ;xchg - zamiana wartosci rejestrow
  xor ax,ax     ;w zasadzie nie wiem, czy jest to niezbedne, ale niech zostanie
mov ds,ax       ;teraz ds=zerowy segment pamieci
  mov cx,8000h  ;dlugosc polowki segmentu
  xor dx,dx     ;zerujemy dx - funkcja 40h/int21h wymaga podania
                ;wskaznika bufora jako
                ;ds:dx; bedziemy wiec zapisywac bufor
                ;dlugosci 8000h (32768) zaczynajac
                ;od adresu ds:0.
petla:
  mov ah,40h
  int 21h       ;Funkcja: zapis do pliku
  mov ax,ds
  cmp ax,0f800h ; koniec pamieci?
  je koniecp
  add ax,800h   ;zwiekszamy ax o 2048 paragrafow
  mov ds,ax     ;i uaktualniamy rejestr ds
  jmp petla     ;powtarzamy petle
koniecp:
  mov ah,3eh    ;standardowe zamkniecie pliku
  int 21h

  mov ax,4c00h  ;wyjscie
  int 21h
nazwa db 'pamiec.map',0

cseg ends
end start

;---
;Jesli masz jakies pytania/uwagi/propozycje,
;to nie zwlekaj  i pisz smialo:) na adres
;e-mail: grzezlo@wanet.pl
;Dzieki z gory!
;
;Z powazaniem - Grzegorz Zlotowicz
« Ostatnia zmiana: Marzec 30, 2006, 20:05:48 wysłana przez Czomolungma »

Offline shyha

  • Użytkownik
    • Shyha@Flickr

# Marzec 30, 2006, 20:56:51
No :) Tak jak się wszyscy spodziewali :)

To nie jest fizyczny pierwszy megabajt pamięci. Zrobisz zrzut pamięci swojego procesu tylko.