Czytanie kodu assemblera

0

Witam,
Tworzę moda do pewnej gierki.
Ponieważ nie jestem programistą postaram opisać dokładnie o co chodzi, do czego doszedłem i z czym jest problem.

Gra dopuszcza max 8 pól przeznaczonych do przechowywania jednostek (w dodatkach wcześniejszych pól było 12).
Po zapełnieniu wszystkich 8 pól i próbie dołączenia 9 jednostki pojawia się alarm: "msg_NoPlaceInPaty".
Po zdekompilowaniu pliku exe odnalazłem miejsce w którym pojawia się powyższy komunikat.
Zakładam że przed jego wywołaniem program musi porównać ilość wolnych miejsc z ilością miejsc zapełnionych i przy przekroczeniu wartości 8 (lub wartości równej 8) wykonuje wywołanie alarmu.
Zakładam też że wartość 8 jest przechowywana w jakimś obszarze programu (rejestrze) i jest wartością stałą (stała i niezmienna w czasie jest ilość pół dostępnych w grze).
Problem jest w tym że patrzę na ten program i za cholerę nie jestem w stanie dojść do tego gdzie znaleźć rejestr odpowiedzialny za przechowywanie ilości dostępnych pól.
Punkt zahaczenia jest -> w załączonym poniżej kodzie musi (moim zdaniem) dojść do porównania wartości 8 z inną wartością, tylko ja jej nie widzę...
Czy ktoś doświadczony w assemblerze może rzucić okiem na kod i coś podpowiedzieć?
Załączam plik z kodem.

Pozdrawiam
MD

0

Zaraz przed zaznaczonym przez Ciebie wywołaniem komunikatu masz add eax, 8 i porównanie i skok warunkowy (jb jeśli poniżej 8 to nie wykonuje kodu komunikatu tylko skacze robić coś dalej pewnie dodaje jednostkę). Zakładając że w eax było wcześniej 0 (przed add eax, 8) a z kodu nie da się wyczytać ile było bo ma przypisaną wartość z pamięci to o to porównanie chodzi.

0

Zastanawiam się nad zapodaniem tego wątku do nietuzinkowych tematôw.Wprawdzie mamy tu doczynienia z podstawami inżynierii wstecznej, ale pomimo iż to podstawy na które naprowadził kAzek. To zwykle tematatyka ta zahaczała o mało banalne podstawy. Uprzedzając kolejne pytanie chociaż być może pytający już do tego doszedł, należy według mnie zmienić skok na bezwarunkowy i zbaczyć jak zachowa się gra. Żartowałem kiedyś na ircu na pewnym kanale, że w taki upał crackerzy piją tylko swoje ulubione piwo czyli EB, ale to że wzieło mi się to od opcodu instrukcji jmps nie było dla wszystkich oczywiste z moim tokiem myślenia ;)

0

Jak już zostalo zauważone interesujący cie kod jest tu:

.text:00779A38                 mov     eax, [esi+0C0h]
.text:00779A3E                 mov     ecx, [ebp+arg_38]
.text:00779A41                 add     eax, 8
.text:00779A44                 cmp     ecx, eax
.text:00779A46                 jb      short loc_779A6F
.text:00779A48                 push    edi
.text:00779A49                 mov     eax, 11h
.text:00779A4E                 mov     ecx, offset aMsg_noplaceinp ; "msg_NoPlaceInPaty"

Pobieramy tutaj do eax i ecx pewne wartości z pamięci, następnie do eax dodajemy 8 i porównujemy zawartość eax i ecx (cmp -> compare). Jeśli eax < ecx to skaczemy do etykietki loc_779A6F. jb oznacza jump if below czyli "skocz jeśli w ostatnim porównaniu pierwszy operand był mniejszy od drugiego".
Możesz zmienić ten skok na jmp czyli skok bezwarunkowy.
Miej jednak na uwadze że gra może w jakimś innym miejscu plegać na tym że tych obiektów jest nie więcej niż 8 i nie będzie działac poprawnie.

0

Witam,

Dziękuję za pomoc… i proszę o kolejną .

Zmian w pliku exe wykonuję za pomocą hex-edytora. Dopóki dokonywałem zmian na liczbach – nie miałem problemów ale jak zapisana w hex’ie jest komenda JB (72 czy też 72 27...)? i jak zapisać JMP?

Poniżej linijka z hex-edytora:

00779A46 72 27 57 B8 11 00 00 00 B9 64 50 8B 00 E8 48 7C

Powinna w niej być zakodowana poniższa instrukcja:

.text jb short loc_779A6F

A może zamiast add eax, 8 zrobić add eax, 9 (lub więcej)? – czy efekt nie będzie podobny?

Mam wrażenie że zmiana ta zadziała w taki sposób że jednostki nie przeniosę, a tylko alarm nie zostanie wyświetlony.

0

Efekt powinien być podobny. Niemniej ja bym do takich akcji używał np. IDA Pro (darmowe na stronie producenta) a nie hexedytora ;]

0

