I. Prolog

	Czekajac na zaliczenie trzeciego etapu w rea natrafilem na drugie w polsce reme.
Pierwszym bylo KrowaX autorstwa geda, dzisiejsze reme napisal muszyn. A wiec do dziela.
Reverseme jest proste i nie powinnismy miec z nim zadnych problemow.


II. Konkrety

	No wiec program sie nie uruchamia, no nic czytamy w nfo ze trzeba zmienic jeden
bajt. Wrzucamy do procdumpa exeka, jakis blad wyskoczyl. Co moze byc przyczyna? Zobaczmy
co pokaze nam hiew. Akurat ja nie musialem dlugo szukac, otoz pod offsetem, ktory 
normalnie wskazuje naglowek PE (3Ch) sa jakies pasci, a naglowek PE jest troche dalej.
Wiec zmieniamy wartosc 20 na 80 i uruchamiamy exe'ka. Oczom naszym ukazuje sie piekne
czarne okienko z lista funkcji jakie mozemy wybrac. No wiec wciskamy "a" aby dowiedziec
sie co mamy naprawic :) W skrocie: mamy dodac hotkey'a, sprawic w ogole aby wszystkie
funkcje byly dostepne no i zeby program sie uruchamial zminimalizowany.

	Wrzucamy proga do idy i ogladamy sobie kod. Pod adresem 401694 mamy obsluge
naszego okna:

seg000:00401694                 push    ebp
seg000:00401695                 mov     ebp, esp
seg000:00401697                 sub     esp, 15Ch
seg000:0040169D                 push    edi
seg000:0040169E                 push    esi
seg000:0040169F                 push    ebx
seg000:004016A0                 cmp     [ebp+Msg], 0Fh		;czy wm_paint
seg000:004016A4                 jz      loc_0_4017D0
seg000:004016AA                 ja      short loc_0_4016C0
seg000:004016AC                 cmp     [ebp+Msg], 1		;czy wm_create
seg000:004016B0                 jz      short loc_0_4016D7
seg000:004016B2                 cmp     [ebp+Msg], 2		;czy wm_destroy
seg000:004016B6                 jz      short loc_0_4016F0
seg000:004016B8                 jmp     loc_0_401859

	Hotkey'e rejestruje sie podczas inicjalizacji (wm_create), wiec idziemy pod
short loc_0_4016D7

seg000:004016D7 loc_0_4016D7:                           ; CODE XREF: sub_0_401694+1Cj
seg000:004016D7                 push    57h             ; vk
seg000:004016D9                 push    2               ; fsModifiers
seg000:004016DB                 push    11h             ; id
seg000:004016DD                 mov     eax, [ebp+hWnd]
seg000:004016E0                 push    eax             ; hWnd
seg000:004016E1                 call    RegisterHotKey
seg000:004016E6                 jmp     loc_0_401870

	Musimy wiec dodac jeszcze jednego hotkey'a. Szukamy miejsca, gdzie bedzie
mozna dopisac kawalek kodu. Ja zaczalem od 401C32. Wiec musimy wpisac podobnie jak
wyzej:

.00401C32: 6A42                         push        042
.00401C34: 6A02                         push        002
.00401C36: 6A12                         push        012
.00401C38: 8B4508                       mov         eax,[ebp][08]
.00401C3B: 50                           push        eax
.00401C3C: E807FFFFFF                   call        RegisterHotKey ;USER32.dll
.00401C41: E92AFCFFFF                   jmp        .000401870  ----- (2)

	Pierwszy push okresla jaki klawisz ma byc hotkeyem (tutaj 42h = "B"), drugi
okresla modyfikatory, czyli czy ma byc wcisniety CTRL, SHIFT lub ALT (tutaj CTRL),
trzeci push to identyfikator hotkey'a no a czwarty to ucwhyt okna. Nastepnie
wywolanie RegisterHotKey no i skok. Teraz pod adresem 4016E6 zmieniamy skok.
W koncu nasz program musi zarejestrowac dwa hotkey'e. Wiec zmieniamy stary skok na:

.004016E6: E947050000                   jmp        .000401C32  ----- (2)

	Ok, hotkey jest zarejestrowany, teraz zajmiemy sie jego obsluga. Wracamy do
