Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[assembler]Przeróbka kodu inkrementującego

Piotr160292 23 Lis 2015 22:30 1512 19
  • #1 23 Lis 2015 22:30
    Piotr160292
    Poziom 36  

    Witam, potrzebuję przerobić kod dodający punkty doświadczenia tak, aby dodawał 6 punktów, zamiast 1. Kod prezentuje się następująco:

    Code:
    inc ecx
    
    mov eax,03BA5D44 - adres wartości Licznika XP

    exit:
    jmp returnhere

    0501A89D:
    jmp newmem
    nop
    returnhere:

    Udało mi się przerobić go poprzez wstrzyknięcie poprzez cheat engine, ale problem jest tej natury, że po zrestartowaniu gry wstrzyknięty kod nie funkcjonuje prawidłowo, ponieważ zamiast zwiększać wartość w liczniku XP to powoduje jego zamrożenie i cały czas pokazywana jest ta sama wartość, albo w ogóle gra ignoruje skrypt i działa po swojemu, czyli daje 1 punkt. Nie wiem czy dobrze myślę, ale sądzę, że problem jest w tym, że kod za każdym uruchomieniem gry znajduje się pod innym adresem, ponieważ wyłączyłem i wyłączyłem grę i okazało się, że kod już nie jest pod adresem 0501A89D, tylko innym. W jaki sposób można to obejść? Jest to w ogóle możliwe?

    0 19
  • #2 24 Lis 2015 11:14
    mi14chal
    Poziom 28  

    Za każdym razem jest pod innym adresem ponieważ ASLR jest włączone. Z tego co pamiętam w cheat engine byś musiał znaleźć static address który był zaznaczany na zielono. Poczytaj o multi level pointer.

    0
  • #3 24 Lis 2015 11:39
    Piotr160292
    Poziom 36  

    Aha, w ten sposób... Czyli widzę, że dobrze kombinowałem, ale od tyłka strony, bo właśnie domyśliłem się, że jest wykorzystany wskaźnik, bo dokładnie to samo było z licznikiem XP, ale nie wpadłem na to, że wielopoziomowy...

    0
  • #4 24 Lis 2015 12:01
    Rezystoreczek
    Poziom 20  

    A gdyby zmienić bezpośrednio w pliku exe :?:

    0
  • #5 24 Lis 2015 12:46
    Piotr160292
    Poziom 36  

    Hmm, to chyba nie jest to. Otworzyłem przeglądarkę pamięci, odszukałem adres w którym jest interesujący kod i wybrałem żeby pokazało mi jaki adres tej instrukcji ma dostęp, wykonałem w grze akcję uruchamiającą kod i lipa - cheat engine nic nie pokazał... Wskaźnik na adres licznika mam, tylko kurcze nie mogę dopaść wskaźnika na adres kodu, który nadpisuje licznik...

    Dodano po 1 [minuty]:

    Rezystoreczek napisał:
    A gdyby zmienić bezpośrednio w pliku exe :?:

    Wolałbym to przez cheat engine ogarnąć, bo chcę potem wygenerować trainer.

    0
  • #6 24 Lis 2015 14:12
    mi14chal
    Poziom 28  

    Albo w CE szukasz multi level pointer który już będzie static address, albo zawsze też możesz zrobić reverse engineering tej gry i samemu znaleźć właściwy adres.

    0
  • #7 24 Lis 2015 14:48
    Piotr160292
    Poziom 36  

    No właśnie chcę poszukać statycznego, ale jakoś nie bardzo mi to idzie... Jak pisałem, do adresu w którym jest wartość licznika znalazłem w 3 minuty przez opcję wyszukiwania wskaźników a do tego gdzie jest zawarty interesujący mnie kod za cholerę. :/
    edit:
    LOL nie mam obsolutnego pojęcia co się stało... Załączyłem pointer scanner, podałem adres w którym jest instrukcja inc i ładnie mi wyszukał static pointer... A to dziwne, bo wcześniej próbowałem i fakt, odnajdywało, ale nie do tego adresu co trzeba... :/ No cóż, widocznie nie pomyślałem i wskazałem mu nieprawidłowy max. poziom skanowania, bo z licznikiem też tak miałem, że niby znalazł, ale po restarcie gry jak mu wybrałem opcję przeszukania i usunięcia niepasujących to nic mi nie wyrzucał i wlaśnie jak zmieniłem poziom to wtedy już znalazł dużo więcej wskaźników i już ładnie podpasował działający po restarcie.

    0
  • #8 24 Lis 2015 22:11
    Piotr160292
    Poziom 36  

    Jednak nic to nie dało... Po restaecie okazało się, że żaden wskaźnik nie pasuje, albo coś źle zrobiłem. Tego się nie dowiem, bo przez przypadek nadpisałem sobie wyniki wyszukiwania. Teraz mam taką absurdalną sytuację, że szukam tym pointer scannerem i wyszukuje mi adresy przesunięte o 1 w stosunku do adresu który szukam. Mianowice mam np. adres 052CBE2D i taki podaje pointer sacannerowi a on wypluwa mi wskaźniki dla adresu 052CBE2C. Jakiś pomysł co jest grane? Próbowałem kikakrotnie uruchamiać grę i ponawiać skan, ale za każdym razem wyrzuca mi wskaźnik adresu o 1 wyższy, albo o 1 niższy adres... Sytuacja jest trochę dla mnie dziwna, bo robię dokładnie tak samo i coś tam znalazło(pamijam fakt, że żeden nie zadziałał) a teraz w ogóle nie znajduje mi tego co chcę...

    0
  • #9 25 Lis 2015 10:09
    mi14chal
    Poziom 28  

    Przy takich rzeczach dobrze zapisywać każde wyniki wyszukiwań. Ponadto co kolejne wyszukiwanie restart gry/komputera. Tak jak już wspominałem zawsze zostaje też ci reverse engineering tejże gry.

    0
  • #10 25 Lis 2015 10:36
    willyvmm
    Poziom 26  

    Tylko ze ten kod ktory podales w 1 poscie nie ma sensu wiekszego ... analizowales go?

    0
  • #11 25 Lis 2015 11:49
    Piotr160292
    Poziom 36  

    Może i nie ma sensu, bo jest odczytany przez autoassembler. Przypuszczam, że oryginalnie tam są tylko instrukcje inc ecx i move ecx. Robiłem wstrzyknięcie kodu i zadziało... Teraz się ocknąłem, że problem jest faktycznie w braku wskaźnika dla adresu w którym jest instrukcja inkrementująca, bo uświadomiłem sobie, że przecież stan licznika zamrażał się po restarcie gry co sugeruje, że skrypt odnosi się poprawnie do samego licznika i go nie zwiększa, bo kod odpowiedzialny za zmianę jego stanu jest już pod innym adresem. Problem tylko w tym, że nie bardzo mogę znaleźć ten wskaźnik. Zostawiłem skaner wskaźników na kilka godzin i efekt był taki, że przepiłniła się partycja z 60GB wolnego miejsca i wyrzuciło ponad 100 tyś. wskaźników do tego samego adresu i to jeszcze nieprawidłowego. Rozszerzyłem pole poszukiwań na inne levele, bo wygląda na to, że jest wskaźnik do tego adresu, tylko głębiej i wtedy jak znalazłem to akurat miałem farta, że znalazłem go przy ustawionym max level na 5.
    Tak to wygląda jak zrobię skan co się dzieje podczas zapisu adresu licznika:
    [assembler]Przeróbka kodu inkrementującego
    Już rozgryzłem, że wstrzyknięcie kodu trzeba zrobić w ten pierwszy adres od góry.

    0
  • #12 25 Lis 2015 11:52
    willyvmm
    Poziom 26  

    Teraz to ma sens :)

    Dlaczego nie chcesz zmiany w pliku .exe wprowadzic?

    0
  • #13 25 Lis 2015 12:08
    mi14chal
    Poziom 28  

    Skoro masz adres tej instrukcji to możesz też zrobić tak że patrzysz w jakim jest to module niekoniecznie to musi być w exe gry może być to dll, potem liczysz offset od base address tego modułu i potem pozostaje ci w tym momencie pod ten adres wstawić skok do swojego kodu.

    0
  • #14 25 Lis 2015 18:17
    Piotr160292
    Poziom 36  

    mi14chal napisał:
    Skoro masz adres tej instrukcji to możesz też zrobić tak że patrzysz w jakim jest to module niekoniecznie to musi być w exe gry może być to dll, potem liczysz offset od base address tego modułu i potem pozostaje ci w tym momencie pod ten adres wstawić skok do swojego kodu.

    Tak chyba będzie szybciej...

    Dodano po 1 [minuty]:

    willyvmm napisał:

    Dlaczego nie chcesz zmiany w pliku .exe wprowadzic?

    Ponieważ chcę zrobić tą modyfikację jak trainer żeby można było wyłączyć modyfikację/włączyć w trakcie gry a nie bawić się podmianę plików exe.

    Dodano po 5 [godziny] 43 [minuty]:

    Ok, myślę, że temat jest do opanowania. Znalazłem bardzo fajny sofcik, który bardzo ładnie zdeassemblował mi exeka(myślę, że instr. inkremetacji w nim jest),tak więc nie będzie już problemu w przerobieniu, bo mam możliwość weryfikacji w czasie rzeczywistym wprowadzonych zmian w kodzice, więc będe robił tak, że w ciemno będe po kolei modyfikował instrukcje inc ecx i poprzez Cheat engine'a spr. sobie czy trafiłem w dobry i wtedy podziałam pod kątem zaadresowania tego za każdym uruchomieniem. Mam jeszcze pytanie, jak zrobić skok do wybranego adresu? Wystarczy wpisać jmp nr adresu+offset, czy jak?

    0
  • #16 26 Lis 2015 03:48
    Piotr160292
    Poziom 36  

    No fakt, najpierw napisałem a potem pomyślałem. :p

    0
  • #17 28 Lis 2015 15:16
    Piotr160292
    Poziom 36  

    Potrzebuję pomocy, bo dopiero ogarniam assemblera i jeszcze nie znam go na tyle perfect, aby móc od a do z interpretować to co podaje mi przeglądarka pamięci cheat engine'a. A więc przeanalizowałem kod i zauważyłem, że tuż przed wywołaniem instrukcji inc ecx jest wywoływana instrukcja esp,10, a prze nią call dword ptr [eax+A0]. Dodałem sobie zatem do eax'a offset A0 i przeszedłem pod otrzymany adres 01EE5DE4. Pod tym adresem znalazłem instrukcję push 98096E14. Czyli co, mam rozumieć, że wskaźnikiem dla instrukcji inc ecx jest adres 98096E14?

    0
  • #18 28 Lis 2015 15:30
    -psiak-
    Poziom 32  

    inc ecx - zwiększa ecx o jeden i na tym wszystko.
    Dopiero gdzieś dalej to ecx zostanie zapisane do pamięci.
    call dword ptr [eax+A0] to typowe wywołanie funkcji wirtualnej w C++ bądź dynamicznej w Delphi ale nie tylko.
    Pod adresem eax+A0 (czyli 01EE5DE4) znajduje się 4-bajtowa zmienna w której dopiero znajduje się adres skoku do funkcji.

    Nie dasz rady przerobić telewizor na telefon komórkowy bez wcześniejszego nauczenia się kilku rzeczy od podstaw,
    to co kombinujesz w tym temacie - właśnie na takową próbę wygląda.

    0
  • #19 28 Lis 2015 15:53
    Piotr160292
    Poziom 36  

    No i ok, o to mi chodziło, że tutaj jest adres do funkcji. Źle się po prostu wyraziłem.

    0
  • #20 29 Lis 2015 10:18
    Piotr160292
    Poziom 36  

    Udało się, wszystko działa jak należy. Dzięki za pomoc Panowie. :D

    0