ollydbg - jak szukać jakichkolwiek pointerów?

0

Witam. Nie wiem czy w dobrym dziale pisze, chodzi mi o wyszukiwanie o jakichkolwiek pointerów. Nie chodzi mi tu o dokładne szukanie tego lub tego..

Znalazłem taki programik zwany "ollydbg", lecz nie mam pojęcia jak nim znaleźć dowolne (ale działające) pointery dla podanego jakiegoś adresu pamięci. Dlatego zwracam się do was z tym. Tutorialów z moim wybrykiem nie znalazłem :(

0

Możesz jaśniej? Chyba nie rozumiem do czego zmierzasz.

0

Są adresy i pointery, prawda? No więc potrzebuje do pewnego adresu pamięci pointera. Czy da się znaleźć jakikolwiek pointer do adresu? Powiedzmy np.

Wpisuje Adres jakiś, naciskam "Szukaj pointery" i po chwili pokazują mi się wszystkie pointery należące do tego podanego adresu. Da się tak, lub coś w ten deseń ?

0

Naciskasz na okno hexdump, potem ctrl+g wpisujesz adres stawiasz breakpoint na dostep do pamieci lub zapis i naciskasz animate trace into.

Innego patentu nie znam, ale moze ktos zna prostszy.

0

Nie rozumiesz chyba, technicznie coś takiego jak pointer nie istnieje, to zwykła liczba. Chcesz pointer wskazujący na coś to po prostu wyszukujesz tą wartość, pamiętając oczywiście o little-endian. Wyszukanie wszystkiego, co może być użyte jako pointer do dostępnej strony pamięci już by skryptu wymagało.

0

@t0m_k, po jakiego grzyba trace? Nie rozumiem koncepcji...

0

Koncepcja taka, zeby ruszyl program, ale moze tez run nacisnac. Dziwnie pomyslalem, ale tak juz czasami mam, ze inne pomysly mi przychodza do glowy niz normalne.

0

Świętowit, a jeśli się nie zna wartości?

0

To co chcesz wyszukać?

0

Risen - czy Ty przypadkiem nie poszukujesz pointerow wskazujacych na interesujace wartosci w jakiejs grze/programie? Liczysz, ze uda Ci sie wylistowac pointery na wszystkie wartosci typu np zycie, hajs itp przy pomocy jednej magicznej sztuczki? O to Co chodzilo(nie ukrywam, ze czesciowow zgaduje)? Imho raczej moze byc ciezko z jednego bardzo prostego powodu - 00414243h to moze wskaznik na costam, rownie dobrze mozna to potraktowac jako liczbe, ciag znakow albo wiele innych rzeczy. Wszystko zalezy od interpretacji....

0

Cyriel, dobrze myślisz, o to mi chodzi.. Tyle, że wartości na ogół widoczne łatwo znaleźć, a te powiedzmy np. zmiana broni lub podobne nie bardzo:/ Jak to zrobić, bo to co ty napisałeś niewiele zrozumiałem, ale widze, że rozwiązanie to to nie jest :( Więc w jaki sposób wyciągnąć pointer, który bardzo ciężko znaleźć nie znając wartości ?

0

Jezeli chodzi Ci konkretnie o gry i nie masz zbyt wielkiej wiedzy w tym temacie(tak przynajmniej mozna wywnioskowac z tego tematu) to sciagnij sobie magic trainer creator albo poszukaj nowszej generacji podobnego softu(nie wiem czy w ogole mtc jest jeszcze rozwiajny, dziala na win 7/vista i ogolnie za wiele o nim nie wiem).

0

magic trainer creator jest do tworzenia hacków. W tej dziedzinie doszedłem praktycznie do perfekcji. Trainery robię w c-sharpie, problem w tym, że mam problemy ze znalezieniem pointerów lub adresów do nie znanej mi wartości. Tylko to stoi mi na przeszkodzie. Zna ktoś się na tym? Helppp

0

Chodzi o jakas konkretna gre czy o oglny sposob postepowania?

0

Zacznijmy od podstaw:

  • dla procesora nie istnieje podział na kod i dane;
  • dla procesora nie istnieje podział na liczby i wskaźniki;
  • adres to zwyczajna liczba;
  • nie ma rozróżnienia pomiędzy różnymi typami danych, wszystkie to po prostu ciąg bajtów, ich interpretacja zależy od użycia;
  • 0x29A to równie dobrze offset na pierwszej stronie co liczba całkowita tak ze znakiem jak i bez;

Od teorii przejdźmy do konkretów, przykład z mojej obecnej sesji LiveKD:

kd> u . .+8

LiveKdD+0x2f7d:
bac05f7d eb30 jmp LiveKdD+0x2faf (bac05faf)
bac05f7f 8b4108 mov eax,dword ptr [ecx+8]
bac05f82 8b4028 mov eax,dword ptr [eax+28h]

To samo w nieco bardziej przystępny sposób z punktu widzenia danych (co prawda wyżej widać wartości opkodów):

```bash
kd> db . L8
bac05f7d eb 30 8b 41 08 8b 40 28 .0.A..@( ``` Co my tu widzimy? Ważniejsze w sumie co może widzieć procesor w tym obszarze. Widzi, zależnie od interpretacji, zależnie od aktualnie wykonywanej instrukcji, potencjalnie: 3 instrukcje (zakładając, że bierzemy od początku, inne przypadki tutaj pominiemy);</li> 8 bajtów: eb 30 8b 41 08 8b 40 28;</li> 4 wordy patrząc od początku: 30eb 418b 8b08 2840;</li> ...jeszcze łącznie 3 inne, przy przesunięciu o jeden: 8b30 0841 408b;</li> 2 dwordy: 418b30eb 28408b08;</li> ...i jeszcze łącznie 3 inne, przy kolejnych przesunięciach: 08418b30 8b08418b 408b0841;</li> 2 32-bitowe wskaźniki: 418b30eb 28408b08 (tak, nawet jeżeli aktualnie pod danym adresem nie ma dostępnej strony to nadal można tę wartość jako wskaźnik interpretować);</li> ...i jeszcze łącznie 3 inne, przy kolejnych przesunięciach: 08418b30 8b08418b 408b0841;</li> 2 floaty: 17.398886 1.0688289e-014;</li> ...i jeszcze łącznie 3 inne, przy kolejnych przesunięciach: 5.8242439e-034 -2.6241956e-032 4.3447576</li> double o wartości 8.39708244528e-115;</li> </ul>

...i mam wrażenie, że jeszcze o czymś zapomniałem.

Ledwo osiem bajtów a ile możliwości, prawda? Już rozumiesz, że nie ma czegoś takiego jak wskaźnik (przynajmniej bezpośrednio), nie ma wyszukiwania wskaźników? Tym bardziej nie ma szukania wskaźników do 'nieznanych wartości'. Albo wiesz gdzie coś leży i szukasz miejsca, gdzie znajduje się wskaźnik na te dane albo analizujesz kod.

Może teraz przemyślisz sprawę jeszcze raz i jakoś jaśniej sformułujesz problem? Naprawdę nie wiem jak do tego podejść.

0

Mamy powiedzmy grę strzelankę naprzykład. Gdy widać wizualnie jakąś wartość, to bardzo łatwo znaleźć adres statyczny i pointer do niego. No ale np. chcę sobie czołg stworzyć lub podobnych tego typu rzeczy, w których nie widać wartości wizualnie.. O to mi się ciągle rozchodzi..

Lub chcesz dodać se nową broń, a ta broń nie ma wizualnej wartości. Wizualnymi wartościami jest amunicja w tej broni, ale wiadome tym nie dodasz sobie broni :(

Chyba teraz zrozumieliście.

Tak wiem, adresy i pointery to są zwykłe liczby :) Z bytów na int można uzyskać

0

sam chciałbym się co nieco dowiedzieć o tym ;)
Wiem tyle, że w cheat engine znająć wartość (np. 4550 HP) to sobie wpisujesz ją, skanujesz, następnie zbijasz HP np. o 100 i znowu skanujesz i tak dalej, aż zostanie jeden adres. Niestety ten adres często po restarcie gry się zmienia (w niektórych grach spisywałem tak adresy po restartach i uzyskałem bardzo mały przedział adresów, bo zmieniały się np. dwa znaczki, czy jeden od 0 do F..., ale pointera nie widziałem jak szukać). Ale ponoć ty wiesz jak go znaleźć mając adres? :P napiszesz mi coś o tym?

A i swoją drogą kiedyś szukałem adresów np. do zooma broni (snajperka, czy coś) to na oko założyłem, że 0 to brak zooma, a 1 to zoom (albo 1 i 2) i skanowałem, czasem wybierałem opcję "wartość nie zmienila się wcale" po to, by wywaliło mi zbędne adresy i tak w końcu dochodziłem do adresu zooma (kwestia z 3 minut szukania)

Jak możesz to napisz mi jak te pointery szukać jak znam wartość i adres, z góry dzięki

0

mogę, podaj na PW swoje gg.

Ta snajperka co powiedziałeś wiele mi nie pomogła xD

0

Temat z lekka ucichł. Refresh. Pomocy z tym szukaniem :(

0
risen napisał(a)

problem w tym, że mam problemy ze znalezieniem pointerów lub adresów do nie znanej mi wartości.

Przed pójściem spać dla przypomnienia sobie ctypes napisałem mały skrypt w Pythonie:

from ctypes import *
from sys    import stdout, stderr, argv

MEM_COMMIT                              = 0x1000

PAGE_NOACCESS                           = 0x0001
PAGE_GUARD                              = 0x0100

PROCESS_VM_READ                         = 0x0010
PROCESS_QUERY_INFORMATION               = 0x0400

class MEMORY_BASIC_INFORMATION(Structure):
    _fields_ = [
        ('BaseAddress',                 c_ulong),
        ('AllocationBase',              c_ulong),
        ('AllocationProtect',           c_ulong),
        ('RegionSize',                  c_ulong),
        ('State',                       c_ulong),
        ('Protect',                     c_ulong),
        ('Type',                        c_ulong) ]

class SYSTEM_INFO(Structure):
    _fields_ = [
        ('unused1',                     c_ulong * 2),
        ('lpMinimumApplicationAddress', c_ulong),
        ('lpMaximumApplicationAddress', c_ulong),
        ('unused2',                     c_ulong * 5) ]

K32 = windll.kernel32
CRT = cdll.msvcrt

def enumMemoryBlocks(hProcess):
    blocks = []
        
    systemInfo = SYSTEM_INFO()
    K32.GetSystemInfo(byref(systemInfo))

    currentPtr = systemInfo.lpMinimumApplicationAddress

    while currentPtr < systemInfo.lpMaximumApplicationAddress:
        memoryInfo = MEMORY_BASIC_INFORMATION()

        if not K32.VirtualQueryEx(hProcess, currentPtr, byref(memoryInfo), sizeof(memoryInfo)):
            raise RuntimeError('VirtualQueryEx failed!')

        if memoryInfo.State == MEM_COMMIT:
            if memoryInfo.Protect & (PAGE_GUARD | PAGE_NOACCESS) == 0:
                blocks.append(memoryInfo)

        currentPtr += memoryInfo.RegionSize

    return blocks

def isValidPtr(ptr, blocks):
    return any(b.AllocationBase <= ptr < b.BaseAddress + b.RegionSize for b in blocks)

def findPtrs(hProcess, blocks):
    ptrsTab = []

    for n, b in enumerate(blocks):
        buff = CRT.malloc(b.RegionSize)

        stderr.write('\rscanning [%d/%d]... ' % (n + 1, len(blocks)))
        stderr.flush()

        if not buff:
            raise RuntimeError('Malloc failed!')

        if not K32.ReadProcessMemory(hProcess, b.BaseAddress, buff, b.RegionSize, None):
            raise RuntimeError('ReadProcessMemory failed!')

        for o in range(b.RegionSize + 1 - sizeof(c_ulong)):
            if isValidPtr(cast(buff + o, POINTER(c_ulong))[0], blocks):
                ptrsTab.append(buff + o)
    
        CRT.free(buff)

    stderr.write('\rscanning compleated!\n')
    stderr.flush()

    return ptrsTab

if __name__ == '__main__':
    import psyco; psyco.full()

    hProc = None

    if len(argv) > 1:
        hProc = K32.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, False, int(argv[1]))

        if hProc == -1:
            raise RuntimeError('OpenProcess failed!')
    else:
        hProc = K32.GetCurrentProcess()

    blocks = enumMemoryBlocks(hProc)
    ptrs   = findPtrs(hProc, blocks)

    for p in ptrs:
        stdout.write('potential pointer detected: %08lx\n' % p)

    stdout.write('\nsummary: %d pointers detected.\n' % len(ptrs))
    stdout.flush()

    K32.CloseHandle(hProc)

Wersja bez Psyco jakieś 4 godziny mieliła suspendnięty Notatnik na VM, ile skompilowana to jeszcze nie wiem. Przegląda tylko dostępne bloki pamięci, bez ochrony, wyszukuje coś, co można za wskaźnik uznać, jeżeli wskazuje pod jeden z takich obszarów. O ile się nie machnąłem to znalazł prawie 900000 rzeczy mogących być 'pointerami do nieznanych wartości'.

risen napisał(a)

No ale np. chcę sobie czołg stworzyć lub podobnych tego typu rzeczy, w których nie widać wartości wizualnie.. O to mi się ciągle rozchodzi..

No to teraz już wiemy, że nawet normalnej gry 'z czołgami' napisać nie potrafisz. Jest jakiś uniwersalny sposób opisu czołgów? Znasz strukturę obiektu reprezentującego czołg? Menadżera obiektów? Nie. Obiekt może nawet nie być przez nic wskazywany (może być częścią czegoś większego lub np. siedzieć w tablicy). Tutaj nie ma durnego wyszukiwania wartości na pałę, jest analiza danych gry lub binarki. W pierwszym wypadku to nic wielkiego, dowiedz się jak wygląda tworzenie modów do gier. W drugim - dowiedz się co to reverse engineering i zapomnij, najpiew naucz się normalnego programowania.

0

Umiem programować. Gdybym nie umiał, nie startował bym robić trainery. Tak w ogóle już zrobiłem kilka (znając adresy + pointery). Chyba nie jestem zmuszony uczyć się struktur pamięci itp. (nie znam się, może inaczej to się nazywa). Jeśli to coś szuka pointery to weź mi skompiluj ; )

