mIRC 5.41 by Iwan

Cel: mIRC 5.41
Czym: Softice

UWAGA! Jesli nie jestes newbie, nie trac czasu na czytanie.

Po przeczytaniu daj mi znac, czy ten tut Ci sie na cos przydal ---> iwy@friko.onet.pl

No to do dziela. Uruchamiamy Mirc32.exe, z menu Help wybieramy Register...

Wpisujemy nasze dane. U mnie wyglada to tak:

Full Name: Iwan'98
Registration Code: 34343434

Jak szybko mozna zauwazyc, pulapki na GETWINDOWTEXTA czy tez GETDLGITEMTEXTA nie dzialaja.

Jakie jest wyjscie? Tradycyjnie jest ich kilka. Jako, ze w ostatnim tutorialu namawialem Was do wyprobowania pulapki na HMEMCPY (kto probowal? ;)). Czemu nie? Wskakujemy wiec do SoftIce i:

BPX HMEMCPY

Wracamy do windozy i naciskamy Register. Bach... i znow w SofIce. Jeszcze jedno wyjscie, potem F11 i jestesmy w kodzie. No tak, tylko na kod mIRC to to nie wyglada :(. Nie martw sie, to normalne przy uzyciu HMEMCPY, ze od razu nie wyladujesz w kodzie programu, ktory Cie interesuje. Musisz dopiero do niego dojsc. A wiec palec na F10 i w droge! I przygotuj sie na kilkadziesiat nacisniec. Od razu po dojsciu do kodu mIRCa zatrzymaj sie (jak poznac, ze jestes juz w tym kodzie - na pewno wiesz, jesli czytales moj poprzedni tutorial :)).

Newbies Note!

Warto zwrocic uwage, ze zazwyczaj, gdy szukamy kodu naszego programu po uzyciu pulapki na HMEMCPY, jest on poprzedzony kodem KERNEL32!_FREQASM.

OK. Jak juz sie doczlapiemy do kodu mIRCa, zobaczymy cos takiego:

:0043D1B5    PUSH 004D1E70
:0043D1BA    PUSH 004D1BB4
:0043D1BF    CALL 0048E608

Sprawdzmy, co pchane jest na stos.

D 4D1E70

Nasz serial.

D 4D1BB4

Nasze imie.

Warto zapamietac te adresy.

No to chyba jestesmy w dobrym miejscu, zeby zaczac ;)

Wchodzimy (F8) w wywolanie w linii 0043D1BF i po paru F10 dochodzimy do:

:0048E606    MOV ESI,[EBP+0C]
:0048E611    MOV EBX,[EBP+08]
:0048E614    PUSH EBX
:0048E615    CALL 004B39C8

Hmm, moze zastanawiales sie, co tez takiego poleci do ESI po przejsciu linii 0048E606?

Sprawdzmy.

D EBP+0C

W oknie danych z pozoru nic nie ma, ale... pamietasz zabieg z czytaniem 'od konca' z poprzedniego tutorala? Pierwsza linia w oknie danych zaczyna sie tak:

:0087F9F8    70 1E 4D 00 ....itd.

Pamietasz, gdzie byl nasz serial? 004D1E70. A jakby tak zapisac to, co widzimy w oknie danych, tyle, ze w druga strone? Kewl, mamy adres naszego seriala!

Teraz tak samo mozesz przeanalizowac MOV EBX,[EBP+08].

OK, jedziemy dalej. Wskakujemy (F8) w CALL 0044B39C8. Zauwaz, ze przed tym CALL'em na stos poleciala zawartosc EBX, a wiec 'name'.

Newbies Note!

Zazwyczaj kiedy w rejestrze ECX wmieszczana jest wartosc FFFFFFFF, procedura oblicza ilosc znakow w serialu, nazwie.

Dochodzimy (F10) do RET wracamy. Jak widac, w rejestrze EAX znalazla sie 7. Iwan'98 na 7 znakow. Wszystko gra.

Dalej znajdujemy:

:0048E61B    CMP EAX,05
:0048E61B    JAE 0048E624

Liczba znakow w 'name' jest porownywana z 5, jump linijke nizej 'przepuszcza' jedynie, gdy wieksza lub rowna. Ten warunek udalo wiec sie nas spelnic :)

Jedziemy dalej do:

:0048E626    CALL 0048E528

Tam, oprocz PUSHy nazwy i seriala zauwazamy:

:0048E534    PUSH 2D

Sprawdzamy, co kryje sie pod 2D:

? 2D

No tak, myslnik ('-'). Dwie linie nizej jest CALL, ktory wywoluje m.in. cos takiego:

:004B3989    MOV EDI,EDX
:004B398B    MOV AL,(EBP+0C]
:004B398E    REPNZ SCASB
:004B3990    JNZ 00483998

