RCE.SU - реверсинг, кодинг, выделенные сервера, ICQ, proxy

[ Пишем keygen для Alteros Viewer v2.0 ]

Сегодня наша задача состоит в том, чтобы вычислить алгоритм генерации года, а затем написать keygen для этой проги. Имеем :

target : Alteros Viewer v2.0 (build 2007)
tools : SoftICE, Masm32 version 7

Ну что, поехали потихонечку....
Загружаем таргет, заходим в регистрилку, смотрим, что нужно ввести.. Требуют ввести имя и регистрационный код.
Далее вводим любое имя и код(например 147258369).
Заходим в SoftICE(Ctrl+D), и пишем там :
s d lffffffff "<введённый вами код>"(обязательно в кавычках) SoftICE нам отвечает :
Pattern found at xxxx:xxxxxxxx (xxxxxxxx), где xxxxxxxx- это адрес, по которому находится наш код.
Ставим брякпоинт на чтение/запись по этому адресу :
bpmb xxxxxxxx rw
Нажимаем F5, затем жмём кнопочку "Register", и снова вываливаемся в SoftICE...
Жмем F12 пока не вернёмся в модуль Alteros.exe(у меня было 7 раз). Жмём F10 пока не увидим такое место :

______________cut here________________
:004B19BA 837DF000 cmp dword ptr [ebp-10], 00000000
:004B19BE 0F840E010000 je 004B1AD2
:004B19C4 8D55F4 lea edx, dword ptr [ebp-0C]
:004B19C7 8B8304040000 mov eax, dword ptr [ebx+00000404]
:004B19CD E8BA32F8FF call 00434C8C
:004B19D2 8B45F4 mov eax, dword ptr [ebp-0C]
:004B19D5 E86E6EF5FF call 00408848
:004B19DA 8945EC mov dword ptr [ebp-14], eax
:004B19DD DB45EC fild dword ptr [ebp-14]
:004B19E0 E8DB0FF5FF call 004029C0
:004B19E5 8945F8 mov dword ptr [ebp-08], eax
:004B19E8 8D55FC lea edx, dword ptr [ebp-04]
:004B19EB 8B8300040000 mov eax, dword ptr [ebx+00000400]
:004B19F1 E89632F8FF call 00434C8C
______________cut here_________________

Мы вывалились на адрес - :004B19D2, по F10 проходим
дальше, до следующего места :

______________cut here_________________
:004B1A17 8975EC mov dword ptr [ebp-14], esi
:004B1A1A DB45EC fild dword ptr [ebp-14]
:004B1A1D E89E0FF5FF call 004029C0
:004B1A22 69C007020000 imul eax, 00000207
:004B1A28 05FE1C0200 add eax, 00021CFE
:004B1A2D 8BF0 mov esi, eax
:004B1A2F 3B75F8 cmp esi, dword ptr [ebp-08]
:004B1A32 7572 jne 004B1AA6
:004B1A34 A1649C4E00 mov eax, dword ptr [004E9C64]
:004B1A39 C60001 mov byte ptr [eax], 01
______________cut here_________________

По адресу - :004B1A1D идёт процедура, которая складывает ASCII код каждого символа нашего имени, и возвращает общую сумму... Далее получившееся число( у меня 404h) умножается на 207h(h - hex) и прибавляется 21CFEh, а уже потом сравнивает получившееся значение с числом, введёным нами, в 16-ричном исчислении. Если хотите узнать код соответствующий вашему имени, просто переведите число из esi в 10-ричную систему исчисления, и получите ваш код...
Итак, кратко наш алгоритм :
  • складываем ASCII код каждого символа имени;
  • умножаем получившееся на 207h;
  • прибавляем 21CFEh;
  • переводим в 10-ричную систему исчисления.
Теперь наша задача заключается в том, чтобы написать keygen на ассемблере. Не буду всё подробно описывать, а просто дам исходники :

____________begin of keygen.asm__________
..486
..model flat, stdcall
option casemap :none

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

..data
w1 db " TSRh | TeaM",13,10
db "-<->- Proudly Presents -<->-",13,10,13,10
db " KeygeN FoR :",13,10 
db "Alteros Viewer v2.0 (build 2007)",13,10,13,10
db "(c)2001 by EGOiST[TSRh]",13,10
db "Web : http://www.ego1st.cjb.net/",13,10
db "Mail : egoist_tsrh@rbcmail.ru",0
w2 db "About...",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
hEdit2 dd 0
hButn1 dd 0
hButn2 dd 0
hButn3 dd 0
hInstance 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
..if uMsg == WM_INITDIALOG

