Basic keygen by Hard To Beat Team (HBT) + SOURCE CODE
1 of 6 files
fins
-
This download is a Windows program, but it should only be run on your computer if you trust it.
Instead, run it isolated in Windows Sandbox, VirtualBox or Parallels.
Browsers may flag this download as unwanted or malicious. If unsure, scan it with VirusTotal. -
Last modified Jun 25, 2022 6:08:48 AM
MD5 checksum 77cf0234367c6ca724a778d6f966e914
Mime type
Download basic.keygen.source.zip
Size 10 kB
- Zip - Windows / Computer tool
- FiNS, program credits
6 items in the archive
- fins.ico
- keygen.asm
- keygen.exe
- keygen.rc
- makeit.bat
- tutorial.txt
___ ___ ___ ___ ___ ___ ___
/ /\ /__/\ / /\ /__/\ / /\ / /\ / /\
/ /:/ \ \:\ / /::\ \ \:\ / /::\ / /::\ / /::|
/ /:/ \ \:\ / /:/\:\ \ \:\ / /:/\:\ / /:/\:\ / /:|:|
/ /::\ ___ \__\:\ / /::\ \:\ \__\:\ / /::\ \:\ / /::\ \:\ / /:/|:|__
/__/:/\:\ /\ / /::\/__/:/\:\ \:\ / /::\/__/:/\:\ \:/__/:/\:\_\:/__/:/_|::::\
\__\/ \:\/:// /:/\:\ \:\ \:\/:// /:/\:\ \:\ \:\_\\__\/ \:\/:\__\/ /~~/:/
\__\::// /:/\ \:\ \:\ \::// /:/\ \:\ \:\ \:\ \__\::/ / /:/
/ /:// /:/ \_\/\ \:\/:// /:/ \_\/\ \:\_\/ / /:/ / /:/
/__/://__/:/ \ \:://__/:/ \ \:\ /__/:/ /__/:/
\__\/ \__\/ \__\/ \__\/ \__\/ \__\/ \__\/
www.htb.team.prv.pl
Title: [Tworzymy.pierwszego.keygena........................................]
Topic: [Coding.............................................................]
Author: [FiNS.......................] E-mail: [[email protected]...............]
Packager: [FiNS.......................] Date: [2003.......................]
D O N ' T T R Y T O B E A T U S !
_______________________________________________________________________________
1. WstΩp
Jak siΩ pewnie domyœlasz, ten tekst jest o tworzeniu keygen≤w. PiszΩ go z myœl╣ o pocz╣tkuj╣cych, kt≤rzy czΩsto nie wiedz╣ jak siΩ do tego zabra╡. Je┐eli nie masz z tym ┐adnych problem≤w, to raczej nie dowiesz siΩ niczego nowego z tego tutka. D│ugo myœla│em do czego by tu zrobi╡ tego keygena i doszed│em do wniosku, ┐e na pocz╣tek nale┐y wzi╣╡ coœ prostego. Poszuka│em na dysku i znalaz│em: CrackMe2 by massh^CookieCrK. Bardzo proœciutkie CrackMe generuj╣ce seriala na podstawie nicka i r≤wnoczeœnie pierwsze CrackMe tego typu, kt≤re z│ama│em :), mi│o powspomina╡. Ale dobra, koniec tego glΩdzenia i zabieramy siΩ do roboty.
2. Zabezpieczenie
Pewnie z│amiesz to szybko i bez ┐adnych problem≤w. Prog u┐ywa GetWindowTextA, a najwa┐niejsze instrukcje znajduj╣ siΩ w tym callu:
0040117D CALL 00401261
Jest tam taki kod:
00401261 MOV EAX,[00402060]
00401266 CMP [00402064],EAX ;d│ugoœ╡ name i serial
0040126C JNZ 0040129D ;musi by╡ taka sama
0040126E XOR EAX,EAX
00401270 MOV EDI,[ESP+04] ;adres name do edi
00401274 MOV ESI,[ESP+08] ;adres seriala do esi
00401278 MOVZX EBX,BYTE PTR [EDI] ;bajt z name do ebx
0040127B MOVZX EDX,BYTE PTR [ESI] ;bajt z seriala do esi
0040127E CMP DL,30
00401281 JL 0040129D
00401283 CMP DL,39
00401286 JG 0040129D ;czy serial sk│ada siΩ z liczb
00401288 SUB DL,30
0040128B AND EBX,0F ;obrabianie litery z name
0040128E SHR BL,1
00401290 SUB BL,DL ;litera po przer≤bce musi by╡
00401292 JNZ 0040129D ;taka sama jak cyfra z seriala
00401294 INC EDI
00401295 INC ESI
00401296 CMP BYTE PTR [EDI],00 ;powtarzaj ze
00401299 JNZ 00401278 ;wszystkimi znakami
0040129B JMP 004012A1
0040129D XOR EAX,EAX
0040129F JMP 004012A6
004012A1 MOV EAX,00000001
004012A6 RET
Poprawny serial dla mojego name to 3471. Jak wida╡ 1 cyfra seriala odpowiada 1 literze z name. Teraz wiemy jak generowany jest serial, wiΩc pora zabra╡ siΩ za keygena...
3. Algo obliczaj╣ce seriala
Na pocz╣tku opracujemy algorytm generuj╣cy seriala (w tym przypadku 1 min :)), a p≤Ÿniej napiszemy resztΩ kodu. Za│≤┐my, ┐e w DL mamy literΩ z name. Aby znaleŸ╡ cyfrΩ z seriala odpowiadaj╣c╣ tej literze, mo┐emy u┐y╡ takiego kodu:
and edx, 0Fh
shr edx, 1
add edx, 30h
Trzeba to zmodyfikowa╡ tak, aby zastosowa╡ to do ka┐dej litery z nicka. Ca│oœ╡ wygl╣da tak:
mov ebx, offset serial ;tu zapiszemy wygenerowanego seriala
mov eax, offset myname ;tu jest nasze name
nastepny:
movzx edx, byte ptr [eax] ;litera z name do edx
and edx, 0Fh ;obrabianie name
shr edx, 1
add edx, 30h
mov [ebx], dl ;kolejne cyfry seriala id╣ do ebx
inc eax
inc ebx
cmp byte ptr [eax], 0 ;sprawdŸ czy koniec name
jne nastepny ;jeœli nie to obr≤b nastΩpn╣ literΩ
Ten kod bΩdzie najwa┐niejsz╣ czΩœci╣ naszego proga.
4. Wygl╣d keygena
Teraz musimy zabra╡ siΩ za okienko dialogowe. Najpierw zrobimy plik z zasobami, kt≤ry odpowiada za jego wygl╣d. Mo┐e bawi│eœ siΩ kiedyœ programikiem takim jak Restorator, czy Resource Hacker. Pozwalaj╣ one zmienia╡ wygl╣d innych prog≤w, a nam mog╣ nieco u│atwi╡ ustalenie wygl╣du okna keygena. Ja u┐ywam tych dw≤ch prog≤w o kt≤rych wspomnia│em wczeœniej i polecam je r≤wnie┐ tobie. Jak chcesz zmienia╡ wygl╣d okna to odpalasz ResHackera i │adujesz jakiœ programik kt≤ry jest okienkiem dialogowym, np. calc.exe. Klikasz np. na Dialog i na 104. Na pocz╣tku wywalasz wszystko co jest w tym oknie. P≤Ÿniej klikasz prawym na puste okno i ustawiasz jego w│aœciwoœci w "Edit Dialog". P≤Ÿniej znowu prawym na puste okno i "Insert control". Tu mo┐esz dodawa╡ przyciski, pola edycyjne i inne bajery. Rozmiary kontrolek i okna zmieniasz myszk╣, rozci╣gaj╣c to co chcesz do odpowiednich rozmiar≤w. Jak ju┐ wszystko pozmieniasz to zapisujesz to okno w pliku res. P≤Ÿniej w Restoratorze mo┐esz to sobie zamieni╡ na rc i jeszcze wprowadzi╡ jakieœ zmiany. Nie polecam zapisywania zasob≤w w ResHackerze do plik≤w rc, bo nie s╣ one kompatybilne z masm32, w│aœnie dlatego przydaje siΩ Restorator, kt≤ry generuje pliki rc kompatybilne z tym kompilatorem. W│aœciwie to ResHacker nie jest wcale potrzebny, bo wszystko mo┐na zrobi╡ w drugim progu, ale mi siΩ wydaje, ┐e ResHacker jest wygodniejszy w obs│udze. Wyb≤r pozostawiam tobie. Jak chcesz, to mo┐esz wcale nie u┐ywa╡ tego typu prog≤w. Ja u│atwiam ci sprawΩ i daje gotowy plik rc z opisem zasob≤w do naszego keygena. Wygl╣da on tak:
#include <c:\masm32\include\resource.h>
10 DIALOGEX 11, 11, 213, 74, 0
STYLE DS_SETFONT | DS_SETFOREGROUND | DS_CENTER | WS_MINIMIZEBOX | WS_POPUPWINDOW | WS_VISIBLE | WS_CAPTION
CAPTION "CrackMe2 by massh^CookieCrK - keygen"
FONT 8, "MS SANS SERIF"
{
GROUPBOX "", 0, 2, -1, 209, 72
EDITTEXT 100, 6, 16, 201, 12, NOT WS_BORDER | WS_GROUP, WS_EX_STATICEDGE
EDITTEXT 101, 6, 38, 201, 12, ES_READONLY | NOT WS_BORDER | WS_GROUP, WS_EX_STATICEDGE
CTEXT "Name:", 309, 6, 7, 22, 8
CTEXT "Serial:", 309, 5, 29, 22, 8
PUSHBUTTON "&Generate", 1, 6, 55, 44, 12, BS_CENTER | WS_GROUP, WS_EX_STATICEDGE
PUSHBUTTON "&About", 103, 55, 55, 44, 12, BS_CENTER | WS_GROUP, WS_EX_STATICEDGE
PUSHBUTTON "&Exit", 104, 104, 55, 44, 12, BS_CENTER | WS_GROUP, WS_EX_STATICEDGE
LTEXT "Created by FiNS", 0, 154, 56, 53, 10, WS_DISABLED
}
30 ICON "fins.ico"
IkonkΩ daj tak╣ jak╣ masz i zmie▒ tu jej nazwΩ. Popraw te┐ œcie┐kΩ do kompilatora (je┐eli jest taka potrzeba). Ca│oœ╡ zapisz w pliku o nazwie np. keygen.rc. To by by│o na tyle w sprawie wygl╣du naszego proga.
5. Piszemy kod
Otw≤rz sobie dowolny edytor tekstu np. notepad albo Quick Editor do│╣czony do masma i napisz to, co zwykle jest na pocz╣tku proga:
.486
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
I jeszcze sekcjΩ .const:
.const
DIALOG_ID =10
ICON_ID =30
EDITN_ID =100
EDITS_ID =101
GENERATE_ID =1
ABOUT_ID =103
EXIT_ID =104
W│aœciwie to deklaracja sta│ych nie jest konieczna, ale to bardzo u│atwia dalsze pisanie. Nie musisz pamiΩta╡ liczb tylko nazwy, kt≤re sam nadajesz. DziΩki temu, ┐e przycisk Generate ma ID=1, to naciœniΩcie entera zadzia│a tak, jakbyœmy nacisnΩli w│aœnie ten przycisk. Mam nadziejΩ, ┐e wiesz, o co mi chodzi. Teraz piszemy sekcje z danymi:
.data?
hInstance dd 4 dup (?)
myname db 64 dup (?)
serial db 64 dup (?)
.data
tytulmsgbox db 'About',0
tekstmsgbox db 'CrackMe2 by massh^CookieCrK - keygen',13,10
db ' ',13,10
db 'Created by:',13,10
db 'FiNS - [email protected]',0
hInstance jest nam potrzebne do utworzenia okienka dialogowego. Do myname bΩdziemy pobiera╡ podanego nicka, a w serial zapisywa╡ wygenerowany numerek. Po klikniΩciu na About bΩdzie siΩ pokazywa╡ messagebox z infem z sekcji .data. To wszystkie dane jakie s╣ nam potrzebne. Mo┐emy ju┐ przyst╣pi╡ do pisania kodu:
.code
start:
push 0
call GetModuleHandleA
mov hInstance, eax
push 0
push offset DlgProc
push 0
push DIALOG_ID
push hInstance
call DialogBoxParamA
push 0
call ExitProcess
Je┐eli nie pisa│eœ wczeœniej ┐adnego proga, to mo┐e teraz pomyœlisz, ┐e coœ ten ExitProcess za szybko. Nie ma niczego, co by generowa│o seriala, w│aœciwie to niczego nie ma. Tak naprawdΩ wszystko dzieje siΩ w DlgProc, kt≤r╣ zaraz napiszemy.
DlgProc proc uses esi edi ebp ebx, hDlg:DWORD, uMsg:DWORD, wParam:DWORD,
lParam:DWORD
;...tu bΩdziemy pisa╡ resztΩ kodu...
powrot:
xor eax, eax
ret
DlgProc endp
end start
Je┐eli w tej chwili masz zrobione wszystko, co opisa│em do tej pory, to mo┐esz zapisa╡ obecny kod w pliku np. keygen.asm (proponujΩ da╡ tak╣ sam╣ nazwΩ jak╣ da│eœ plikowi .rc) i skompilowa╡ ca│oœ╡. W tej chwili nasz prog powinien siΩ ju┐ uruchomi╡, ale nic nie bΩdzie robi│, nawet nie bΩdzie siΩ go da│o normalnie zamkn╣╡, jedynie przez ctrl+alt+del. Warto jednak zobaczy╡ jak wygl╣da i czy rzeczywiœcie siΩ uruchamia (bΩdziesz wiedzia│, czy czegoœ nie namiesza│eœ po drodze :)). Ca│oœ╡ moim skromnym zdaniem najlepiej kompilowa╡ plikiem wsadowym makeit.bat, kt≤ry zawiera takie instrukcje:
set file=keygen
\masm32\bin\rc /v %file%.rc
\masm32\bin\ml /c /coff /Cp %file%.asm
\masm32\bin\link.exe /SUBSYSTEM:WINDOWS /LIBPATH:\masm32\lib
%file%.obj %file%.res
del *.obj
del *.res
%file%.exe
Je┐eli musisz, to popraw œcie┐kΩ do masma i nazwΩ pliku (tu: "keygen"). Jeœli prog siΩ nie kompiluje, to sprawdŸ, czy nie znalaz│o ci jakichœ b│Ωd≤w przy kompilacji. Jak znalaz│o, to przeczytaj w kt≤rej lini, por≤wnaj z tym co ja tu napisa│em i popraw b│╣d. Zak│adam, ┐e wszystko siΩ uda│o i program jest w│╣czony. Mo┐esz siΩ napatrze╡ i posprawdza╡ jak wszystko dzia│a (a raczej jak nie dzia│a ;)) Zamknij keygena i wracamy do pisania kodu. Ustaw kursor linijkΩ przed retem, w miejscu gdzie napisa│em ;...tu bΩdziemy... (chyba nie muszΩ m≤wi╡, ┐e to masz usun╣╡) i piszemy w tym miejscu taki kod:
cmp uMsg, WM_INITDIALOG
jz initdlg
cmp uMsg, WM_CLOSE
jz close
cmp uMsg, WM_COMMAND
jz wmcommand
cmp uMsg, WM_MOUSEMOVE
je move
Nie wiesz, co to jest? Nie przejmuj siΩ, bo ja te┐ nie wiem ;) a tak na serio, to tu jest sprawdzane zdarzenie jakie zosta│o wykonane (np. czy klikniΩto na przycisk Generate itp.). WM_INITDIALOG wykonuje siΩ podczas w│╣czania okienka. BΩdzie nam potrzebne, bo my chcemy mie╡ na pasku tytu│owym nasz╣ ikonkΩ, a nie jakiœ œmie╡ z wina. WM_CLOSE s│u┐y do zamykania proga. WM_COMMAND to np. naciœniΩcie jakiegoœ przycisku. WM_MOUSEMOVE pos│u┐y nam do zrobienia takiej ma│ej i fajnej rzeczy, mianowicie bΩdziemy mogli porusza╡ oknem │api╣c je w dowolnym miejscu (poza przyciskami i polem edit), a nie tylko za pasek tytu│owy. Po tych instrukcjach zostawiamy naszego xora i reta, a za nim piszemy dalszy kod:
initdlg:
push ICON_ID
push hInstance
call LoadIconA
push eax
push 1
push WM_SETICON
push hDlg ;ten kod wrzuca nasz╣
call SendMessageA ;ikonkΩ na pasek tytu│owy
jmp powrot
close:
push 0
push hDlg
call EndDialog ;zamykanie okna
jmp powrot
move:
cmp wParam, 1
je moveform
jmp powrot
moveform:
call ReleaseCapture
push 0
push 0F012h
push WM_SYSCOMMAND
push hDlg ;poruszanie oknem,
call SendMessageA ;o kt≤rym m≤wi│em wczeœniej
jmp powrot
wmcommand:
cmp wParam, GENERATE_ID
jz go
cmp wParam, ABOUT_ID
jz about
cmp wParam, EXIT_ID ;sprawdza czy naciœniΩto
jz close ;kt≤ryœ z przycisk≤w
jmp powrot
about:
push MB_ICONINFORMATION
push offset tytulmsgbox
push offset tekstmsgbox
push hDlg
call MessageBoxA ;wyœwietlanie okienka about
jmp powrot
Teraz jest najwa┐niejsza czΩœ╡ proga. Wykonuje siΩ ona po naciœniΩciu Generate lub entera. Jej g│≤wn╣ czΩœ╡ napisaliœmy ju┐ wczeœniej, w trzecim punkcie. Teraz dodajemy przed ni╣ pobranie tekstu z pierwszego pola edit i wpisanie wyniku do drugiego, nieaktywnego pola edit.
go:
push 255
push offset myname
push EDITN_ID
push hDlg
call GetDlgItemTextA ;pobieranie name
test eax, eax ;czy coœ wpisano
jz koniec ;jeœli nie to nie obliczaj
cmp eax, 64 ;nasze name nie mo┐e by╡ wiΩksze
jge koniec ;ani r≤wne ni┐ 64 znaki
;je┐eli by tego nie by│o, a user wpisa│by
;za d│ugiego nicka, to program by siΩ wiechn╣│
mov ebx, offset serial ;algorytm obliczaj╣cy seriala
mov eax, offset myname ;by│ on opisany wczeœniej
nastepny:
movzx edx, byte ptr [eax]
and edx, 0Fh
shr edx, 1
add edx, 30h
mov [ebx], dl
inc eax
inc ebx
cmp byte ptr [eax], 0
jne nastepny
xor eax, eax
mov [ebx], eax
push offset serial
push EDITS_ID
push hDlg ;wpisz wygenerowanego
call SetDlgItemTextA ;seriala do pola edit
koniec:
jmp powrot
DlgProc endp ;jak ju┐ to masz, to nie pisz drugi raz
end start
To by by│o na tyle. W│aœnie sko▒czy│eœ pisa╡ swojego pierwszego keygena :D Pewnie siΩ cieszysz, ja te┐. Chyba nie by│o to wcale takie trudne :) Teraz mo┐esz to skompilowa╡ i wypr≤bowa╡ jak dzia│a. Spakowana ca│oœ╡ (keygen.asm, keygen.rc, makeit.bat, fins.ico i wersja skompilowana) powinna by╡ do│╣czona do tego tekstu. Je┐eli masz jakieœ problemy ze zrobieniem tego keygena, albo jakieœ pytanka, to mail me [email protected].