Witam,

Tak jakos mnie naszlo odwiedzic stronke crackmes.prv.pl, aby cos nowego pokraczyc ;>, a tu Shield (Hi :)) wydal swoje pierwsze reverseme ;>

Zobaczmy co mamy zrobic:
- dodac procedurke zapisu tekstu do bitmapy
- i mozna uzywac dllek ;> (to sie akurat dobrze sklada bo nie lamalem jeszcze reversmesow poprzez napisanie wlasniej biblioteki a mam na to ochote :P)

let's start...

zobaczmy jak odczytywany jest ukryty tekst z bitmapy:
(w tym celu do idy ladujemy unhide.exe)

CODE:004010E8                 push    0               ; hTemplateFile
CODE:004010EA                 push    20h             ; dwFlagsAndAttributes
CODE:004010EC                 push    3               ; dwCreationDisposition
CODE:004010EE                 push    0               ; lpSecurityAttributes
CODE:004010F0                 push    3               ; dwShareMode
CODE:004010F2                 push    0C0000000h      ; dwDesiredAccess
CODE:004010F7                 push    offset unk_0_402064 ; lpFileName
CODE:004010FC                 call    CreateFileA
CODE:00401101                 mov     ds:hFile, eax
CODE:00401106                 push    50000h          ; dwBytes
CODE:0040110B                 push    42h             ; uFlags
CODE:0040110D                 call    GlobalAlloc
CODE:00401112                 mov     ds:dword_0_402058, eax
CODE:00401117                 push    eax             ; hMem
CODE:00401118                 call    GlobalLock
CODE:0040111D                 mov     ds:lpBuffer, eax
CODE:00401122                 push    0               ; lpOverlapped
CODE:00401124                 push    offset unk_0_402060 ; lpNumberOfBytesRead
CODE:00401129                 push    4FFFFh          ; nNumberOfBytesToRead
CODE:0040112E                 push    ds:lpBuffer     ; lpBuffer
CODE:00401134                 push    ds:hFile        ; hFile
CODE:0040113A                 call    ReadFile
CODE:0040113F                 mov     esi, ds:lpBuffer
CODE:00401145                 mov     edi, offset unk_0_4022B1
CODE:0040114A                 mov     eax, [esi+0Ah]
CODE:0040114D                 add     esi, eax
CODE:0040114F                 sub     eax, eax
CODE:00401151                 dec     esi
CODE:00401152 
CODE:00401152 loc_0_401152:                           ; CODE XREF: start+16Aj
CODE:00401152                 sub     ecx, ecx
CODE:00401154 
CODE:00401154 loc_0_401154:                           ; CODE XREF: start+15Fj
CODE:00401154                 inc     esi
CODE:00401155                 mov     dl, [esi]
CODE:00401157                 ror     dl, 1
CODE:00401159                 rcr     dh, 1
CODE:0040115B                 inc     ecx
CODE:0040115C                 cmp     ecx, 8
CODE:0040115F                 jb      short loc_0_401154
CODE:00401161                 cmp     dh, 0
CODE:00401164                 jz      short loc_0_40116C
CODE:00401166                 mov     [edi+eax], dh
CODE:00401169                 inc     eax
CODE:0040116A                 jmp     short loc_0_401152
CODE:0040116C ; 
CODE:0040116C 
CODE:0040116C loc_0_40116C:                           ; CODE XREF: start+164j
CODE:0040116C                 push    0               ; uType
CODE:0040116E                 push    offset aTibReader ; lpCaption
CODE:00401173                 push    offset unk_0_4022B1 ; lpText
CODE:00401178                 push    0               ; hWnd
CODE:0040117A                 call    MessageBoxA


Ok.. jak narazie jest very simple ;>

Teraz obczaimy jakie sa ID poszczegolnych buttonow:

Wczytaj plik - 69h
Zapisz       - 68h

Po wczytaniu pliku program powinien odczytac z bitmapy ukryty text i wyswietlic go na polu textowym - 66h

Pod VA=00401430h mamy duzo wolnego miejsca aby umiescic dodatkowy kod..

Tak wyglada kod wczytujacy plik:

CODE:004012BA                 call    GetOpenFileNameA
CODE:004012BF                 test    eax, eax
CODE:004012C1                 jz      short loc_0_4012C9
CODE:004012C3                 inc     ds:byte_0_4023F9
CODE:004012C9 
CODE:004012C9 loc_0_4012C9:                           ; CODE XREF: sub_0_401033+28Ej
CODE:004012C9                 pop     esi
CODE:004012CA                 pop     edi
CODE:004012CB                 pop     ebx
CODE:004012CC                 leave
CODE:004012CD                 retn    10h

teraz zmienimy go na

CODE:004012BA                 call    GetOpenFileNameA
   E96C010000                 jmp  00401430h


CODE:004012C9                 pop     esi
CODE:004012CA                 pop     edi
CODE:004012CB                 pop     ebx
CODE:004012CC                 leave
CODE:004012CD                 retn    10h



Teraz pod 00401430h (830h w pliku) dopisujemy kod:

85C0                 test    eax, eax
0F8491FEFFFF         jz      loc_0_4012C9

Teraz dodamy sobie 2 importy, ktore beda sie odwolywaly do naszej dll'ki o nazwie np. "teston.dll"..

1. ReadData (FileName: String): String;
2. WriteData (FileName, NewData: String): Integer;
   zwraca:
     STATUS_WRITE_DONE    equ 0
     STATUS_WRITE_SMALL   equ 1
     STATUS_WRITE_NOFILE  equ 2  

Ok, teraz pod 1822 (00406022h) bedzie VA do ReadData a pod 1826 (00406026h) bedzie VA do WriteData..


dalszy kod:

68AC214000              push 004021ACh   ; offset do nazwy pliku
FF1522604000            call ds:00406022h ; ReadData
50                      push eax
6A66                    push    66h
FF7508                  push    [ebp+hDlg]
E88EFFFFFF              call SetDlgItemTextA
E975FEFFFF              jmp loc_0_4012C9

ok.. teraz pod 004012F5h zmienimy nieco kod gdyz otwierac plik bedzie nasza funkcja w dllce.. wiec zrobimy tam tylko obsluge WriteData

nopujemy 9 bajtow pod 004012D0h

teraz pod 004012F5h:

68FA234000              push 004023FAh    ; NewData
68AC214000              push 004021ACh    ; Openned FileName
FF1526604000            call ds:00406026h ; WriteData
83F800                  cmp eax, 0
745B                    jz _good
83F801                  cmp eax, 1
745D                    jz _small
EB41                    jmp _no_file

Tak oto zrobilismy obsluge naszych funkcji.. teraz mozemy sie zajac nimi samymi..

Ok.. zrobione :)

ReverseMe 1 by Shield is now reversed ;>>

Done by _TeStON_/UnderPl
mailto:teston@chesti.com
http://teston.spox.biz/
                        