Tak w ogóle reverse engineerign w polsce nie jest zbytnio popularne, a w ogóle zarąbiście nudne ;/

Nie interesuje mnie jakaś tam epoka we wchodzenie procesory czy coś w tym stylu. Po prostu programować, a nie..

0

Jezeli chcesz sobie podmienic w grze WSZYSTKIE samochody jednego typu na cos innego - niech bedzie ten Twoj przykladowy czolg to najprosciej bedzie podmienic je w zasobach gry. Obiekty 3D sa przewaznie zapisane w jednym z najpopularniejszych formatow - .3ds, .x, itp, ew sa zapisane w formacie stworzonym na potrzeby gry i potem pakowane po ilestam (lub nie). Przy uzyciu odpowiednich programow mozna rozpakowac te archiwa, przejrzec pliki, dokonac odpowiednich modyfikacji i spakowac z powrotem. Ogolnie zainteresuj sie tematyka modowania gier, bo chyba bardziej oto Ci chodzi. Czolg moze skladac sie nawet z kilku tysiecy face'ow(jezeli jest dokladnie wymodelowany, w prostszych przypadkach raczej bedzie to kilkaset) z ktorych kazdy jest opisany przez 3 wierzcholki(vertexy) i wektor normalny(tak wiem, stosuje sie rozne formy kompresji tych danych, ale ten przyklad to pewne uproszczenie, wiec nie bede mieszal) do tego dochodza textury, wspolrzedne mapowania, w przypadku gier rowneiz jakas ogolna charakterystya obiektu i sporo roznych rzeczy. Znalezienie tego szukajac "na pale" nawet w malej grze zajmie baaaaardzo duzo czasu, nie wspominajac o zamienieniu tego na "cos innego" co bedzie mialo sens.

