rendered paste body;-------------------------------------------------------------------------------
; MODEL INFO
;-------------------------------------------------------------------------------
.486
.mmx
.model flat ,stdcall
option casemap:none
;-------------------------------------------------------------------------------
; INCLUDES
;-------------------------------------------------------------------------------
include windows.inc
include user32.inc
include kernel32.inc
include comctl32.inc
include comdlg32.inc
include shell32.inc
include advapi32.inc
include gdi32.inc
include imagehlp.inc
includelib imagehlp.lib
includelib gdi32.lib
includelib comctl32.lib
includelib comdlg32.lib
includelib shell32.lib
includelib advapi32.lib
includelib user32.lib
includelib kernel32.lib
assume fs:flat
;-------------------------------------------------------------------------------
; CONST
;-------------------------------------------------------------------------------
.const
DIALOG_1 =10
DIALOG_2 =40
ICO =30
S_PROGNAME =11
S_STATUS =32
S_FILENAME =13
S_FILESIZE =14
S_BYTES =15
S_WRITE =16
S_SEP =17
S_CRACK =18
C_FILENAME =19
C_FILESIZE =20
C_BYTES =21
C_WRITE =22
C_SEP =23
C_CRACK =24
B_CRACK =25
B_RESTORE =26
B_SOURCE =27
B_ABOUT =28
B_EXIT =29
S_CRKR =30
S_BYS =100
A_PROGRAM =45
A_EXENAME =46
A_CRACKER =47
A_INFO =49
A_DATE =51
A_FIRSTWWW =52
A_SECONDWWW =53
A_EXIT =54
A_COMBOBOX =55
A_INFOLABEL =56
DlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
AboutProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
ClearCrack PROTO
Patch PROTO :DWORD,:DWORD,:DWORD,:DWORD
SetText PROTO :DWORD,:DWORD,:DWORD
RWProc PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
Check PROTO :DWORD
;----------------------------------------------------------------------------
; DATA?
;----------------------------------------------------------------------------
.data?
stBrowseDir BROWSEINFO <?>
szDisplayName db 1024 dup (?)
szTempBuf db 1024 dup (?)
szTempPatch db 1024 dup (?)
hFont dd ?
hK dd ?
open_dialog OPENFILENAME <?>
hFile dd ?
_maping dd ?
_mapView dd ?
_font dd ?
_sciezka db 2048 dup (?)
;----------------------------------------------------------------------------
; CODE
;----------------------------------------------------------------------------
.code
; ###########################################################################
;Main Dialog
szOk db "OKi!",0
szNotFound db "Not found",0
szBadSize db "Bad size",0
szBadBytes db "Bad bytes",0
szSep2 db "----------------",0
szCrackedOk db "Complete!",0
szRestoredOk db "Restored",0
szIsCracked db "IS cracked",0
szNotCracked db "NOT cracked",0
szAborted db "Aborted",0
szNothing db "-",0
szMutex db "Mutex",0
szInfoFolder db " ",0
ofFiles dd offset szFile01
ofOffsets dd offset szOffsets01
ofBytesOld dd offset szBytesOld01
ofBytesNew dd offset szBytesNew01
szFirstShell db " ",0
szCracker db "Cracked by K3nny - K3NNY@SEZNAM.CZ", 0
szDate db "23.8.2003", 0
szFSb db "40 960 bytes", 0
szProgramName db "XXX crackme #1", 0
_filter db 'cme1.exe', 0 ,'cme1.exe',0,0
szInfoApp db " ", 0
szSecondShell db " ", 0
szExeName db 'cme1.exe',0
_selectfile db 'Choose target file:'
iFilesx dd 01h
iSizesx dd 0A000h
iBytesx dd 02Dh
szFile01 db "cme1.exe", 0
szOffsets01 dd 03C40h,03C41h,03C42h,03C43h,03C44h,03C45h,03C46h,03C47h,03C48h,03C49h,03C4Ah,03C4Bh,03C4Ch,03C4Dh,03C4Eh,03C4Fh,03C50h,03C51h,03C52h,03C53h
dd 03C54h,03C55h,03C56h,03C57h,03C58h,03C59h,03C5Ah,03C5Bh,03C5Ch,03C5Dh,03C5Eh,03C5Fh,03C60h,03C61h,03C62h,03C63h,03C64h,03C65h,03C66h,03C67h,03C68h,03C69h,03C6Ah,03C6Bh,03C6Ch
szBytesOld01 db 037h,035h,034h,033h,031h,033h,035h,033h,037h,039h,038h,034h,033h,039h,034h,036h,034h,035h,039h,034h
db 030h,031h,036h,037h,039h,031h,030h,030h,033h,037h,034h,031h,030h,033h,035h,030h,038h,031h,035h,030h,030h,037h,030h,034h,039h
szBytesNew01 db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
db 00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h,00h
; ###########################################################################
;----------------------------------------------------------------------------
; START
;----------------------------------------------------------------------------
start:
invoke CreateMutexA,0,0,offset szMutex
invoke GetLastError
.if al!=ERROR_ALREADY_EXISTS
invoke DialogBoxParamA,400000h,DIALOG_1,0,offset DlgProc,0
.endif
invoke ExitProcess,0
;----------------------------------------------------------------------------
; CRACK
;----------------------------------------------------------------------------
DlgProc proc uses edi esi ebx hWnd:DWORD, wmsg:DWORD, wParam:DWORD, lParam:DWORD
LOCAL _temp1,_temp2:DWORD
xor ebx,ebx
mov esi,hWnd
movzx eax, word ptr [wmsg]
cmp ax, WM_INITDIALOG
jz _initdlg
cmp ax, WM_CLOSE
jz _wmdestroy
cmp ax,WM_COMMAND
jz _wmcommand
xor eax, eax
ret
;-------------------------
; WM COMMAND
;-------------------------
_wmcommand:
movzx eax, word ptr [wParam]
cmp ax, B_ABOUT
jz _about
cmp ax, B_EXIT
jz _wmdestroy
cmp ax, B_SOURCE
jz _source
cmp ax, B_CRACK
jz _crack
cmp ax, B_RESTORE
jz _restore
xor eax,eax
ret
;------------------
; CRACK
;------------------
_crack:
invoke ClearCrack
invoke Patch,offset ofBytesOld,offset ofBytesNew,offset szIsCracked,offset szCrackedOk
ret
;------------------
; RESTORE
;------------------
_restore:
invoke ClearCrack
invoke Patch,offset ofBytesNew,offset ofBytesOld,offset szNotCracked,offset szRestoredOk
ret
;------------------
; SOURCE
;------------------
_source:
invoke GetOpenFileName, addr open_dialog
test eax,eax
jz _n
_n: ret
;------------------
; ABOUT
;------------------
_about:
invoke DialogBoxParamA,400000h,DIALOG_2,esi,offset AboutProc,0
ret
;-------------------------
; WM DESTROY
;-------------------------
_wmdestroy:
invoke EndDialog,esi,ebx
ret
;-------------------------
; WM INITDIALOG
;-------------------------
_initdlg:
invoke CreateFontA,14,7,ebx,ebx,700,ebx,ebx,ebx,1,ebx,ebx,ebx,ebx,ebx
mov hFont,eax
invoke SetText,S_PROGNAME,offset szProgramName,esi
invoke CreateFontA,10,5,ebx,ebx,700,ebx,ebx,ebx,1,ebx,ebx,ebx,ebx,ebx
mov hFont,eax
invoke SetText,S_CRKR,offset szCracker,esi
invoke SetText,C_SEP,offset szSep2,ebx
invoke SetText,A_EXENAME,offset szExeName,ebx
invoke SetText,S_BYS,offset szFSb,ebx
invoke SetText,A_DATE,offset szDate,ebx
invoke ClearCrack
invoke LoadIcon,400000h,ICO
invoke SendMessage,esi,WM_SETICON,1,eax
mov eax, offset open_dialog
assume eax:PTR OPENFILENAME
mov [eax].lStructSize,sizeof open_dialog
push hWnd
pop [eax].hWndOwner
mov [eax].hInstance,ebx
mov [eax].lpstrFilter, offset _filter
mov [eax].lpstrFile, offset _sciezka
mov [eax].nMaxFile,2048
mov [eax].lpstrTitle, offset _selectfile
mov [eax].Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES \
or OFN_EXPLORER or OFN_HIDEREADONLY or OFN_OVERWRITEPROMPT
ret
DlgProc endp
;----------------------------------------------------------------------------
; ABOUT
;----------------------------------------------------------------------------
AboutProc proc uses edi esi ebx hWnd:DWORD, wmsg:DWORD, wParam:DWORD, lParam:DWORD
mov esi, hWnd
xor ebx,ebx
movzx eax, word ptr [wmsg]
cmp ax, WM_INITDIALOG
jz _initdlg
cmp ax, WM_COMMAND
jz _wmcommand
xor eax,eax
ret
;-------------------------
; WM DESTROY
;-------------------------
_wmdestroy:
invoke EndDialog,esi,ebx
ret
;-------------------------
; WM COMMAND
;-------------------------
_wmcommand:
movzx eax, word ptr [wParam]
cmp ax, A_EXIT
jz _wmdestroy
mov ecx,offset szFirstShell
cmp ax, A_FIRSTWWW
jz _www
mov ecx,offset szSecondShell
cmp ax, A_SECONDWWW
jz _www
xor eax,eax
ret
szOpen db 'open',0
;------------------
; GO WWW
;------------------
_www:
invoke ShellExecute,ebx,offset szOpen,ecx,ebx,ebx,SW_SHOWNORMAL
ret
;-------------------------
; WM INITDIALOG
;-------------------------
_initdlg:
invoke SetText,A_INFO,offset szInfoApp,ebx
invoke SetText,A_DATE,offset szDate,ebx
ret
AboutProc endp
;----------------------------------------------------------------------------
; CHECK EXIST FILE
;----------------------------------------------------------------------------
; if file don't exist return 0
;----------------------------------------------------------------------------
Check proc uses edi szDir:DWORD
LOCAL stOpen:OFSTRUCT
mov esi, offset szFile01
mov edi, szDir
invoke lstrlen,edi
add edi,eax
invoke lstrlen,esi
inc eax
mov ecx,eax
rep movsb
lea eax,stOpen
invoke OpenFile,szDir,eax,OF_EXIST
inc eax
ret
Check endp
;----------------------------------------------------------------------------
; CLEAR CRACK
;----------------------------------------------------------------------------
; esi - hWnd
;----------------------------------------------------------------------------
ClearCrack proc
mov edi,offset szNothing
invoke SetDlgItemTextA,esi,C_FILENAME,edi
invoke SetDlgItemTextA,esi,C_FILESIZE,edi
invoke SetDlgItemTextA,esi,C_BYTES,edi
invoke SetDlgItemTextA,esi,C_WRITE,edi
invoke SetDlgItemTextA,esi,C_CRACK,edi
ret
ClearCrack endp
;----------------------------------------------------------------------------
; SETTEX
;----------------------------------------------------------------------------
; esi - hWnd
;----------------------------------------------------------------------------
SetText proc id:DWORD,Sstr:DWORD,i:DWORD
mov edi,id
invoke SetDlgItemTextA,esi,edi,Sstr
.if i==esi
invoke SendDlgItemMessageA,esi,edi,WM_SETFONT,hFont,1
.endif
ret
SetText endp
;----------------------------------------------------------------------------
; PATCHING PROCEDURE
;----------------------------------------------------------------------------
Patch proc uses edi esi ebx old:DWORD,new:DWORD,is_no:DWORD,ok_res:DWORD
LOCAL hWnd:DWORD
LOCAL hHandles[32*3]:DWORD
xor eax,eax
mov ecx, 32*3
lea edi,hHandles
rep stosd
mov hWnd,esi
mov ecx, iFilesx
.while ecx!=0
push ecx
mov eax, iFilesx
sub eax, ecx
;------------------------------------------------
; FILE DIRECTORY
;------------------------------------------------
mov esi,offset ofFiles
mov esi, dword ptr [eax*4+esi]
imul eax, eax, 12
lea ebx,hHandles
lea ebx, [eax+ebx]
push esi
mov esi, offset szTempBuf
invoke lstrlen,esi
mov edi, offset szTempPatch
mov ecx, eax
rep movsb
pop esi
invoke lstrlen,esi
mov ecx, eax
inc ecx
rep movsb
;------------------------------------------------
; OPEN FILE
;------------------------------------------------
xor edi, edi
invoke CreateFileA,offset szTempPatch,GENERIC_READ + GENERIC_WRITE,edi,edi,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,edi
inc eax
jz _fileerr
dec eax
mov [ebx], eax
add ebx, 4
invoke CreateFileMappingA,eax,edi,PAGE_READWRITE,edi,edi,edi
test eax, eax
jz _fileerr
mov [ebx], eax
add ebx, 4
invoke MapViewOfFile,eax,FILE_MAP_ALL_ACCESS,edi,edi,edi
test eax, eax
jz _fileerr
mov [ebx], eax
pop ecx
dec ecx
.endw
invoke SetDlgItemTextA,hWnd,C_FILENAME,offset szOk
;--------------------------------------------------------
; FILE SIZE
;--------------------------------------------------------
mov ecx, iFilesx
mov ebx, offset iSizesx
lea esi,hHandles
.while ecx!=0
push ecx
invoke GetFileSize,[esi],0
cmp eax, [ebx]
jnz _size_err
add esi, 12
add ebx, 4
pop ecx
dec ecx
.endw
invoke SetDlgItemTextA,hWnd,C_FILESIZE,offset szOk
;--------------------------------------------------------
; OLD BYTES
;--------------------------------------------------------
mov ecx,iFilesx
mov esi, old
.while ecx!=0
push ecx
mov ebx, iFilesx
sub ebx, ecx
mov eax, offset ofOffsets
mov eax, [ebx*4+eax]
mov ecx, offset iBytesx
mov ecx, [ebx*4+ecx]
mov edi, [ebx*4+esi]
imul ebx, ebx, 12
lea ebx, [hHandles+ebx+8]
mov ebx,[ebx]
invoke RWProc,0,ebx,eax,edi,ecx
test eax, eax
jnz _mozenowe
pop ecx
dec ecx
.endw
invoke SetDlgItemTextA,hWnd,C_BYTES,offset szOk
jmp _zapis
;--------------------------------------------------------
; NEW BYTES
;--------------------------------------------------------
_mozenowe:
mov ecx, iFilesx
mov esi, new
.while ecx!=0
push ecx
mov ebx, iFilesx
sub ebx, ecx
mov eax,offset ofOffsets
mov eax, [ebx*4+eax]
mov ecx, offset iBytesx
mov ecx, [ebx*4+ecx]
mov edi, [ebx*4+esi]
imul ebx, ebx, 12
lea ebx, [hHandles+ebx+8]
mov ebx,[ebx]
invoke RWProc,0,ebx,eax,edi,ecx
test eax, eax
jnz _byteserr
pop ecx
dec ecx
.endw
jmp _fileerr2
;--------------------------------------------------------
; WRITE BYTES TO FILE
;--------------------------------------------------------
_zapis:
mov ecx, iFilesx
mov esi, new
.while ecx!=0
push ecx
mov ebx, iFilesx
sub ebx, ecx
mov eax,offset ofOffsets
mov eax, [ebx*4+eax]
mov ecx, offset iBytesx
mov ecx, [ebx*4+ecx]
mov edi, [ebx*4+esi]
imul ebx, ebx, 12
lea ebx, [hHandles+ebx+8]
mov ebx,[ebx]
invoke RWProc,1,ebx,eax,edi,ecx
pop ecx
dec ecx
.endw
invoke SetDlgItemTextA,hWnd,C_WRITE,offset szOk
jmp _allok
;------------------------------------------------
; ERRORS
;------------------------------------------------
_fileerr:
pop ecx
invoke SetDlgItemTextA,hWnd,C_FILENAME,offset szNotFound
jmp _err
_fileerr2:
invoke SetDlgItemTextA,hWnd,C_FILENAME,is_no
jmp _err
_size_err:
pop ecx
invoke SetDlgItemTextA,hWnd,C_FILESIZE,offset szBadSize
jmp _err
_byteserr:
pop ecx
invoke SetDlgItemTextA,hWnd,C_BYTES,offset szBadBytes
_err: mov eax, offset szAborted
mov ok_res,eax
;------------------------------------------------
; ZAMKNIJ HANDLE PLIKOW
;------------------------------------------------
_allok:
invoke SetDlgItemTextA,hWnd,C_CRACK,ok_res
lea esi,hHandles
mov ecx,iFilesx
.while ecx!=0
push ecx
invoke CloseHandle,[esi]
invoke CloseHandle,[esi+4]
invoke UnmapViewOfFile,[esi+8]
add esi,12
pop ecx
dec ecx
.endw
ret
Patch endp
;----------------------------------------------------------------------------
; READ/WRITE PROCEDURE
;----------------------------------------------------------------------------
; 0 - ok
; 1 - bad
;----------------------------------------------------------------------------
RWProc proc uses edi esi ebx rw:DWORD,view:DWORD, offsets:DWORD,bytes:DWORD,_ile:DWORD ; eax = 0 -read, 1 -write
mov ecx, _ile
mov edi, view
mov esi, bytes
mov edx, offsets
;-------------------------------read / write??
mov eax, rw
test eax, eax
jnz _zapis
_sprawdz:
lodsb
mov ebx, [edx]
add edx, 4
cmp byte ptr [ebx+edi],al
jnz _blad
loop _sprawdz
jmp _okej
_zapis:
lodsb
mov ebx, [edx]
add edx, 4
mov [ebx+edi], al
loop _zapis
;---------------------------------------
_okej:
xor eax, eax
_ret: ret
_blad:
xor eax, eax
inc eax
jmp _ret
RWProc endp
db 'PunK'
end start
wdz
jmp _okej
_zapis:
lodsb
mov ebx, [edx]
add edx, 4
mov [ebx+edi], al
loop _zapis
;---------------------------------------
_okej:
xor eax, eax
_ret: ret
_blad:
xor eax, eax
inc eax
jmp _ret
RWProc endp
db 'PunK'
end start
bx rw:DWORD,view:DWORD, offsets:DWORD,bytes:DWORD,_ile:DWORD ; eax = 0 -read, 1 -write
mov ecx, _ile
mov edi, view
mov esi, bytes
mov edx, offsets
;-------------------------------read / write??
mov eax, rw
test eax, eax
jnz _zapis
_sprawdz:
lodsb
mov ebx, [edx]
add edx, 4
cmp byte ptr [ebx+edi],al
jnz _blad
loop _sprawdz
jmp _okej
_zapis:
lodsb
mov ebx, [edx]
add edx, 4
mov [ebx+edi], al
loop _zapis
;---------------------------------------
_okej:
xor eax, eax
_ret: ret
_blad:
xor eax, eax
inc eax
jmp _ret
RWProc endp
db 'PunK'
end start