Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Tutorial][Mu Online] Exe Checksum Bypass


Rekomendowane odpowiedzi

Opublikowano

Potrzebne narzędzia:

1. OllyDbg

2. Deathway checksum generator (w załączniku)

 

Założenia:

  • Checksum pobierany z wygenerowanego pliku przy pomocy Checksum Generator'a
  • Nazwa pliku ustalona z góry

 

Przed rozpoczęciem działania upewnij się, że main nie jest spakowany!

 

Zaczynamy, na początku otwieramy maina poprzez File > Open (skrót F3) i czekamy aż plik zostanie zanalizowany.

Następnym krokiem jest odnalezienie funkcji ProtocolCore, która odpowiedzialna jest za obsługę informacji wysyłanych przez serwer. Klikamy ppm i wybieramy Search for -> All referenced text strings. W nowym oknie klikamy ppm i wybieramy Search for text a następnie wpisujemy Strange Packet odznaczając Case sensitive oraz zaznaczając Entire scope. Po odnalezieniu naciskamy Enter by przejść pod adres, w którym ten tekst jest wykorzystywany.

 

sp1m.jpg

 

Owa funkcja zapisuje zdarzenia w grze. Jednakże my szukamy ProtocolCore. Wystarczy znaleźć pierwszy call nad naszą pozycją, w moim przypadku to

Call main.0066B0A0

zaznaczamy linijkę z owym callem i naciskamy enter.

 

sp2xv.jpg

 

Oto jesteśmy w naszym szukanym ProtocolCore. Teraz należy odnaleźć obsługę instrukcji o kodzie 0x03 (wysyła ona klucz do obliczenia checksum). Naciskamy ppm na linijkę z komentarzem Switch (cases 0..F9) (uwaga: każda inna wersja maina może mieć miejszy zakres tego switcha, należy zapamiętać, iż jest to pierwszy switch w tej funkcji), wybieramy Goto > case 3 dzięki czemu przeniesieni zostaniemy do wykonania instrukcji o numerze 0x03.

 

sp3.jpg

 

Teraz przechodzimy przez następny call (zaraz pod naszą pozycją)

 

sp4j.jpg

 

Dalej musimy dostać się do procki odpowiedzialnej za otwieranie pliku, przechodzimy więc do drugiego calla (w każdym mianie jest to drugi call od początku funkcji wykonującej instrukcję 0x03). Od teraz każda funkcja wygląda niemal identycznie w każdym mainie niezależnie od wersji.

 

sp6.jpg

 

Według naszych założeń na początku, chcemy aby main po otworzeniu pliku wygenerowanego przez Checksum generator sam policzył sobie pozycję odpowiedniej wartości zwrotnej. Plik ładowany będzie zamiast samego maina (podczas obliczania sumy kontrolnej main otwiera sam siebie i oblicza wartość). Na sam początek ustalamy nazwę pliku, ja wybrałem checksum.dat. Nazwę umieszczamy na końcu sekcji (wolne bajty sekcji), przechodzimy więc na sam koniec przesuwając suwak na sam dół, zaznaczamy kilka wolnych bajtów (wystarczająco tyle, by zmieściła się nazwa pliku), klikamy ppm i wybieramy Folow in dump > Selection po czym naciskamy spację i wyskakuje nam okienko, gdzie wpisujemy nazwę pliku.

 

cp7.jpg

 

Klikamy OK i zapisujemy adres naszego stringa najlepiej gdzieś do notatnika lub na kartkę

 

cp8.jpg

 

W moim przypadku jest to 0x008D6FEB. Wracamy do naszego kodu otwierającego plik, jako że jest on stały, należy zmienić argument FileName w drugim użyciu funkcji CreateFileA. W każdym innym mainie rejestr może być inny (u mnie jest to ECX), w zależności od tego zmieniamy instrukcję LEA na MOV oraz DWORD PTR SS:[..] na adres nazwy pliku. Wyglądać będzie to mniej więcej tak:

 

cp9t.jpg

 

Plik już nam się ładuje (jeśli nie chce Ci się poświęcić więcej pracy na coś ambitniejszego, możesz użyć nazwę maina, z którego checksum chcesz pobierać a resztę nasz scrackowany main zrobi więc przejdź od razu do zapisywania pliku). Teraz czas na obliczanie pozycji w wygenerowanym pliku przez Checksum generator pliku. Zanim to zrobimy musimy się dowiedzieć co taki plik w sobie trzyma, otóż jest to tablica 1024 wartości DWORD, każdy z osobna to obliczona wartość sumy kontrolnej (indeks w tablicy to klucz). Wiedząc, co zawiera wygenerowany plik, możemy zabierać się do dalszej części crackowania. Na początku generujemy plik przy pomocy Checksum generatora (Open > szukamy oryginalnego maina serwera, następnie naciskamy Generate i pojawia nam się plik "checksum.dat").

 

Krótka analiza kodu wywołania funkcji, która oblicza checksum:

0061AF59   . 66:8B4D 08     MOV CX,WORD PTR SS:[EBP+8] ;pobiera wartość klucza (WORD), klucz wskazuje, które miejsce w pliku mamy wskazać
0061AF5D   . 51             PUSH ECX                                 ; /Arg3
0061AF5E   . 8B95 E4FEFFFF  MOV EDX,DWORD PTR SS:[EBP-11C]           ; |  drugi argument to całkowity rozmiar pliku, i tak go nie potrzebujemy
0061AF64   . 52             PUSH EDX                                 ; |Arg2
0061AF65   . 8B85 DCFEFFFF  MOV EAX,DWORD PTR SS:[EBP-124]           ; |  pierwszym argumentem jest wskaźnik do początku załadowanego pliku, z tej wartości skorzystamy
0061AF6B   . 50             PUSH EAX                                 ; |Arg1
0061AF6C   . E8 5DFDFFFF    CALL main.0061ACCE                       ; \main.0061ACCE

 

Zmieniamy kod na:

XOR ECX, ECX ; zeruje rejestr
MOV CX, WORD PTR SS:[EBP+8] ; pobieramy klucz
MOV EDX, DWORD PTR SS:[EBP-124] ; rejestr EDX zawiera teraz adres naszego pliku
; teraz obliczamy pozycję w pliku poprzez klucz (każda suma kontrolna to 4 bajty, pozycja to klucz * 4)
ADD EDX, ECX
ADD EDX, ECX
ADD EDX, ECX
ADD EDX, ECX ; można użyć mnożenia ale mi coś nie wyszło :P
MOV EAX, DWORD PTR SS:[EDX] ; EAX to wartość checksum (funkcja zwraca wartość w EAX)

 

W olly kod będzie wyglądać następująco:

 

cp10n.jpg

 

Gotowe, teraz wystarczy zapisać plik, w tym celu naciskamy ppm i wybieramy Copy > Select all by zaznaczyć całą sekcję, następnie ponownie ppm tym razem wybierając Copy to executable > selection i ponownie ppm w nowym oknie wybierając Save file, nazywamy go jak chcemy.

MainChecksum.rar

YOU MUST DIE

- Ganon, Koridai

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...