LeapFTP 2.2 by Ptasiek

Cel  : LeapFTP 2.2
Co   : serial
Czym : SoftICE
Skad : Pc Shareware 2/99

Zaczynamy!

Uruchamiamy program i rozkoszujemy sie widokiem gradientowanego paska tytulowego programu.

Po chwili zachwytu pierwsze spostrzezenia: Napis '(Unregistered)', oraz mozliwosc zarejestrowania proga przez /Help/Registering. Trzeba wpisac username i serial. Robimy to: 'Ptasiek' i '30091981'

Wchodzimy do SI (CTRL+D) jezeli nie pojawia sie okno SI to sprawdz w autoexec'u czy jest zaladowany: Powinna byc tam linia: C:\SIW95\WINICE.EXE

Jezeli jest REM C:\SIW95\WINICE.EXE to skasuj wyraz REM i zresetuj kompa. Po ponownym uruchomieniu winshita wszystko powinno byc OK. So po wejsciu do SI zastawiamy standardowe breakpointy:

->bpx getdlgitemtexta
->bpx getwindowtexta

Wychodzimy z SI i naciskamy OK. Program sie zatrzymuje, a my ladujemy w SI tuz za wywolaniem funkcji GetWindowTexta. Dla pewnosci sprawdzimy czy funkcja odwoluje sie do naszych stringow.

Jak to zrobic?

Funkcja GetWindowTexta zwraca dlugosc pobranego textu w rejestrze EAX

So 'Ptasiek' - 7 bajtow, '30091981' - 8 bajtow. Podgladamy rejestr EAX

->? EAX

I co uzyskujemy: EAX=11D (hex 0B)

Czyli cos tu nie gra. Skasujmy zastawione breakpointy i zastawmy nowy: przechwycimy odwolanie do funkcji API: hmemcpy.

hmemcpy kopiuje fragment pamieci w inne miejsce np: wpisany text pod adres ustalony przez program

->bc *
->bpx hmemcpy

Naciskamy OK i jestesmy w kodzie, niestety nie bezposrednim proga, ale w kodzie funkcji hmemcpy.

Wylaczamy breakpointy:

->bd *

Zeby nie wyskoczyc z SI pozwolmy wykonac te funkcje krok po kroku (naciskamy F10), az do momenty gdy sie zakonczy (po wykonaniu instrukcji RET)

Po przechwyceniu tej funkcji ladujemy w jakiejs bibliotece systemowej bo funkcja hmemcpy wchodzi w sklad wielu innych bardziej rozbudowanych funkcji API.

Informacje o tym, ze odwolania do tych funkcji wystapily z kodu glownego naszego proga uzyskujemy patrzac na prawy dolny rok ekranu. Jest nam nazwa proga odwolujacego sie do API

Jestesmy w bibliotece USER. Teraz mozemy naciskac F12, bez obawy ze wyskoczymy za wczesnie.

F12 powoduje wykonanie calej procedury lub funkcji w ktorej sie aktualnie znajdujemy

Naciskamy F12 do mementu, gdy znajdziemy sie w kodzie naszego proga. Nad linia polecen bedzie nazwa naszego proga. Ok, jestesmy, przeszukajmy teraz pamiec w poszukiwaniu naszych textow(UWAGA lepiej wroc na poczatek tego textu i wpisz inne dane bo bedzie za duzo Ptaskow w pamieci i sie nie polapiesz co jest co)

->s ds:0 l ffffff 'Ptasiek' 

Co oznacza ds:0 Jest to adres poczatkowy segmentu danych ffffff - dlugosc obszaru do przeszukania (troche na wyrost)

Ale name na razie nas nie interesuje. Znadujemy nasz serial:

->s ds:0 l ffffff '30091981'

No i mamy adres(jest widoczny w oknie danych): C11954(u Ciebie niekoniecznie bedzie taki sam).

Ustawiamy breakpoint na ten adres:

-> bpmd c11954

bmpd adres_pamieci RW- nakazuje SI zatrzymac prog w chwili gdy zacznie dobierac sie do danych pod adres_pamieci (R-odczyt,W-zapis), a dokladnie do pierwszych 4 bajtow.

I naciskamy F5. Zatrzymujemy sie na 403944:

REPNZ SCASB

Ta sekwencja rozkazow assemblera oznacza:

REPNZ rozkaz - powtarzaj rozkaz ECX razy, ale przerwij gdy flaga Z=1

SCASB - sprawdz czy bajt pod [EDI]=AL. Jesli tak to wpisz Z=1. Poza tym zawsze zwieksza EDI o 1.

Innymi slowy te instrukcje szukaja pierwszego wystapienia bajtu rownego AL, i zatrzymuja na nim adres [EDI].

Co jest pod [EDI]?:

->d edi

Nasz serial->

Czegoz moze prog szukac w naszym serialu: Sprawdzamy zawartosc rejestru al:

->? al 

Znajdujemy myslnik '-' - a wiec ten znak wchodzi w sklad poprawnego seriala. Ustawiamy breakpoint na ten adres, zeby szybko do niego wrocic:

-> bpx 403944

i Wychodzimy z SI (CTRL+D), wstawiamy myslnik w serial i naciskamy OK. Ladujemy wiadomo gdzie( dla mniej pojetnych - pod 403944) i naciskamy pare razy F10. Dochodzimy do REPNZ COMPSB - COMPSB porownuje bajt [ESI] z bajtem [EDI] i ustawia z=1 gdy sa rowne oraz zwieksza ESI i EDI o 1 czyli powoduje, ze wskazuja na kolejne znaki stringa, REPNZ - patrz wyzej. Co jest w tych rejestrach:

-> d edi !!!nasz serial!!!
-> d esi ???jakies bzdury???

Ale EDX=0 wiec prog sprawdza tylko, czy przypadkiem nasz serial nie konczy sie myslnikiem. Dlaczego sprawdzilem EDX chcac znac ilosc porownan? Otoz po REP..., ECX zmniejsza sie o 1, a w naszym przypadku przed tymi instrukcjamy bylo:

MOV ECX,EDX.

Kazdy standardowy string konczy sie niewidocznym znakiem o kodzie ASCII=0, co pozwala okreslic jego dlugosc

Dobra idziemy(F10) i skaczemy. Az napotkamy taki kod:

MOV EAX,[EBP-38]
MOV EDX,[EBP-08]
CALL costam
JNZ gdziestam

Sprawdzamy na co wskazuja te rejestry(w oknie danych):

-> d eax ;czesc naszego seriala przed myslnikiem
-> d edx ;ciekawe rzeczy - zapisujemy numer

Wyglada na to ze procka 'costam' porownuje oba numery a skok jest wynikiem porownania. Oczywiscie bedzie do skok do bad procki wiec zmienmy flage:

->r fl z

aby przejsc dalej. Idziemy na piechote uzywajac F10 az natrafimy na:

MOV EAX,[EBP-38]
MOV EDX,[EBP-14]
CALL porownanie
JNZ gdziestam

Sprawdzamy na co wskazuja rejestry chyba wiesz jak. Spisujemy poprawna druga czesc seriala(spod [EDX]). Usuwamy breakpointy:

->bc *

Wychodzimy z SI i rejestrujemy LeapFTP 2.2.Nie zapomnij o myslniku miedzy obiema czesciami seriala. Jesli cos jest niezrozumiale to napisz.

Ptasiek
dreadpl@polbox.com