0

ty słuchaj,a co jeśli mam dekompilowane pliki i mam dostęp do nich? Znam tzn. wartości magii, broni, animacji, statów ito..

np.

run = 1
jump = 2
sprint = 3
shoot = 4

Zdekompilowany plik jest w formacie *.d.

I jak tego mogę używać w aplikacji, to w ogóle możliwe??

0

To mi nie wyglada na zdekompilowany kod.... Wiesz w ogole co to jest? http://pl.wikipedia.org/wiki/Dekompilacja
To co wrzuciles to imho raczej jakis config - ustawienie klawiszy itp albo plik z ktorego wczytywane sa odpowiednie parametry. Wrzuc kilka przykladowych plikow i daj linka jak bede mial chwile(na 90% jutro) to zerkne. I zdradz nam ta tajemnice - co to za gra?

0

Wiem, jak najbardziej co to dekompilacja :)
Gra to "Gothic 2". Gothic'y są często modyfikowane (skrypty), ale nie ze strony pamięci : (

Proszę:
http://www.speedyshare.com/files/22553446/zdekompilowane_skrypty_gothic_2_noc_kruka.rar

0

Jeśli to coś szuka pointery to weź mi skompiluj ; )

:| http://pl.wikipedia.org/wiki/J%C4%99zyk_skryptowy
I nie zrozumiałeś, chociaż cały czas piszesz że rozumiesz - w pamięci nie ma czegoś takiego jak pointer. Ten program szuka wartości mogących być pointerami.