oblsugi okna, widzimy ze jak wiadomosc powyzej 0Fh to skok:

seg000:004016AA                 ja      short loc_0_4016C0

a pod nim:

seg000:004016C0 loc_0_4016C0:                           ; CODE XREF: sub_0_401694+16j
seg000:004016C0                 cmp     [ebp+arg_4], 100h	;czy wm_keyfirst
seg000:004016C7                 jz      short loc_0_401728
seg000:004016C9                 cmp     [ebp+arg_4], 312h	;czy wm_hotkey
seg000:004016D0                 jz      short loc_0_401710
seg000:004016D2                 jmp     loc_0_401859

Widzimy oblsluge hotkey'ow pod short loc_0_401710, idziemy tam:

seg000:00401710 loc_0_401710:                           ; CODE XREF: sub_0_401694+3Cj
seg000:00401710                 cmp     [ebp+wParam], 11h
seg000:00401714                 jnz     loc_0_401870
seg000:0040171A                 push    40h
seg000:0040171C                 push    offset aHotkey  ; "Hotkey!"
seg000:00401721                 push    offset aHotkeyIsAGoodT ; "Hotkey is a good thing - CTRL-W ;-D"
seg000:00401726                 jmp     short loc_0_4017A4

Niestety muszyn nie zaimplementowal nam oblsugi innych hotkey'ow, coz czeka nas po
prostu troche wiecej pracy. Zmieniamy skok spod 401710 na:

.00401714: 0F852E050000                 jne        .000401C48  ----- (6)

i pod adresem 401C48 umieszczamy nastepujacy kod wyswietlajacy message box'a.

.00401C48: 837D1012                     cmp         d,[ebp][10],012 ;""
.00401C4C: 0F851EFCFFFF                 jne        .000401870  ----- (3)
.00401C52: 6A40                         push        040
.00401C54: 68CE124000                   push        0004012CE  ----- (4)
.00401C59: 68D01D4000                   push        000401DD0  ----- (5)
.00401C5E: E941FBFFFF                   jmp        .0004017A4  ----- (6)

Kod ten sprawdza czy nacistnieto CTRL-B. Push 401DD0 okresla miejsce gdzie umiescilem
tekst "You put CTRl-B" czyli taki jaki chcial od nas autor. Zapisujemy zmiany,
sprawdzamy, dziala, dobra jedna czesc za nami, hotkeye mamy z glowy. Pozostalo jeszcze
wsuniecie tacki, naprawienie ESC i minimalizacje podczas startu.

Szukamy miejsca, gdzie wysuwa sie nasza kochana tacka. (heh jestem ciekawy czy muszyn
pomyslal ze ktos nie ma cdromu ;) 

seg000:00401728 loc_0_401728:                           ; CODE XREF: sub_0_401694+33j
seg000:00401728                 cmp     [ebp+wParam], 41h
seg000:0040172C                 jz      short loc_0_401750
seg000:0040172E                 ja      short loc_0_401740

Widzimy tu obsluge klawiszy i skok ja, skaczemy tam:

seg000:00401740                 cmp     [ebp+wParam], 4Fh	;nacisnieto "O" ?
seg000:00401744                 jz      short loc_0_401760
seg000:00401746                 jmp     loc_0_401870

pod adresem 401C63, ktora bedzie bardzo podobna do tej spod loc_0_401760, z jedna
zmiana zamiast wysuwac tacke my bedzie ja wsuwac z powrotem, a kod ktory to wykonuje
wyglada tak:

.00401C63: 83C4F4                       add         esp,-00C ;""
.00401C66: 6840164000                   push        000401640  ----- (2)
.00401C6B: E888FFFFFF                   call        LoadLibraryA ;KERNEL32.dll
.00401C70: 83C4F4                       add         esp,-00C ;""
.00401C73: 684A164000                   push        00040164A  ----- (4)
.00401C78: 50                           push        eax
.00401C79: E882FFFFFF                   call        GetProcAddress ;KERNEL32.dl
.00401C7E: 89C2                         mov         edx,eax
.00401C80: 83C4F8                       add         esp,-008 ;""
.00401C83: 6A00                         push        000
.00401C85: 68FF000000                   push        0000000FF ;"   _"
.00401C8A: 8D85C0FEFFFF                 lea         eax,[ebp][-00000140]
.00401C90: 50                           push        eax
.00401C91: 68B01D4000                   push        000401DB0  ----- (6)
.00401C96: FFD2                         call        edx
.00401C98: 83C420                       add         esp,020 ;" "
.00401C9B: 6A40                         push        040
.00401C9D: 686F164000                   push        00040166F  ----- (7)
.00401CA2: 68901D4000                   push        000401D90  ----- (8)
.00401CA7: E9F8FAFFFF                   jmp        .0004017A4  ----- (9)

