Underground InformatioN Center [&articles] 
[network & security news] [RSS & Twitter] [articles, programing info] [books] [links, soft & more...] [soft archive][home]

Как написать оболочку для крака/кейгена под win95/98/NT/2000


В свое время я не нашел статей на эту тему, а писать на Delphi или СРР не очень удобно(по крайней мере мне), да и размер файла получается большой. Пришлось разбираться самому. Это не сложно, когда знаешь как. Эта статья для тех, кто еще не знает :) Итак. Нам понадобится Masm32, который можно скачать с: www.protools.cjb.net Я предполагаю, что читатель знает ассемблер и способен вычислить алгоритм регистрации программы, или хотя бы найти байт, который надо заменить, чтобы избавить программу от такого бага, как регистрация. Предположим, что я вычислил алгоритм регистрации: регномер это длина имени, умноженаая на 1000. Тупо? Да, но это я встретил в программе, автор которой хотел 95.95$ за свое творение :) Так обломаем его! ;-)) Кстати, если кто думает что все кейгены такие простые то он оооооочень сильно ошибается. Итак, вот образец кейгена : ________________________начало keygen.asm__________________________________ .486 .model flat, stdcall option casemap :none ; case sensitive ; ######################################################################### ; здесь подключаются стандартные библиотеки include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\gdi32.inc include \masm32\include\masm32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\masm32.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 "\masm32\include\resource.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 \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\gdi32.inc include \masm32\include\masm32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\masm32.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 "\masm32\include\resource.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

Все документы и программы на этом сайте собраны ТОЛЬКО для образовательных целей, мы не отвечаем ни за какие последствия, которые имели место как следствие использования этих материалов\программ. Вы используете все вышеперечисленное на свой страх и риск.

Любые материалы с этого сайта не могут быть скопированы без разрешения автора или администрации.


[network & security news] [RSS & Twitter] [articles, programing info] [books] [links, soft & more...] [soft archive][home]
 Underground InformatioN Center [&articles] 
2000-2015 © uinC Team