Tak w ogóle reverse engineerign w polsce nie jest zbytnio popularne, a w ogóle zarąbiście nudne ;/

Nie zgadzam się, RE to jedna z ciekawszych rzeczy jakie można robić na komputerze, pod warunkiem że się w tym nie pracuje oczywiście bo wtedy to strasznie męczące musi być :D

PS. tamte kody - na dekompilowane nie wyglądają, to raczej kod źródłowy.

I o co dokładnie ci chodzi (co chcesz zrobić)?</b>

0

Z tego co się dowiedziałem, niby zdekompilowane, ale dla mnie to też dziwne. Za ładne :P

MSM, cyriel chyba wie o co mniej więcej chodzi.

0

Ja pierniczę, naprawdę ten wątek jak i kompetencje autora mnie przerastają.

  • człowieku, jak chcesz tworzyć mody, wyłącznie modyfikować zasoby i skrypty to co do cholery mają z tym wspólnego pointery?
  • skoro chcesz kombinować z użyciem debuggera, niskopoziomowych rzeczy, to chciałbyś może nowe obiekty do gry wprowadzać podczas jej działania? To nie piernicz bez sensu o znajomości 'struktur pamięci' - niech coś będzie opisane przez instancję jakiejś klasy i powiedzmy trzymane w jakimś poolu obiektów - wtedy nie zrobisz NIC bez wiedzy jak te obiekty powstają, gdzie i z czym są powiązane.
  • dałem przykładowy skrypt i podałem ile dla głupiego notatnika niby-pointerów znajduje żeby pokazać Ci, że pieprzysz od rzeczy - w pamięci takiego Gothica jak nic znalazłoby się co najmniej kilkadziesiąt milionów 'wskaźników na nieznane dane' - czytanie ze zrozumieniem leży?
  • jaka dekompilacja człowieku? To są zwyczajne skrypty, które są po prostu spakowane w jedną paczkę razem z innymi zasobami, jak tekstury, dźwięki etc. Ty naprawdę nie masz elementarnych podstaw - gdzieś coś słyszałeś, gdzieś sobie coś ubzdurałeś, kiedyś Ci się coś przyśniło.
  • proste trainery to małpa zrobi, to kwestia wyklikania adresów w skanerach i mechanicznego poskładania z kodem modyfikującym pamięć. Nie świadczą o (nie)umiejętności programowania, to co tutaj wypisujesz jak najbardziej tak.
  • RE w Polsce mało popularne? Kpisz czy o drogę pytasz? Mamy jedną z lepszych 'średnich ilości RE na jednego mieszkańca' na świecie.
  • ostatnia rzecz - popatrz, trzy strony postów a Ty nadal nie napisałeś co chcesz osiągnąć, bredzisz tylko o jakimś 'szukaniu wskaźników na nieznane wartości', 'dodawaniu czołgów'. No i co, że Gothic 2? G2 moduje się bez problemu, wszystko opisane na poziomie zewnętrznych danych, prawie wszystko da się zrobić bez kombinowania. I co, napisałeś co chcesz z Gothiciem konkretnie zrobić, po co, co chcesz osiągnąć i dlaczego? Nie. Bez konkretów to nie mamy o czym rozmawiać.