Tak to prawda ze dlugie, no ale wazne ze bedzie dzialac. Kod ten szuka funkcji
odpowiedzialnej za wsuwanie/wysuwanie tacki. Jedyna zmiana sa argumentu dla tej
funkcji, konkretnie push spod 00401C91. Jest to offset to tekstu "set cdaudio door closed",
po wywolaniu tej funkcji nasza tacka sie wsunie z powrotem o czym informuje za pomoca
ladnego messagebox'a. push 401D90 jest wlasnie takim tekstem. Ostatni skok to oczywiscie
wywolanie messagebox'a.

Za tym kodem, ktory przed chwila wstawilismy trzeba jeszcze umiescic obsluge tego
podprogramu:

.00401CAC: 837D1043                     cmp         d,[ebp][10],043 ;"C"	;czy "C"
.00401CB0: 0F85BAFBFFFF                 jne        .000401870  ----- (6)
.00401CB6: EBAB                         jmps       .000401C63  ----- (7)

Tak wiec mamy juz kod odpowiedzialny za wsuniecie tacki, wiec pod adresem 00401746
zmieniamy skok aby oblsuzyl nasz kod:

.00401746: E961050000                   jmp        .000401CAC  ----- (6)

Zblizamy sie juz do konca. Naciskajac ESC wlacza nam sie jakis wygaszacz ekranu,
a powinien program konczyc swoje dzialanie. Szukamy wiec kodu za to odpowiedzialnego:

seg000:00401730                 cmp     [ebp+wParam], 1Bh
seg000:00401734                 jz      short loc_0_4017B2

Wystarczy tylko zmienic skok na procedure zamkniecia okna i po problemie. Taki
podprogram jest pod 4016F0, wiec nasz skok bedzie wygladal tak:

.00401730: 837D101B                     cmp         d,[ebp][10],01B ;""
.00401734: 74BA                         je         .0004016F0  ----- (6)

No i ostatnia czesc zadania. Minimalizacja podczas startu. Szukamy wiec sobie wywolania
ShowWindow odpowiedzialnego za sposob wyswietlenia okna:

seg000:00401930                 add     esp, 0FFFFFFF8h
seg000:00401933                 push    3               ; nCmdShow
seg000:00401935                 push    ebx             ; hWnd
seg000:00401936                 call    ShowWindow

pierwszy push okresla sposob wyswietlenia, mamy do wyboru:

SW_HIDE				equ	 0
SW_SHOWNORMAL			equ	 1
SW_NORMAL			equ	 1
SW_SHOWMINIMIZED		equ	 2
SW_SHOWMAXIMIZED		equ	 3
SW_MAXIMIZE			equ	 3
SW_SHOWNOACTIVATE		equ	 4
SW_SHOW				equ	 5
SW_MINIMIZE			equ	 6
SW_SHOWMINNOACTIVE		equ	 7
SW_SHOWNA			equ	 8
SW_RESTORE			equ	 9
SW_SHOWDEFAULT			equ	10
SW_MAX				equ	10

nas interesuje postac zminimalizowana wiec zmieniamy:
	push 3 --> push 6

Zapisujemy zmiany. Uruchamiamy..program dziala poprawnie :)


III. Epilog

Greetz to:	-UnderPl group
		-#crackscene
		-Liquid
		-mYSTERiO9
		-wszystkich reverserow swiata

www:		www.reverser-course.de - calkiem fajny wyscig reverserow (choc nie tylko)
		underpl.tk - visit us :)
		www.cracking.pl - polski portal crackerski!

wszystko co do mnie macie ... shield@box43.pl

zdroovko
shield^un