Теперь посмотрим процедуру проверки, для этого дизассемблируем в 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 нашей программы, нажмем кнопку
и получим регистрационный номер. Пробуем ввести его в программу, появляется
анимация явно дающая нам понять, что проверка прошла успешно.
Статья предоставлена в образовательных целях только!