div.main {margin-left: 20pt; margin-right: 20pt}
Как написать оболочку для крака/кейгена под win95/98/NT/2000
Underground InformatioN Center
В свое время я не нашел статей на эту тему, а писать на Delphi или СРР
не очень удобно(по крайней мере мне), да и размер файла получается большой.
Пришлось разбираться самому. Это не сложно, когда знаешь как.
Эта статья для тех, кто еще не знает :)
Итак. Нам понадобится Masm32, который можно скачать с:
www.protools.cjb.net
Я предполагаю, что читатель знает ассемблер и способен вычислить алгоритм
регистрации программы, или хотя бы найти байт, который надо заменить, чтобы
избавить программу от такого бага, как регистрация.
Предположим, что я вычислил алгоритм регистрации: регномер это длина
имени, умноженаая на 1000. Тупо? Да, но это я встретил в программе, автор
которой хотел 95.95$ за свое творение :) Так обломаем его! ;-))
Кстати, если кто думает что все кейгены такие простые то он оооооочень
сильно ошибается.
Итак, вот образец кейгена :
________________________начало keygen.asm__________________________________
.486
.model flat, stdcall
option casemap :none ; case sensitive
; #########################################################################
; здесь подключаются стандартные библиотеки
include masm32includewindows.inc
include masm32includeuser32.inc
include masm32includekernel32.inc
include masm32includegdi32.inc
include masm32includemasm32.inc
includelib masm32libuser32.lib
includelib masm32libkernel32.lib
includelib masm32libgdi32.lib
includelib masm32libmasm32.lib
; #########################################################################
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
;##########################################################################
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
Edit1Proc PROTO :DWORD,:DWORD,:DWORD,:DWORD
;Edit1Proc - процедура для ограничения длины вводимой строки
.data
w1 db "This keygen was written for education purpose and for
learning programming tricks only. Not for cracking, not
for something else ;) You may use it only if you legally
bought the software.",0
;Все в w1 должно быть в ОДНУ строчку! Я поставил в несколько строк только для
; удобства чтения.
w2 db "READ IT FIRST - IT IS IMPORTANT",0
a db "Hey",0
b db "Did you forgot something?",0
b1 db "String must be 10 symbols long!",0
hWnd dd 0
hEdit1 dd 0 ; EditBox1
hEdit2 dd 0 ; EditBox2
hButn1 dd 0 ; Button1
hButn2 dd 0 ; Button2
hButn3 dd 0 ; Button3
hInstance dd 0
hIconImage dd 0 ;для иконки
hIcon dd 0 ;для иконки
lpfnEdit1Proc dd 0
dlgname db "TESTWIN",0
fMtStrinG db "%lu",0
; #########################################################################
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke DialogBoxParam,hInstance,ADDR dlgname,0,ADDR WndProc,0
invoke ExitProcess,eax
; #########################################################################
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
; Сейчас будут обьявляться переменные:
LOCAL Lon :DWORD
LOCAL SerB[64] :BYTE ;буфер для реномера
LOCAL NameB[64] :BYTE ;буфер для имени
pusha ;это должно быть для win2k
.if uMsg == WM_INITDIALOG
mov eax, hWin
mov hWnd, eax
szText dlgTitle,"KEY GENERATOR for" ;это у меня будет заголовок
invoke SendMessage,hWin,WM_SETTEXT,0,ADDR dlgTitle ;программы - title
invoke LoadIcon,hInstance,200
mov hIcon, eax
invoke SendMessage,hWin,WM_SETICON,1,hIcon ;рисуем иконку
invoke GetDlgItem,hWin,100
mov hEdit1, eax
;----------------------------------------
invoke SetWindowLong,hEdit1,GWL_WNDPROC,Edit1Proc ;вызов процедуры Edit1Proc
mov lpfnEdit1Proc, eax
invoke GetDlgItem,hWin,101
mov hEdit2, eax
invoke GetDlgItem,hWin,1000
mov hButn1, eax
invoke GetDlgItem,hWin,1001
mov hButn2, eax
invoke GetDlgItem,hWin,1002
mov hButn3, eax
.elseif uMsg == WM_COMMAND ;если нажата button3 то появляется MessageBox
.if wParam == 1002
invoke MessageBox,0,ADDR w1,ADDR w2,MB_OK
.endif
.if wParam == 1000
;------------------------------------------------------
invoke GetWindowText,hEdit1,ADDR NameB,40 ;содержимое EditBox1 переносится
;в NameB
invoke lnstr,ADDR NameB ;функция masm32.lib, возвращает
;длину строки в EAX
mov Lon,eax
cmp eax,0
jz _short ;проверка на пустую строку
;---------------------ALGO-----------------------------
;тут будет алгоритм
imul eax,1000 ;в Masm32 можно ставить десятичные значения, но без h на конце
mov Lon,eax
invoke dwtoa,Lon,ADDR SerB ;dwtoa - преобразует dw значение в строку
;Все! Вот и весь кейген. Правда просто? :)
; --------------------ALGO-----------------------------
jmp _cool
_cool:
invoke SetWindowText,hEdit2,ADDR SerB ; в EditBox2 помещаем SerB
jmp _end
_short: invoke MessageBox,0,ADDR b,ADDR a,MB_OK
_end:
.elseif wParam == 1001 ; the exit button
jmp GetOutaHere
.endif
.elseif uMsg == WM_CLOSE ; for system close button
GetOutaHere:
invoke EndDialog,hWin,0
.endif
popa ;для вин2к,
xor eax, eax ;для NT4, рекомендую всегда ставить эти две инструкции
ret
WndProc endp
; #########################################################################
Edit1Proc proc hCtl :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
LOCAL tl:DWORD
LOCAL testBuffer[16]:BYTE
; -----------------------------
; Process control messages here
; -----------------------------
.if uMsg == WM_CHAR
.if wParam == 8 ; allow backspace
jmp @F ; jump FORWORD to next @@:
.endif
invoke GetWindowText,hCtl,ADDR testBuffer,16
invoke lnstr,ADDR testBuffer
.if eax >= 10 ; ограничение до десяти символов
xor eax, eax
ret
.endif
; ------------------
;
; .if wParam < 30h ограничение - можно вводить только цифры
; xor eax, eax В данном случае не нужно
; ret
; .elseif wParam > 39h
; xor eax, eax
; ret
; .endif
@@:
.endif
invoke CallWindowProc,lpfnEdit1Proc,hCtl,uMsg,wParam,lParam
ret
Edit1Proc endp
end start
_____________________________конец keygen.asm________________________________________
Вот файл с параметрами окошек и кнопочек:
Меняйте числа, смотрите что происходит и вам станет ясно какой параметр за что
отвечает.
_____________________________начало rsrc.rc___________________________________________
#include "masm32includeresource.h"
;основное окно 170 в длину и 120 в ширину
TESTWIN DIALOGEX MOVEABLE IMPURE LOADONCALL DISCARDABLE 10, 10, 170, 120, 0
STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | WS_POPUP
CAPTION "Dialog"
FONT 8, "MS Sans Serif", 700, 0 /*FALSE*/
BEGIN
EDITTEXT 100,39,25,90,13, ES_AUTOHSCROLL | ES_MULTILINE | ES_LEFT, , 0
EDITTEXT 101,19,50,130,13, ES_AUTOHSCROLL | ES_LEFT, , 0
CTEXT "Click on 'Generate' and see for the serial",20,12,38,130,8,SS_LEFT, ,0
CTEXT "* Some Proggy v.Unknown *",20,12,2,130,8,SS_CENTER, ,0
CTEXT "Enter your name please ",20,1,14,160,8,SS_LEFT, , 0
CTEXT "[Cracker/Coder] --- Corbio",20,20,65,130,8,SS_LEFT, , 0
PUSHBUTTON "Generate the code", 1000, 7,80,71,15, 0, , 0
PUSHBUTTON "I'm out of here! ", 1001, 90,80,71,15, 0, , 0
PUSHBUTTON "Read is first - it is important!" , 1002, 5,100,160,15,0, ,0
END
200 ICON MOVEABLE PURE LOADONCALL DISCARDABLE "my.ico"
______________________________конец rsrc.rc___________________________________________
А теперь исходник крака:
______________________________начало крака____________________________________________
; #########################################################################
.586
.model flat, stdcall
option casemap :none ; case sensitive
; #########################################################################
include masm32includewindows.inc
include masm32includeuser32.inc
include masm32includekernel32.inc
include masm32includegdi32.inc
include masm32includemasm32.inc
includelib masm32libuser32.lib
includelib masm32libkernel32.lib
includelib masm32libgdi32.lib
includelib masm32libmasm32.lib
; #########################################################################
;=============
; Local macros
;=============
szText MACRO Name, Text:VARARG
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
;=================
; Local prototypes
;=================
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
Edit1Proc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.data
_filename db "fignya.exe",0
_filesize dd 1143808 ;для проверки размера файла
_byte1 db 040h,090h,0 ;байты которые будем вставлять
b db "Enjoy",0
a db "File cracked!",0
bN db "Error!",0
aN db "File not found!",0
bW db "Error!",0
aW db "Wrong file size. Get correct version!",0
bytes_written dd 1
hWnd dd 0
hFile dd 0
hButn1 dd 0
hButn2 dd 0
hInstance dd 0
hIconImage dd 0
hIcon dd 0
dlgname db "TESTWIN",0
; fMtStrinG db "%lu",0 ; this is for wsprintf
; #########################################################################
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
; -------------------------------------------
; Call the dialog box stored in resource file
; -------------------------------------------
invoke DialogBoxParam,hInstance,ADDR dlgname,0,ADDR WndProc,0
invoke ExitProcess,eax
; #########################################################################
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
pusha
.if uMsg == WM_INITDIALOG
; --------------------------------
; set up required items at startup
; --------------------------------
mov eax, hWin
mov hWnd, eax
szText dlgTitle," CRACK for:"
invoke SendMessage,hWin,WM_SETTEXT,0,ADDR dlgTitle
invoke LoadIcon,hInstance,200
mov hIcon, eax
invoke SendMessage,hWin,WM_SETICON,1,hIcon
; -----------------
; subclass 1st one so text can be filtered
; ----------------------------------------
; --------------
; button handles
; --------------
invoke GetDlgItem,hWin,1000
mov hButn1, eax
invoke GetDlgItem,hWin,1001
mov hButn2, eax
; -----------------------------------------
; process the messages from the two buttons
; -----------------------------------------
.elseif uMsg == WM_COMMAND
.if wParam == 1000
invoke exist,ADDR _filename
cmp eax,0 ;проверка наличия файла
jz _notfound
invoke filesize,ADDR _filename
cmp eax,_filesize ;проверка размера
jnz _wrongsize
;откравыем файл
invoke CreateFileA, offset _filename,0C0000000h,1,0,3,80h,0
mov hFile,eax
;ставим указатель на нужный адрес (075A81h)
invoke SetFilePointer, hFile, 075A81h,0,FILE_BEGIN
;пишем 2 байта(02h)
invoke WriteFile, hFile, OFFSET _byte1,02h, OFFSET bytes_written, 0
invoke MessageBox,0, ADDR a, ADDR b,MB_OK
jmp _cool
_notfound:
invoke MessageBox,0,ADDR aN, ADDR bN,MB_OK
jmp _cool
_wrongsize:
invoke MessageBox,0, ADDR aW, ADDR bW,MB_OK
_cool:
.elseif wParam == 1001 ; the exit button
jmp GetOutaHere
.endif
.elseif uMsg == WM_CLOSE ; for system close button
GetOutaHere:
invoke EndDialog,hWin,0
.endif
popa
xor eax, eax ; this must be here in NT4
ret
WndProc endp
end start
_____________________________________конец крака______________________________
ну и файлик с кнопочками:
____________________________начало rsrc.rc____________________________________
#include "masm32includeresource.h"
TESTWIN DIALOGEX MOVEABLE IMPURE LOADONCALL DISCARDABLE 10, 10, 170, 80, 0
STYLE 0x0004 | DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | WS_POPUP
CAPTION "Dialog"
FONT 8, "MS Sans Serif", 700, 0 /*FALSE*/
BEGIN
CTEXT "* Some proggy v.Unknown *",20,12,2,150,8,SS_CENTER, ,0
CTEXT "[Cracker/Coder] --- Corbio",20,20,15,115,8,SS_LEFT, , 0
CTEXT "Time limit is the history now. ;-] ",20,20,35,150,8,SS_LEFT, , 0
CTEXT "Enjoy fine release. ",20,20,45,150,8,SS_LEFT, , 0
PUSHBUTTON "Let's crack it...", 1000, 7,55,71,15, 0, , 0
PUSHBUTTON "I'm out of here! ", 1001, 90,55,71,15, 0, , 0
END
200 ICON MOVEABLE PURE LOADONCALL DISCARDABLE "my.ico"
____________________________конец rsrc.rc_____________________________________
Теперь, я надеюсь, всем все понятно.
Ну вот и все. До скорых встреч.
Corbio
[DARKSiDE iNC] member
uinC Member
[c]uinC
Все документы и программы на этом сайте собраны ТОЛЬКО для образовательных целей, мы
не отвечаем ни за какие последствия, которые имели место как следствие использования
этих материаловпрограмм. Вы используете все вышеперечисленное на свой страх и риск.
Любые материалы с этого сайта не могут быть скопированы без разрешения автора или
администрации этого сайта.
|