EditPlus 2.01b 序號產生器的製作 (22千字)
EditPlus 2.01b 序號產生器的製作
作者:夜月
E-mail:luoyi.ly@yeah.net
寫作日期: 30th August,2001
修改時間:30th August,2001
版本:2.01 Beta
軟體背景資料
執行平臺: Win9X
檔名稱: Ep2setup20b.exe
程式型別:
Text Edit
下載地點: http://www.editplus.com
檔案大小: 910KB
使用的工具
Trw2000 V1.23--Win9X Debugger
W32Dasm V8.93--Win9X Dissembler
Masm32 V5.00--KeyGen Compiler
難易程度
Easy( ) Medium(X)
Hard( ) Pro( )
------------------=====Begin=====------------------
關於EditPlus的註冊碼問題,在《論壇精華2》中,dr0大客曾經說過:“好象從1.21版本就
開始了。它判斷註冊碼不是集中在一個地方判斷,程式剛啟動的時候判斷幾位,退出的時候再判斷另
外幾位,你使用它的preferences選單的時候再判斷一位。
以上是舊版本的情況。2.01a版本與此有所不同。由於不知道它會在哪裡判斷註冊碼,所以不
能清除BPR斷點,即要一直保留針對輸入的假註冊碼所設的BPR斷點;或者用bpx RegDeleteValueA設斷
點,試用一下其各種功能,看它是否會刪除登錄檔中的假註冊碼,就可以找到判斷註冊碼的地方。另外,
這個軟體的註冊碼的前5位是由後面的計算出來的,而後面有多少位並無明顯的限制,所以各人作出來的
註冊碼長短不一。另,據說註冊碼似乎有隨機性。
”
由這段話,我們可以認識到:程式判斷註冊碼的地點不集中,有很多操作可以觸發判斷註冊碼
正確與否的例程。但是,由實際分析結果來看,其所說的用bpr斷點找到各個判斷例程的方法在對付這個
程式時並不適用。原因很簡單:該程式判斷註冊碼正確與否的子例程總共有8處之多。而觸發這8個判斷
程式碼的條件我們並不清楚。就我跟蹤的結果來看,一次是在輸入註冊碼時(這也是最明顯的一處,
《論壇精華2》中,xiA Qin的爆破就是在這段子例程中修改程式碼的);一次是在你關閉程式時;一次是
在你按照程式提示,重新進入程式時;前面這三處還很容易想到,因為大部分的軟體都是在這些時候判
斷註冊碼的正確性。而剩下來的其他4次,其觸發事件就很獨特了。dr0大客說使用preferences選單時會
判斷一位,就我跟蹤來看,並不正確。雖然在使用preferences選單的過程中,會呼叫判斷註冊碼的例程,
但此時該例程的作用並不是判斷註冊碼正確與否,而僅僅是程式執行的正常需要。倒是在按下工具條上的
“open”快捷紐時,會觸發一處註冊碼判斷。至於其他幾處,我沒有去細找。因為此時,我已經發現了程
序判斷註冊碼的核心子例程了――也就是說,程式每個判斷註冊碼的地方,都要呼叫該字例程。找到核心
子例程之後,要找判斷點就容易多了。該子例程的作用其實很簡單――把一個16進位制數轉成字串存放在
指定的地點同時作滅零處理(這也就是後面計算註冊碼步驟中的第7步的原因)。下面就是該程式判斷註冊
碼的核心子例程:
*
Referenced by a CALL at Addresses:
|:00419A28 , :004218EA , :004575A5
, :0045EAFF , :0045EB2F
|:0045EB5F , :0045EB8F ,
:0045F6F6 , :004622C1 , :0046264E
|:004626A4 , :0047B952
, :0049CD24
;總共13處呼叫
|
:0048FBE0 55
push ebp
:0048FBE1
8BEC mov
ebp, esp
:0048FBE3 83EC20
sub esp, 00000020
:0048FBE6 8B4508
mov eax, dword ptr [ebp+08]
:0048FBE9
56
push esi
:0048FBEA 8945E8
mov dword ptr [ebp-18], eax
:0048FBED 8945E0
mov dword ptr [ebp-20], eax
:0048FBF0
8D4510 lea eax,
dword ptr [ebp+10]
:0048FBF3 C745EC42000000
mov [ebp-14], 00000042
:0048FBFA 50
push eax
:0048FBFB 8D45E0
lea eax, dword ptr [ebp-20]
:0048FBFE FF750C
push [ebp+0C]
:0048FC01 C745E4FFFFFF7F
mov [ebp-1C], 7FFFFFFF
:0048FC08 50
push eax
:0048FC09 E897470000
call 004943A5
:0048FC0E 83C40C
add esp, 0000000C
:0048FC11
FF4DE4 dec [ebp-1C]
:0048FC14 8BF0
mov esi, eax
:0048FC16 7808
js 0048FC20
:0048FC18 8B45E0
mov eax, dword ptr [ebp-20]
:0048FC1B
802000 and byte
ptr [eax], 00
:0048FC1E EB0D
jmp 0048FC2D
* Referenced by a (U)nconditional
or (C)onditional Jump at Address:
|:0048FC16(C)
|
:0048FC20 8D45E0
lea eax, dword ptr [ebp-20]
:0048FC23 50
push eax
:0048FC24 6A00
push 00000000
:0048FC26 E862460000
call 0049428D
:0048FC2B 59
pop ecx
:0048FC2C
59
pop ecx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0048FC1E(U)
|
:0048FC2D 8BC6
mov eax, esi
:0048FC2F 5E
pop esi
:0048FC30
C9
leave
:0048FC31 C3
ret
在這裡,很清楚地看到,主程式中總共有13處呼叫了該核心子例程,但並不是每一次呼叫都是用
來判斷註冊碼的。我們如何區分?很簡單,分別到這13處呼叫處看一下就知道了。下面舉一例說明:
:004199F4 83C117
add ecx, 00000017
<====此處,ecx是根據你名字算出來的一個值
:004199F7 B8ABAAAA2A
mov eax, 2AAAAAAB
:004199FC F7E9
imul ecx
:004199FE 8BC2
mov eax, edx
:00419A00 C1E81F
shr eax, 1F
:00419A03 8D440203
lea eax, dword ptr [edx+eax+03]
:00419A07 8D0CC500000000
lea ecx, dword ptr [8*eax+00000000]
:00419A0E 2BC8
sub ecx, eax
:00419A10 81E10F000080 and ecx, 8000000F
:00419A16 7905
jns 00419A1D
:00419A18 49
dec ecx
:00419A19 83C9F0
or ecx, FFFFFFF0
:00419A1C
41
inc ecx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00419A16(C)
|
:00419A1D 51
push ecx
:00419A1E 8D542418
lea edx, dword ptr [esp+18]
* Possible StringData Ref from Data Obj ->"%1X"
|
:00419A22 6880534F00
push 004F5380
:00419A27 52
push edx
:00419A28 E8B3610700
call 0048FBE0 <====呼叫核心子例程
:00419A2D 8B86F0020000 mov eax,
dword ptr [esi+000002F0]
:00419A33 83C40C
add esp, 0000000C
:00419A36 8B00
mov eax, dword ptr [eax]
<====eax指向註冊碼
:00419A38 8378F807
cmp dword ptr [eax-08], 00000007 <====長度大於7?
:00419A3C
7C0B jl 00419A49
<====not great,bad guy!
:00419A3E 8A4006
mov al, byte ptr [eax+06] <====註冊碼第7位
:00419A41 8A4C2414
mov cl, byte ptr [esp+14] <====由名字計算得出的校驗值
:00419A45 3AC1
cmp al, cl
<====比較
:00419A47 740C
je 00419A55
<====equal,good guy!
這就很容易看出,419A28處,一定是一個判斷點(但是它的判斷觸發事件,我們並不知道!)。
再來看一處不是判斷點的程式碼,區別就很明顯了:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045EAD5(C)
|
:0045EAE7 D9442420
fld dword ptr [esp+20]
:0045EAEB DC742414
fdiv qword ptr [esp+14]
:0045EAEF
83EC08 sub esp,
00000008
:0045EAF2 8D442430
lea eax, dword ptr [esp+30]
:0045EAF6 DD1C24
fstp qword ptr [esp]
* Possible StringData
Ref from Data Obj ->"%.2f"
|
:0045EAF9
68C0614F00 push 004F61C0
:0045EAFE 50
push eax
:0045EAFF E8DC100300
call 0048FBE0
:0045EB04 83C410
add esp, 00000010
:0045EB07 8D4C2428
lea ecx, dword ptr [esp+28]
:0045EB0B
51
push ecx
:0045EB0C 8D8E00030000
lea ecx, dword ptr [esi+00000300]
:0045EB12 E88D450400
call 004A30A4
:0045EB17 D9442424
fld dword ptr [esp+24]
:0045EB1B
DC742414 fdiv qword ptr
[esp+14]
:0045EB1F 83EC08
sub esp, 00000008
:0045EB22 8D542430
lea edx, dword ptr [esp+30]
:0045EB26 DD1C24
fstp qword ptr [esp]
整段程式沒有一個比較語句。而且,在跟蹤時我們可以透過“d”和“?”發現,該段程式和我們
輸入的註冊碼以及名字沒有任何聯絡,所以我們可以斷定:此處不是在比較註冊碼。
下面,我把這13處呼叫及其判斷物件整理如下供大家參考:
(L=註冊碼長度;Str[]=註冊碼字串)
序號 地址
是否判斷點 判斷物件
01 00419A28
是
L>7 AND Str[6]
02 004218EA
是
L>A AND Str[9]
03 004575A5
是
L>8 AND Str[7]
04 0045EAFF
否
05
0045EB2F 否
06 0045EB5F
否
07 0045EB8F
否
08
0045F6F6 否
09 004622C1
是 L>B AND Str[A]
10 0046264E
是 L>5 AND Str[4]
11 004626A4
是 Str[2]
AND Str[3]
12 0047B952
是
Str[0] AND Str[1]
13 0049CD24
是
L>9 AND Str[8]
由該表我們可以發現,註冊碼至少應為11位長,程式只判斷前11位中的10位(除開第6位,也就是
Str[5])。由於未發現其他判斷處,所以,程式的註冊碼的長度應該只要大於11就可以。其中,第1,2位是
透過後面的號碼推算出來的。而其他的(從第3位往後,除開第6位,到第11位為止)號碼則由名字推算出來。
具體演算法可以表示如下:
(1) 由名字得到一個Magic
Number:
SUM=1;
for(i=0;i<strlen(name);i++)
SUM+=name[i];
得到的SUM就是我們所需要的Magic Number。
(2) 由Magic Number算出註冊碼的第5和7--11位。(具體演算法見序號產生器原始碼,此處從略)
(3) 由名字算出註冊碼的第3,4位:
(num[]是一張256個Word的資料表,詳見序號產生器原始碼)
ax=0;dx=0;bx=0;
for (i=0;i<strlen(name);i++)
{
dx=ax;
dx&=0xff;
dx^=name[i];
bx=ax>>8;
ax=num[dx];
ax^=bx;
}
得出的ax中的ah,就是註冊碼的第3,4位。
(4)
註冊碼的第6位任意(在我的序號產生器裡,假設它為0)。
(5) 由註冊碼的第3--11算出註冊碼的第1,2位。
(num[]和第三步的含義相同;newstr[]指向註冊碼第2位後面的字串)
ax=0;dx=0;bx=0;
for (i=0;i<strlen(newstr);i++)
{
dx=ax;
dx&=0xff;
dx^=newstr[i];
bx=ax>>8;
ax=num[dx];
ax^=bx;
}
(6)
得出的ax中的ah,就是註冊碼的第1,2位
(7) 如果註冊碼的第1位為0,則需要延長註冊碼的長度,以使第一位不為0。(在我的序號產生器裡,沒有
使註冊碼延長的程式碼。我是透過讓使用者改變使用者名稱實現的。如果哪位對它有興趣的話,可以自己
新增該功能)。
------------------=====
Last Words=====------------------
該程式的破解,可以說是動態跟蹤+靜態分析的典範:為了找全程式的註冊監測點,我們需要在多
次動態跟蹤,熟悉程式註冊流程的基礎上對靜態反彙編程式碼仔細分析;分析出來檢測點以後,又要由動態
跟蹤確定各檢測點呼叫核心子例程的各自引數的含義
。兩者結合,才能徹底搞清楚程式的註冊演算法,從而
寫出序號產生器。
常看到有人問序號產生器裡面的那張很大的表格是怎麼的來的。呵呵……當然不是抄下來的拉。你可以
在Trw2000裡“d memeory address l length >filename”把數表所在的記憶體資料儲存下來。再用EditPlus
(也就是在這篇文章裡捱揍的那個程式)的“列塊選擇”功能去掉一些不必要的空格和地址資料以及ASCII
碼資料,再用Tc2.0編一個小程式就可以轉成你想要的格式的表格了。這個程式編起來不是很複雜,有興趣
的朋友就當作是學習C語言檔案操作的一個入門吧!
序號產生器的編譯器選擇也很重要。在32位程式大行其道的今天,Tc2.0實在是有點力不從心-----雖然
它是最經典的編譯器之一。相形之下,Vc++ 6.0則方便得多。而我手頭現在沒有Vc++,所以只好將就著用
M32asmV5了。我是臨時報佛腳地學了一下Win32Asm^_^,所以程式碼寫得比較亂。有條件的朋友建議用Vc++6.0
編注冊機,肯定好看多了!:)
------------------=====KeyGen=====------------------
批處理編譯檔案:makekey.bat
---------------------------------------Cut From Here------------------------------------------
@echo off
set include=d:\masm32\include
set lib=d:\masm32\lib
set path=d:\masm32\bin
if not exist rsrc.rc goto over1
d:\masm32\bin\rc /v rsrc.rc
d:\masm32\bin\cvtres /machine:ix86 rsrc.res
:over1
if exist ep_keygen.obj del ep_keygen.obj
if exist ep_keygen.exe del ep_keygen.exe
d:\masm32\bin\ml /c /coff ep_keygen.asm
if errorlevel 1 goto errasm
if not exist rsrc.obj goto nores
d:\masm32\bin\Link /SUBSYSTEM:WINDOWS ep_keygen.obj rsrc.obj
if errorlevel 1 goto errlink
goto TheEnd
:nores
d:\masm32\bin\Link /SUBSYSTEM:WINDOWS ep_keygen.obj
if errorlevel 1 goto errlink
goto TheEnd
:errlink
echo _
echo Link error
goto TheEnd
:errasm
echo _
echo Assembly Error
goto TheEnd
:TheEnd
-----------------------------------------Cut End---------------------------------------------
資原始檔:rsrc.rc
---------------------------------------Cut From Here------------------------------------------
#include <Resource.h>
#define IDGEN 10
#define DLG_MAIN 100
#define EDIT1 11
#define EDIT2 12
DLG_MAIN DIALOGEX 100,150,250,60
STYLE DS_MODALFRAME|WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME
CAPTION "EditPlus2.01b KenGen By Robotow"
FONT 9,"宋體"
BEGIN
CONTROL "Name:",-1,"Static",SS_LEFT,10,13,40,17
CONTROL "SN:" ,-2,"Static",SS_CENTER,10,40,20,17
CONTROL "" ,11,"Edit",ES_LEFT,30,13,150,10
CONTROL "" ,12,"Edit",ES_LEFT,30,40,150,10
CONTROL "GENERATE",IDGEN,"BUTTON",BS_PUSHBUTTON,200,11,40,15
CONTROL "EXIT",IDCLOSE,"BUTTON",BS_PUSHBUTTON,200,36,41,14
END
-----------------------------------------Cut End----------------------------------------------
程式原始碼:ep_keygen.asm
---------------------------------------Cut From Here------------------------------------------
.386
.model flat,stdcall
option casemap:none
include windows.inc
include user32.inc
include kernel32.inc
include comctl32.inc
include comdlg32.inc
include masm32.inc
includelib masm32.lib
includelib user32.lib
includelib kernel32.lib
includelib comctl32.lib
includelib comdlg32.lib
DLG_MAIN equ 100
IDGEN equ 10
Edit1 equ 11
Edit2 equ 12
_ProcDlgMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
HtoA PROTO :DWORD,:DWORD,:BYTE
.data?
szSN db 11 dup(?)
.data
num dw 00000h,0C0C1h,0C181h,00140h,0C301h,003C0h,00280h,0C241h,0C601h,006C0h,00780h,0C741h
dw 00500h,0C5C1h,0C481h,00440h,0CC01h,00CC0h,00D80h,0CD41h,00F00h,0CFC1h,0CE81h,00E40h
dw 00A00h,0CAC1h,0CB81h,00B40h,0C901h,009C0h,00880h,0C841h,0D801h,018C0h,01980h,0D941h
dw 01B00h,0DBC1h,0DA81h,01A40h,01E00h,0DEC1h,0DF81h,01F40h,0DD01h,01DC0h,01C80h,0DC41h
dw 01400h,0D4C1h,0D581h,01540h,0D701h,017C0h,01680h,0D641h,0D201h,012C0h,01380h,0D341h
dw 01100h,0D1C1h,0D081h,01040h,0F001h,030C0h,03180h,0F141h,03300h,0F3C1h,0F281h,03240h
dw 03600h,0F6C1h,0F781h,03740h,0F501h,035C0h,03480h,0F441h,03C00h,0FCC1h,0FD81h,03D40h
dw 0FF01h,03FC0h,03E80h,0FE41h,0FA01h,03AC0h,03B80h,0FB41h,03900h,0F9C1h,0F881h,03840h
dw 02800h,0E8C1h,0E981h,02940h,0EB01h,02BC0h,02A80h,0EA41h,0EE01h,02EC0h,02F80h,0EF41h
dw 02D00h,0EDC1h,0EC81h,02C40h,0E401h,024C0h,02580h,0E541h,02700h,0E7C1h,0E681h,02640h
dw 02200h,0E2C1h,0E381h,02340h,0E101h,021C0h,02080h,0E041h,0A001h,060C0h,06180h,0A141h
dw 06300h,0A3C1h,0A281h,06240h,06600h,0A6C1h,0A781h,06740h,0A501h,065C0h,06480h,0A441h
dw 06C00h,0ACC1h,0AD81h,06D40h,0AF01h,06FC0h,06E80h,0AE41h,0AA01h,06AC0h,06B80h,0AB41h
dw 06900h,0A9C1h,0A881h,06840h,07800h,0B8C1h,0B981h,07940h,0BB01h,07BC0h,07A80h,0BA41h
dw 0BE01h,07EC0h,07F80h,0BF41h,07D00h,0BDC1h,0BC81h,07C40h,0B401h,074C0h,07580h,0B541h
dw 07700h,0B7C1h,0B681h,07640h,07200h,0B2C1h,0B381h,07340h,0B101h,071C0h,07080h,0B041h
dw 05000h,090C1h,09181h,05140h,09301h,053C0h,05280h,09241h,09601h,056C0h,05780h,09741h
dw 05500h,095C1h,09481h,05440h,09C01h,05CC0h,05D80h,09D41h,05F00h,09FC1h,09E81h,05E40h
dw 05A00h,09AC1h,09B81h,05B40h,09901h,059C0h,05880h,09841h,08801h,048C0h,04980h,08941h
dw 04B00h,08BC1h,08A81h,04A40h,04E00h,08EC1h,08F81h,04F40h,08D01h,04DC0h,04C80h,08C41h
dw 04400h,084C1h,08581h,04540h,08701h,047C0h,04680h,08641h,08201h,042C0h,04380h,08341h
dw 04100h,081C1h,08081h,04040h,0
szMess db " 名字的長度必須大於5!",0
szErrName db "請修改使用者名稱!",0
szCaption db "Error!"
hInstance dd 0
szName db 20 dup(0)
lname dd 0
lSum dd 0
szTemp db 20 dup(0)
.code
HtoA proc uses ebx edx ecx edi,Hex:DWORD,lpString:DWORD,long:BYTE
xor ecx,ecx
mov cl,long
mov eax,Hex
mov ebx,eax
mov edi,lpString
Hloop:
and eax,0fh
add eax,30h
.if eax>'9'
add eax,7
.endif
mov byte ptr[edi+ecx-1],al
mov eax,ebx
shr eax,4
mov ebx,eax
loop Hloop
ret
HtoA endp
_ProcDlgMain proc uses ebx edi esi edx ecx,hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD
mov eax,wMsg
.if eax==WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax==WM_COMMAND
mov eax,wParam
and eax,0ffffh
.if eax==IDGEN
invoke GetDlgItemText, hWnd,Edit1,offset szName,20
invoke lnstr,offset szName
.if eax<5
invoke MessageBox,NULL,offset szMess,offset szCaption,MB_OK
mov eax,FALSE
ret
.endif
mov ecx,eax
mov esi,eax
mov lname,eax
xor eax,eax
loop1:
mov edx, eax
xor ebx, ebx
push esi
sub esi,ecx
mov bl,[szName+esi]
pop esi
and edx, 0FFh
xor edx, ebx
xor ebx, ebx
mov bl, ah
mov ax, word ptr [num+2*edx]
xor ax, bx
loop loop1
and eax,0ffffh
shr eax,8
invoke HtoA,eax,offset szTemp,2
mov al,byte ptr[szTemp]
mov byte ptr[szSN+2],al ;註冊碼第3位
mov al,byte ptr [szTemp+1]
mov byte ptr [szSN+3],al ;註冊碼第4位
mov byte ptr [szSN+5],'0' ;註冊碼第6位
mov ecx,lname
mov esi,ecx
mov lSum,1
mov edi,0ffh
gen_sum:
push esi
sub esi,ecx
mov dl,byte ptr [szName+esi]
pop esi
and dx,0ffh
add lSum,edx
loop gen_sum
mov ecx,lSum
lea ecx, dword ptr [ecx+8*ecx+0Ah]
mov eax, 55555556h
imul ecx
mov eax, edx
shr eax, 1Fh
lea ecx, dword ptr [edx+eax+24h]
and ecx, 8000000Fh
jns next5
dec ecx
or ecx, 0FFFFFFF0h
inc ecx
next5:
invoke HtoA,ecx,offset szTemp,1
mov dl,byte ptr[szTemp]
mov byte ptr[szSN+4],dl ;註冊碼第5位
mov ecx,lSum
add ecx, 00000017h
mov eax, 2AAAAAABh
imul ecx
mov eax, edx
shr eax, 1Fh
lea eax, dword ptr [edx+eax+03]
lea ecx, dword ptr [8*eax+00000000]
sub ecx, eax
and ecx, 8000000Fh
jns next7
dec ecx
or ecx, 0FFFFFFF0h
inc ecx
next7:
invoke HtoA,ecx,offset szTemp,1
mov dl,byte ptr[szTemp]
mov byte ptr [szSN+6],dl ;註冊碼第7位
mov ecx,lSum
lea ecx, dword ptr [ecx+2*ecx+13h]
mov eax, 38E38E39h
imul ecx
sar edx, 1
mov eax, edx
shr eax, 1Fh
add edx, eax
and edx, 8000000Fh
jns next8
dec edx
or edx, 0FFFFFFF0h
inc edx
next8:
invoke HtoA,edx,offset szTemp,1
mov dl,byte ptr[szTemp]
mov byte ptr [szSN+7],dl ;註冊碼第8位
mov ecx,lSum
lea ecx, dword ptr [ecx+4*ecx+0Bh]
mov eax, 66666667h
imul ecx
sar edx, 1
mov eax, edx
shr eax, 1Fh
add edx, eax
and edx, 8000000Fh
jns next9
dec edx
or edx, 0FFFFFFF0h
inc edx
next9:
invoke HtoA,edx,offset szTemp,1
mov dl,byte ptr[szTemp]
mov byte ptr [szSN+8],dl ;註冊碼第9位
mov ecx,lSum
lea eax, dword ptr [ecx+2*ecx+27h]
cdq
and edx, 00000007
add eax, edx
sar eax, 03
and eax, 8000000Fh
jns nexta
dec eax
or eax, 0FFFFFFF0h
inc eax
nexta:
invoke HtoA,eax,offset szTemp,1
mov dl,byte ptr[szTemp]
mov byte ptr [szSN+9],dl ;註冊碼第10位
mov edi,lSum
lea ecx, dword ptr [edi+0Ah]
mov eax, 55555556h
imul ecx
mov eax, edx
shr eax, 1Fh
add edx, eax
shl edx, 03
and edx, 8000000Fh
jns nextb
dec edx
or edx, 0FFFFFFF0h
inc edx
nextb:
invoke HtoA,edx,offset szTemp,1
mov dl,byte ptr[szTemp]
mov byte ptr [szSN+10],dl ;註冊碼第11位
mov ecx,9
xor eax,eax
mov esi,11
loop2:
mov edx, eax
xor ebx, ebx
push esi
sub esi,ecx
mov bl, byte ptr [szSN+esi]
pop esi
movzx edx,dl
xor edx, ebx
xor ebx, ebx
mov bl, ah
mov ax, word ptr [num+edx*2]
xor ax, bx
loop loop2
and eax,0ffffh
shr eax,8
invoke HtoA,eax,offset szTemp,2
mov al,byte ptr [szTemp]
.if al==30 ;如果註冊碼第一位為0,重新輸入使用者名稱
invoke MessageBox,0,offset szErrName,offset szCaption,MB_OK
mov eax,FALSE
ret
.endif
mov byte ptr [szSN],al
mov al,byte ptr [szTemp+1]
mov byte ptr [szSN+1],al
invoke SetDlgItemText,hWnd,Edit2,offset szSN
mov eax,FALSE
ret
.elseif eax==IDCLOSE
invoke EndDialog,hWnd,NULL
.endif
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
start:
invoke InitCommonControls
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,0
invoke ExitProcess,NULL
end start
end
-----------------------------------------Cut End--------------------------------------------
------------------=====Ending=====------------------
aNY qUESTIONS,pLEASE eMAIL tO: luoyi.ly@yeah.net
Thanks To All!Good Luck!
相關文章
- 製作mIRC6.02序號產生器(給別人寫的初學者序號產生器教材) (14千字)2015-11-15
- 一個CrackMe的破解以及序號產生器的製作
(4千字)2001-08-16
- 如何製作VB程式記憶體序號產生器--國內某軟體的序號產生器(隱去軟體資訊)
(14千字)2002-08-04記憶體
- winzip序號產生器 (1千字)2001-04-12
- winzip的通用序號產生器 (2千字)2001-12-10
- MP3 explorer 破解和序號產生器的製作2015-11-15
- 序號產生器制分析: (1千字)2001-11-19
- 用KEYMAKE製作記憶體序號產生器特殊一例
(11千字)2015-11-15記憶體
- Kalua Cocktails 1.1完全破解,內附彙編序號產生器(用序號產生器編寫器,並有它的使用教程)
(22千字)2002-02-27AI
- 《淺談利用RSA演算法防止非法序號產生器的製作》2004-05-20演算法
- 序號產生器合集2024-03-17
- supercapture3.0的版序號產生器!
(4千字)2002-04-23APT
- 美萍安全衛士V8.45序號產生器制作分析過程,及序號產生器! (11千字)2001-10-28
- Gif2Swf Ver 2.1 TC20序號產生器 && MASM32序號產生器 (4千字)2001-12-10ASM
- EmEditor V3.29和它的序號產生器 (12千字)2015-11-15
- IrfanView 序號產生器分析(初級版)
(13千字)2015-11-15View
- 橋牌軟體Deep Finesse的序號產生器 (1千字)2015-11-15
- 製作自己的記憶體序號產生器--------檔案隱藏精靈註冊碼獲取 (4千字)2015-11-15記憶體
- Myeclipse 6.5 序號產生器2020-04-06Eclipse
- Lc3&Lc4
註冊演算法分析及序號產生器的製作2004-06-18演算法
- NewsReactor 1.0 Build 5009的序號產生器制分析 (16千字)2001-08-07ReactUI
- 另類序號產生器(一MFC程式的改造心得) (3千字)2001-09-10C程式
- 鬥地主4.0註冊演算法,序號產生器在OCG論壇
(22千字)2015-11-15演算法
- AlgoLab PtVector的破解及序號產生器的編寫 (17千字)2001-05-04Go
- HappyIcon序號產生器TC原始碼 (1千字)2001-04-08APP原始碼
- NetTalk破解與序號產生器(高手勿進) (10千字)2001-09-20
- 序號產生器寫作教學。奉賢給想加入CCG和BCG的朋友。 (11千字)2001-10-21
- 分享一個navicat序號產生器2024-04-02
- HexDiff V2.51和它的序號產生器(MASM32) (6千字)2015-11-15ASM
- win10如何執行序號產生器_win10怎麼執行序號產生器2020-08-28Win10
- UltraEdit-32 8.10.1.0的破解及序號產生器的生成 (15千字)2001-05-15
- Audio compositor註冊碼及序號產生器 (5千字)2002-04-06
- 用keymake制序號產生器實戰~高手莫入~~ (1千字)2001-09-30
- Turbo Note+ V4.4序號產生器制分析 (19千字)2001-11-07
- 破解accoustica
2.21(帶序號產生器)----讓高手見笑了:) (11千字)2002-03-31
- Resource
Builder 1.1.0 完全破解~~附彙編序號產生器 (10千字)2015-11-15UI
- 網頁加密器(HTMLEncryptor1.1)破解及序號產生器 (1千字)2001-04-22網頁加密HTML
- 俠客系統修改器 V1.21 序號產生器 (2千字)2001-09-01