W EDI jest nasz serial, do AL trafia '-' (czyli w EAX jest 2D). Jezeli myslnik nie zostanie w serialu znaleziony, jump wysyla nas ostatecznie do Bad_Boy_Go_Away. Coz, wiemy juz teraz, ze w serialu MUSI znalezc sie myslnik. Musimu wiec na chwile przerwac analize kodu i wrocic do okna rejestracyjnego.

Proponuje przedtem zawiesic pulapke na HMEMCPY (BD 0). Poprawmy nasz serial, np. z 34343434 na 3434-5656. Wracamy do SoftIce, uruchamiamy znow nasza pulapke (BE 0). Co dalej? Jedziemy od poczatku tak, jak to wyzej przerobilismy, az do linii :004B3990. Teraz, jak widac, skok nie zostanie wykonany, mozemy wiec badac dalej.

:004B3992    LEA EAX,[EDI-01]

Do EAX wpisywana jest czesc seriala od myslnika wzwyz.

Przechodzimy przez RET i znajdujemy:

:0048E550    CALL 004B8D5C

i pozniej

:0048E577    CALL 004B39C8

Szczegolowa analize tych wywolan pozostawiam wytrwalym, podpowiem tylko, ze: pierwszy CALL sprawdza, czy znaki w serialu meiszcza sie w przedziale <0;9>, drugi naatomiast ponownie oblicza liczbe znakow w 'name' (???).

Poczawszy od linii 0048E594MOVZX ESI,BYTE PTR [ECX] obliczany jest prawdziwy serial (a wlasciwie jego czesc przed myslnikiem), nalezy wiec cierpliwie przez ten fragment przebrnac. Jump w linii :0048E5AE bedzie nas odsylal tak dlugo do :0048E594, az nie wyczerpia sie kolejne cyfry w serialu przed myslnikiem. Kiedy to nastapi, mozemy juz spokojnie zejsc do kolejnej linii:

:0048E5B0    CMP EBX,[EBP-04]

Hmm, coz to za mile porownanie? Sprawdzmy, co kryje w sobie [EBP-04]

D EBP-4

Znacie juz sposob na 'czytanie od konca'? Przerabialismy go w tym i w poprzednim tutorialu. Widzimy wiec pierwsza linijke w oknie danych:

:0087F9CC    6A 0D 00 ....

Wiemy wiec, ze nalezy sprawdzic to 'od konca':

? 0D6A

Kewl, nasz wpisany serial (do myslnika). Jak myslicie, z czym moze byc porownywany?

? EBX

Tak, to pierwsza czesc PRAWDZIWEGO seriala :)). Zapisz ja! W naszym przypadku to 3085.

Linia nizej to jump:

: 0048E5B3    JZ 0048E5B9

W tej chwili program ani mysli skakac pod wskazany adres. Dlaczego? Po prostu powyzsze porownanie nie dalo w rezultacie zero (bo obie strony nie byly sobie rowne).

Newbies Note!

Porownanie (CMP) polega na tym, ze jedna wartosc zostaje odjeta od drugiej. Jezeli wiec porowna sie te same wartosci, otrzymamy zero.

Ooops, chyba przesadzilem z ta lopatologia ;)

Wrocmy do kodu. Aby ten skok zostal wykonany, powinnismy wrocic do okna rejestracyjnego, poprawic pierwszy czlon naszego seriala na wlasciwy i dojsc znow do tego miejsca. OK, kto chce moze tak zrobic. Ja proponuje szybsze rozwiazanie. Pamietacie, jak pod koniec poprzedniego tuta pisalem o flagach?

Well, wykorzystajmy to!

Znajdujac sie wiec w linii:

:0048E5AE    JZ 0048E5B9

zmienmy flage zerowa:

R FL Z

I program od razu bedzie chetny do wspolpracy :). Kewl.

Po skoku widzimy fragment, ktory wydaje sie znajomy. Zaczynajac od linii :0048E5CD kalkulowany jest drugi czlon seriala. Znow musimy cierpliwie przebrnac przez kolejne skoki w linii :0048E5EE (w naszym przypadku cztery razy), az dojdziemy do:

:0048E5F0    CMP EBX,[EBP-08]

Chyba wiecie juz co to oznacza. Jak poprzednio pod EBP-08 jest wpisany przez nas serial (jego druga czesc), czyli:

D EBP-8
I
? 1618

Czas na zakonczenie zabawy.

? EBX

Tak, to drugi czlon naszego seriala (w naszym przypadku 21..., a zreszta widac).

Teraz juz znasz mechanizm generowania seriala w mIRC 5.41 Jezeli cos bylo niejasne, z czyms sie nie zgadzasz, napisz.

17/12/98 by iwan (iwy@friko.onet.pl)