Zmiany w trybie Decode można też nanieść HIEW - nawet darmową wersją z http://www.hiew.ru i tak jak pisałem jeśli użyjesz ulubionego piwa crackerów to opcod dla jmps to oczywiście EB :) Lecz w trybie Decode po przejściu do offsetu (F5 i offset w hex) lub VA (F5 i adres poprzedzony kropką) po naciśnięciu F2 możesz pisać instrukcjami asseblera co linijkę potwierdzając to Enterem. Jakbyś chciał zobaczyć modyfikacje pod HIEW "w akcji" to - tutaj mała autoreklama - w wolnym czasie obejrzyj to - nagrywane dawno, na szybko, bez montażu i po paru podejściach. Żeby tylko wyrobić się w całkowitym czasie nagrywania poniżej pietnastu minut :)

0

Znalazłem w necie info, że komenda JMP zapisana w hex’ie to EB no i wreszcie skumałem dowcip :).
Tylko proszę nie „grzać” ze mnie… wykształcenie mam mechaniczne ;)

IDĘ posiadam - to nią dekoduję plik... i tyle udaje się mnie zrobić.
Nie za bardzo wiem jak zdekodowany z powrotem przerobić na wykonywalny exe no i jak w zdekodowanym zmieniać komendy...

Jutro wstawię (piwko) EB w kod używając jeszcze hex-edytora, dam znać jaki efekt, obejrzę też przesłane filmy.

Dzięki.

0

Spoko. Nikt nie grzeje, bo już w dzień wystarczy że słonko przygrzewa ;) Co do nanoszenia zmian, to polecam nawet demo HIEW lub jakiś inny hex edytor. Jest ich cała masa. W Idzie też można pokazać offset, nie do końca kojarzę jak, bo to też zależy od używanej IDY.

I często da się przejśc pod HIEW podając po F5 i wpisanej kropce adres wirtualny instrukcji którą widać na początku linijki. Na pewno można dla pewności właczyć pokazywanie opcodów pod IDĄ, a stąd już może nieco "klawiszo wciskalno chłonna", ale prosta metoda by podać pod HIEW przy wyszukiwaniu F7 opcody instrukcji. Do HIEW można też wklejać zawartość schowka, ale tylko kombinacją Shift+Insert.

0

Dawno nie używałem IDA ale wystarczy 10 sekund aby znaleźć w necie informację że można nią patchować binarki podając zarówno nowe bajty (jak w zwykłym hexedytorze) albo nowe instrukcje w asm taką możliwość ma także wspomniany HIEW). Źródło informacji http://resources.infosecinstitute.com/ida-program-patching/ . Co do tego czy zmienić skok na z jb na jmp (EB) czy 8 na większą wartość to zależy co chcesz uzyskać. Wiadomo jmp czyli skok będzie występował zawsze więc liczba jednostek będzie nieograniczona, natomiast jak zmienisz wartość to liczba jednostka będzie ograniczona nową wartością. Oczywiście to rozważanie teoretyczne, bo co wszystko zależy od tego jak ta gra sobie przydziela pamięć na kolejną jednostkę, bo jeżeli jest ona przydzielona statycznie to uzyskasz access violation albo coś innego się posypie bo przekroczysz obszar pamięci przydzielony na jednostki no ale to to już musisz przetestować sobie sam.

0

Po podmienieniu warunku JB na JMP gra zachowuje się następująco:
Jednostka z garnizonu zostaje przeniesiona… tylko nie wiadomo dokąd – znika, nie zwiększa się też ilość jednostek w liczniku bohatera (licznik pokazuje wartość liczbową równą ilości jednostek okupujących dostępne pola ) ale brak alarmu – sukces połowiczny (jeśli uda się zwiększyć ilość pól wówczas trzeba wykonać i tą zmianę w programie)
Zrobiłem też testy ze zwiększaniem liczby 8 do wartości 9 i 10 (z linijki: .text:00779A41 add eax, 8) rezultat był taki że nadal pojawiał się komunikat "msg_NoPlaceInPaty"…
Następnie zmniejszyłem wartość z 8 na 6 i efekt był taki sam jak przy zastosowaniu warunku JMP…

Logika jest jakby odwrócona – zamiast dodawać ilości pól zajętych odejmowana jest ilość pól wolnych. Czy ma to związek z kodem .text:00779A1D dec byte ptr [eax-1] (z załączonego pliku)?

Chyba wracam do punktu wyjścia - muszę znaleźć rejestr przechowujący informację o ilości pól dostępnych dla jednostek. Jeśli zamiast zaczytywania wartości z rejestru (przechowującego informację o ilości dostępnych pól) wstawiono tu (.text:00779A41 add eax, 8) na sztywno wartość 8 (bo taką wartość powinien przechowywać rejestr) to nie zwiększy mi to ilości dostępnych pól dla jednostek tylko zmieni warunek kontroli pól i (chyba) nie jestem w stanie cofnąć się logicznie do rejestru którego poszukuję?

0

Nie za bardzo, szczególnie że może to być zaszyte w wielu miejscach. Może też byc tak że pola maja statycznie alokowaną pamięć która mieści tylko 8 jednostek i tyle.

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