mov eax, hWin
mov hWnd, eax

szText dlgTitle,"KeygeN FoR Alteros Viewer v2.0 (build 2007)"
invoke SendMessage,hWin,WM_SETTEXT,0,ADDR dlgTitle

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
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
..if wParam == 1002
invoke MessageBox,0,ADDR w1,ADDR w2,MB_OK
..endif
..if wParam == 1000

;--------------GENERATOR begin------------------

invoke GetWindowText,hEdit1,ADDR NameB,40 ;EditBox1 text puting in NameB

lea eax,NameB
xor esi,esi
xor edx,edx
_gen:
cmp byte ptr[eax],00
jz _endgen
mov dl,byte ptr[eax]
inc eax
add esi,edx
jmp _gen
_endgen:
imul esi,esi,207h
add esi,21CFEh
mov Lon,esi
invoke dwtoa,Lon,ADDR SerB

;----------------GENERATOR end------------------------

jmp _cool
_cool:
invoke SetWindowText,hEdit2,ADDR SerB
jmp _end

_short: invoke MessageBox,0,ADDR b,ADDR a,MB_OK

_end:
..elseif wParam == 1001
jmp GetOutaHere

..endif

..elseif uMsg == WM_CLOSE
GetOutaHere:
invoke EndDialog,hWnd,0

..endif
popa
xor eax, eax
ret

WndProc endp

Edit1Proc proc hCtl :DWORD, uMsg :DWORD, wParam :DWORD, lParam :DWORD

LOCAL tl:DWORD
LOCAL testBuffer[16]:BYTE

..if uMsg == WM_CHAR

..if wParam == 8
jmp @F
..endif

invoke GetWindowText,hCtl,ADDR testBuffer,16
invoke lnstr,ADDR testBuffer

..if eax >=100 ;Not min 100 symbols
xor eax, eax
ret
..endif

@@:

..endif

invoke CallWindowProc,lpfnEdit1Proc,hCtl,uMsg,wParam,lParam

ret

Edit1Proc endp

end start
___________end of keygen.asm_____________


И ещё, естественно, файл с окошками и кнопками:


__________begin of rsrc.rc_________________

#include "\masm32\include\resource.h"

TESTWIN DIALOGEX MOVEABLE IMPURE LOADONCALL DISCARDABLE 10, 10, 146, 52, 0
STYLE 0X0004 | DS_CENTER | WS_CAPTION | WS_SYSMENU | WS_VISIBLE | WS_POPUP
EXSTYLE WS_EX_TOOLWINDOW
CAPTION "DIALOG"
FONT 8, "MS Sans Serif", 700, 0 /*FALSE*/

BEGIN
EDITTEXT 100,1,11,90,13, ES_AUTOHSCROLL | ES_MULTILINE
EDITTEXT 101,1,26,90,13, ES_AUTOHSCROLL | ES_READONLY
CTEXT "Enter your name please :",20,4,1,81,8,SS_LEFT, , 0
CTEXT "(c)2001 by EGOiST[TSRh]",20,0,41,91,9,WS_DISABLED
DEFPUSHBUTTON "Gen...", 1000, 96,2,47,15, BS_FLAT
DEFPUSHBUTTON "Exit... ", 1001, 96,34,47,15, BS_FLAT
DEFPUSHBUTTON "About..." , 1002, 96,18,47,15, BS_FLAT 
END

200 ICON MOVEABLE PURE LOADONCALL DISCARDABLE "MY.ICO"

____________end of rsrc.rc_________________

Меняете всё на ваше усмотрение...
Keygen.asm и rsrc.rc введём в QEdit из Masm32 v7.
Вот и всё =/:0

p.s. ну всё это, конечно, for purpose only!!! ;-)
и распространяется только с моего разрешения...
!!!за все последствия я ничего не несу!!!
Writer : EGOiST[TSRh]
>>Contacts<<
via http : http://www.ego1st.cjb.net

http://tsrh.cjb.net/
via e-mail : egoist_tsrh@rbcmail.ru
Date : 24.12.2001 22:24:35


<= Вернуться к статьям


Rambler's Top100