Dziękuję, miłego dnia.

0

Jeśli znam adresy i pointery do jakiejś tam czynności to go używam, a jeżeli ciężko mi go znaleźć to chciałbym jakoś dostosować jakiś skrypt do mojego kodu, żeby funkcjonowała dana czynność.

W gothicu jest coś takiego:

Wpisujesz sobie cheata: "insert pc_rockeffeler" i pojawia ci sie gostek, a ja chciałbym to zrobić ze strony kodu, żeby mi go zespawnowało. W skryptach widziałem co nie co ten cheat, ale nie wiem jak dostosować do kodu.

0

O ja pierniczę, człowieku!

Wyłożę Ci łopatologicznie jak to mniej/więcej wygląda:

  • wpisujesz komendę;
  • komenda leci do interpretera skryptów (Gothic jest obficie skryptowany, o czym zresztą wiesz);
  • interpreter woła obsługę polecenia 'insert', z odpowiednim argumentem;
  • menadżer zasobów jest odpytywany o tak nazwany zasób, zapewne ze wskazaniem jakiego typu zasobu szukamy;
  • jeżeli coś używalnego jest znalezione to ładowane są powiązane z nim rzeczy (teraz albo przy pierwszym użyciu)
  • tworzony jest normalny, zwyczajny obiekt, instancja jakiejś klasy, zbudowana na bazie tego co wczytano;
  • obiekt jest wrzucany do menadżera obiektów;
  • obiekt zaczyna fizycznie istnieć w grze;

Zapewne coś w tym rodzaju się odbywa, wnętrza Gothica nie widziałem generalnie.

Gra woła konkretne metody konkretnych obiektów, te tworzą nowe obiekty i przekazują sobie wzajemnie. Gdzie tu chcesz coś przez wskaźniki robić?

Aha, zapomniałem dodać, że klasy reprezentujące obiekty to posiadają metody wirtualne?

Weź człowieku napisz prosty program w C++, z prościutką klasą i listą obiektów tej klasy, niech je wyświetla/rysuje/gra/wtf w pętli. Potem spróbuj napisać soft, który pozwoli dodać z zewnątrz dodać nowy obiekt do listy. Wyobraź sobie, że z Gothiciem będzie ze 20x więcej roboty przy samym wstawianiu, o zrozumieniu mechaniki nie mówię.

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