Теперь посмотрим процедуру проверки, для этого дизассемблируем в DEDE событие
"abcMouseLabel2Click".

004E9A70 53 push ebx
004E9A71 83C4F0 add esp, -$10
004E9A74 8BD8 mov ebx, eax

* Reference to : TForm11.Proc_004E92DC()
|
004E9A76 E861F8FFFF call 004E92DC ;
знакомая нам процедура получения серийного номера тома 'C:\'

* Reference to control TForm11.RxCalcEdit1 : TRxCalcEdit
|
004E9A7B 8B8300030000 mov eax, [ebx+$0300]

* Reference to : TRxCalcEdit._PROC_004E85F4()
|
004E9A81 E86EEBFFFF call 004E85F4 ;
получает введенный нами регистрационный номер
004E9A86 D81D589B4E00 fcomp dword ptr [$004E9B58] ;
проверяет, пустая ли строка?
004E9A8C DFE0 fstsw ax ;
004E9A8E 9E sahf ;
004E9A8F 0F84BC000000 jz 004E9B51 ;
если строка пустая прыгает и выходит, иначе продолжает
004E9A95 68E8030000 push $000003E8 ;

* Reference to: SysInit.Proc_004069C0
|
004E9A9A E821CFF1FF call 004069C0 ; вызов sleep
004E9A9F 33D2 xor edx, edx

* Reference to control TForm11.Image2 : TImage
|
004E9AA1 8B8314030000 mov eax, [ebx+$0314] ;

* Reference to: controls.TControl.SetVisible(TControl;Boolean);
|
004E9AA7 E8FC34F4FF call 0042CFA8 ;
скрывает image2

* Reference to control TForm11.RxCalcEdit1 : TRxCalcEdit
|
004E9AAC 8B8300030000 mov eax, [ebx+$0300]

* Reference to : TRxCalcEdit._PROC_004E85F4()
|
004E9AB2 E83DEBFFFF call 004E85F4
004E9AB7 DB3C24 fstp tbyte ptr [esp]
004E9ABA 9B wait

* Reference to pointer to GlobalVar_004FE258
|
004E9ABB A180AE4F00 mov eax, dword ptr [$004FAE80] ;
004E9AC0 8B00 mov eax, [eax] ;
в eax, указатель на серийный номер тома

* Reference to: Unit_00407868.Proc_004088FC
|
004E9AC2 E835EEF1FF call 004088FC ; п
ереводит ascii в число, т.о. в eax будет серийный номер тома
004E9AC7 2DE92A7300 sub eax, $00732AE9 ;
вычитает 00732AE9h из eax
004E9ACC 8944240C mov [esp+$0C], eax ;
004E9AD0 DB44240C fild dword ptr [esp+$0C] ;
и помещает в ST0
004E9AD4 DB2C24 fld tbyte ptr [esp] ;
введенный рег. номер помещает в ST1
004E9AD7 DED9 fcompp ;
и сравнивает их
004E9AD9 DFE0 fstsw ax ;
004E9ADB 9E sahf ;
004E9ADC 754A jnz 004E9B28 ;
если числа равны - прыжка не произойдет и мы будем
зарегистрированы

004E9ADE A168D64F00 mov eax, dword ptr [$004FD668]

* Reference to control Label1 : TRxLabel
|
004E9AE3 8B8010030000 mov eax, [eax+$0310]
004E9AE9 B201 mov dl, $01

* Reference to: controls.TControl.SetVisible(TControl;Boolean);
|
004E9AEB E8B834F4FF call 0042CFA8 ;
004E9AF0 33D2 xor edx, edx

* Reference to control TForm11.RxGIFAnimator2 : TRxGIFAnimator
|
004E9AF2 8B83E8020000 mov eax, [ebx+$02E8]

* Reference to: controls.TControl.SetVisible(TControl;Boolean);
|
004E9AF8 E8AB34F4FF call 0042CFA8 ;
анимация GIF2 устанавливается невидимой
004E9AFD B201 mov dl, $01

* Reference to control TForm11.RxGIFAnimator1 : TRxGIFAnimator
|
004E9AFF 8B83E4020000 mov eax, [ebx+$02E4]

* Reference to : TRxGIFAnimator._PROC_004DDF70()
|
004E9B05 E86644FFFF call 004DDF70 ;
вывод анимации GIF1
004E9B0A B201 mov dl, $01

* Reference to control TForm11.RxGIFAnimator1 : TRxGIFAnimator
|
004E9B0C 8B83E4020000 mov eax, [ebx+$02E4]

* Reference to: controls.TControl.SetVisible(TControl;Boolean);
|
004E9B12 E89134F4FF call 0042CFA8 ;
и установка ее видимой

* Reference to control TForm11.abcMouseLabel2 : TabcMouseLabel
|
004E9B17 8B8304030000 mov eax, [ebx+$0304]

* Reference to field TabcMouseLabel.OFFS_0164
|
004E9B1D 66C780640100000000 mov word ptr [eax+$0164], $0000
004E9B26 EB29 jmp 004E9B51
004E9B28 B201 mov dl, $01

* Reference to control TForm11.RxGIFAnimator2 : TRxGIFAnimator
|
004E9B2A 8B83E8020000 mov eax, [ebx+$02E8] ;

* Reference to : TRxGIFAnimator._PROC_004DDF70()
|
004E9B30 E83B44FFFF call 004DDF70 ;
вывод анимации GIF2
004E9B35 B201 mov dl, $01

* Reference to control TForm11.RxGIFAnimator2 : TRxGIFAnimator
|
004E9B37 8B83E8020000 mov eax, [ebx+$02E8]

* Reference to: controls.TControl.SetVisible(TControl;Boolean);
|
004E9B3D E86634F4FF call 0042CFA8 ;
и установка ее видимой

* Reference to control TForm11.abcMouseLabel2 : TabcMouseLabel
|
004E9B42 8B8304030000 mov eax, [ebx+$0304]

* Reference to field TabcMouseLabel.OFFS_0164
|
004E9B48 66C780640100000000 mov word ptr [eax+$0164], $0000
004E9B51 83C410 add esp, +$10
004E9B54 5B pop ebx
004E9B55 C3 ret ;

Это процедура проверки серийного номера. Заключается она в следующем:
из полученного серийного номера тома 'C:\' вычитается 00732AE9h и сравнивается
с введенным. Если значения равны выводится анимация GIF1, в противном случае
GIF2. Теперь мы знаем весь механизм проверки и можем легко написать генератор ключей.
Сделаем его на Delphi, добавим на форму строку ввода edit1 и кнопку button1,
присвоим кнопке событие onclick и запишем туда следующий код:

procedure TForm1.Button1Click(Sender: TObject);
var
r:real;
s:string;
begin
r:=(strtofloat(edit1.text))*1000000;
s:=floattostr(r);
delete(s,length(s)-2,3);
r:=strtofloat(s);
r:=(r-5267457)/2;
r:=r-7547625;
edit1.Text:=floattostr(r);
end;

Теперь проверим работоспособность генератора ключей. Получим идентификатор,
скопируем его в буфер обмена и вставим в edit1 нашей программы, нажмем кнопку
и получим регистрационный номер. Пробуем ввести его в программу, появляется
анимация явно дающая нам понять, что проверка прошла успешно. 

Статья предоставлена в образовательных целях только!

Оставить мнение