/////////////////////////////////
// mIRC6.16 注册算法分析
//
// Author: icytear
// Date : 2005-12-14
//
/////////////////////////////////
1. 查看没有加壳, 哈哈省了不少麻烦 :) .
2. 用OllyDbg加载, F9运行.... 弹出讨厌的
"Evaluation time left: 28 days", 点"Continue" 继
续试用, 选择菜单 Help-Register.. 打开注册对话框,
"Full Name"输入 "icytear", "Registration Code"输
入"280060443" 点"OK", 弹出提示"注册码无效", 这里
可以试一下常用的MessageBoxA(W)断点, HIHI, 没有用
这个函数。
3. 那就来个绝的 bp SendDlgItemMessageA, 点"OK",
程序断在SendDlgItemMessageA处, ALT+F9 返回到mIRC
领空
代码:
004C7BAA push mirc.005A07E0 ;
/lParam = 5A07E0
004C7BAF push 3E7 ;
|wParam = 3E7
004C7BB4 push 0D ;
|Message = WM_GETTEXT
004C7BB6 push 83 ;
|ControlID = 83 (131.)
004C7BBB push esi ;
|hWnd
004C7BBC call edi ;
\SendDlgItemMessageA
004C7BBE push mirc.005A0BC8 ;
/lParam = 5A0BC8 <===ALT+F9程序返回到这
里
004C7BC3 push 3E7 ;
|wParam = 3E7
004C7BC8 push 0D ;
|Message = WM_GETTEXT
004C7BCA push 84 ;
|ControlID = 84 (132.)
004C7BCF push esi ;
|hWnd
004C7BD0 call edi ;
\SendDlgItemMessageA
004C7BD2 mov edx,mirc.005A0BC8 ;
ASCII "280060443"
004C7BD7 mov ecx,mirc.005A07E0 ;
ASCII "icytear"
004C7BDC call mirc.004C7600 ;
====>关键函数
004C7BE1 test eax,eax
004C7BE3 je mirc.004C7CCE
;====>关键跳转,跳转注册失败
关闭SendDlgItemMessageA断点, 进入F7跟进004c7600
代码:
004C7600 sub esp,208
004C7606 push esi
004C7607 push edi
004C7608 mov esi,edx
004C760A mov edi,ecx
004C760C mov edx,104
004C7611 lea ecx,dword ptr ss:[esp+8]
004C7615 call mirc.0041EF30
004C761A mov edx,104
004C761F lea ecx,dword ptr ss:[esp+10C]
004C7626 call mirc.0041EF30
004C762B push edi
004C762C mov edx,104
004C7631 lea ecx,dword ptr ss:[esp+C]
004C7635 call mirc.0041EE40
004C763A push esi
004C763B mov edx,104
004C7640 lea ecx,dword ptr ss:[esp+110]
004C7647 call mirc.0041EE40
004C764C lea edx,dword ptr ss:[esp+10C]
004C7653 lea ecx,dword ptr ss:[esp+8]
004C7657 call mirc.004C7400
;====>跟进去
004C765C test eax,eax
004C765E je short mirc.004C766E ;
如果上面注册失败跳转
004C7660 pop edi
004C7661 mov eax,1
004C7666 pop esi
004C7667 add esp,208
004C766D retn
004C766E mov edx,104
004C7673 lea ecx,dword ptr ss:[esp+8]
004C7677 call mirc.0041EF30
004C767C mov edx,104
004C7681 lea ecx,dword ptr ss:[esp+10C]
004C7688 call mirc.0041EF30
004C768D push edi
004C768E mov edx,104
004C7693 lea ecx,dword ptr ss:[esp+C]
004C7697 call mirc.0041EE40
004C769C push esi
004C769D mov edx,104
004C76A2 lea ecx,dword ptr ss:[esp+110]
004C76A9 call mirc.0041EE40
004C76AE mov edx,2
004C76B3 lea ecx,dword ptr ss:[esp+8]
004C76B7 call mirc.004793B0
;====>这里对用户名进行转换
004C76BC lea edx,dword ptr ss:[esp+10C]
004C76C3 lea ecx,dword ptr ss:[esp+8]
004C76C7 call mirc.004C7400
;====>又调用一次
004C76CC neg eax
004C76CE sbb eax,eax
004C76D0 pop edi
004C76D1 neg eax
004C76D3 pop esi
004C76D4 add esp,208
004C76DA retn
;跟进004c7400
代码:
sub_004c7400:
004C7400 sub esp,0A4
004C7406 push ebx
004C7407 push ebp
004C7408 push esi
004C7409 mov esi,0B
004C740E mov eax,0A
004C7413 push edi
004C7414 mov edi,ecx
004C7416 mov ecx,0E
004C741B mov dword ptr ss:[esp+14],esi
004C741F mov ebp,6
004C7424 mov ebx,10
004C7429 mov dword ptr ss:[esp+3C],esi
004C742D mov dword ptr ss:[esp+50],esi
004C7431 mov dword ptr ss:[esp+64],esi
004C7435 mov dword ptr ss:[esp+70],esi
004C7439 mov esi,8
004C743E mov dword ptr ss:[esp+10],edx
004C7442 mov edx,0C
004C7447 mov dword ptr ss:[esp+28],ecx
004C744B mov dword ptr ss:[esp+38],eax
004C744F mov dword ptr ss:[esp+44],ecx
004C7453 mov dword ptr ss:[esp+48],ecx
004C7457 mov dword ptr ss:[esp+58],ecx
004C745B mov dword ptr ss:[esp+5C],ecx
004C745F mov ecx,4
004C7464 mov dword ptr ss:[esp+74],eax
004C7468 mov dword ptr ss:[esp+7C],eax
004C746C mov dword ptr ss:[esp+80],eax
004C7473 mov dword ptr ss:[esp+94],eax
004C747A mov dword ptr ss:[esp+A4],eax
004C7481 mov eax,edi
004C7483 mov dword ptr ss:[esp+78],esi
004C7487 mov dword ptr ss:[esp+88],esi
004C748E mov dword ptr ss:[esp+A0],esi
004C7495 mov dword ptr ss:[esp+18],ebp
004C7499 mov dword ptr ss:[esp+1C],11
004C74A1 mov dword ptr ss:[esp+20],edx
004C74A5 mov dword ptr ss:[esp+24],edx
004C74A9 mov dword ptr ss:[esp+2C],5
004C74B1 mov dword ptr ss:[esp+30],edx
004C74B5 mov dword ptr ss:[esp+34],ebx
004C74B9 mov dword ptr ss:[esp+40],ebp
004C74BD mov dword ptr ss:[esp+4C],4
004C74C5 mov dword ptr ss:[esp+54],ebp
004C74C9 mov dword ptr ss:[esp+60],ecx
004C74CD mov dword ptr ss:[esp+68],9
004C74D5 mov dword ptr ss:[esp+6C],edx
004C74D9 mov dword ptr ss:[esp+84],ebx
004C74E0 mov dword ptr ss:[esp+8C],ecx
004C74E7 mov dword ptr ss:[esp+90],ebp
004C74EE mov dword ptr ss:[esp+98],edx
004C74F5 mov dword ptr ss:[esp+9C],ebx
004C74FC mov dword ptr ss:[esp+A8],ecx
004C7503 mov dword ptr ss:[esp+AC],ebx
004C750A mov dword ptr ss:[esp+B0],0
;以上代码生成一个表如下
DWORD tb[] ={
0x0B, 0x06, 0x11, 0x0C,
0x0C, 0x0E, 0x05, 0x0C,
0x10, 0x0A, 0x0B, 0x06,
0x0E, 0x0E, 0x04, 0x0B,
0x06, 0x0E, 0x0E, 0x04,
0x0B, 0x09, 0x0C, 0x0B,
0x0A, 0x08, 0x0A, 0x0A,
0x10, 0x08, 0x04, 0x06,
0x0A, 0x0C, 0x10, 0x08,
0x0A, 0x04}
代码:
004C7515 lea esi,dword ptr ds:[eax+1]
004C7518 mov dl,byte ptr ds:[eax]
004C751A inc eax
004C751B test dl,dl
004C751D jnz short mirc.004C7518
004C751F sub eax,esi ;
计算字符串长度
004C7521 cmp eax,ecx
004C7523 jnb short mirc.004C7532 ;
输入的用户名小于4个字符直接返回0,注册失败
004C7525 pop edi
004C7526 pop esi
004C7527 pop ebp
004C7528 xor eax,eax ;
失败,返回0
004C752A pop ebx
004C752B add esp,0A4
004C7531 retn
004C7532 mov ebx,dword ptr ss:[esp+10]
004C7536 push 2D ;
字符"-"
004C7538 push ebx
004C7539 call <mirc._strchr>
004C753E mov esi,eax
004C7540 add esp,8
004C7543 test esi,esi
004C7545 je short mirc.004C7525
;上面代码在RegisterCode 串中查找字符 "-", 如果没
有找到跳转到004c7525返回失败.
;重新输入注册码"2800-60443", 跟到以下代码:
代码:
004C7547 push ebx
004C7548 mov byte ptr ds:[esi],0
004C754B call <mirc._aotl>
004C7550 add esp,4
004C7553 mov byte ptr ds:[esi],2D
004C7556 inc esi
004C7557 mov ebp,eax
004C7559 cmp byte ptr ds:[esi],0
004C755C je short mirc.004C7525
004C755E push esi
004C755F call <mirc._aotl>
004C7564 mov ecx,edi
004C7566 add esp,4
;以第一个"-"字符把注册码分成两部分, 再分别转换为
两个整数
004C7569 mov dword ptr ss:[esp+10],eax
004C756D lea edx,dword ptr ds:[ecx+1]
004C7570 mov al,byte ptr ds:[ecx]
004C7572 inc ecx
004C7573 test al,al
004C7575 jnz short mirc.004C7570
004C7577 sub ecx,edx ;
计算字符串长度(用户名或其变形)
004C7579 mov esi,3
004C757E xor edx,edx
004C7580 xor ebx,ebx
004C7582 cmp ecx,esi
004C7584 jle short mirc.004C75A8 ;
比较用户名的长度是否大于3
004C7586 jmp short mirc.004C7590
004C7588 lea esp,dword ptr ss:[esp]
004C758F nop
;下面是注册算法1, 用用户名第3位(0位基址)以后的字
符的值与查表tb得到的值乘积之和.
代码:
004C7590 movzx eax,byte ptr ds:[esi+edi]
004C7594 imul eax,dword ptr
ss:[esp+edx*4+14]
004C7599 add ebx,eax
004C759B inc edx
004C759C cmp edx,26
004C759F jle short mirc.004C75A3
004C75A1 xor edx,edx
004C75A3 inc esi
004C75A4 cmp esi,ecx
004C75A6 jl short mirc.004C7590
004C75A8 cmp ebp,ebx ;比较
1
004C75AA jnz mirc.004C7525 ;输入
的注册码的第一部分和计算出的值不等,跳转,注册失败
用C描述:
j=0;
for(i=3; i < strlen(username); i++)
{
RegCode1 += (username[i] * tb[j]);
j++;
if(j > sizeof(tb))
j = 0;
}
代码:
004C75B0 mov esi,3
004C75B5 xor edx,edx
004C75B7 xor ebx,ebx
004C75B9 cmp ecx,esi
004C75BB jle short mirc.004C75E0
004C75BD lea ecx,dword ptr ds:[ecx]
;以下是注册算法2, 从用户名第3位(0位基址)开始, 取
其值和前一个字符的值相乘,然后
;再查表tb得到的相应值相乘, 再取其和.
代码:
004C75C0 movzx eax,byte ptr ds:[esi+edi-1]
004C75C5 movzx ebp,byte ptr ds:[esi+edi]
004C75C9 imul eax,ebp
004C75CC imul eax,dword ptr
ss:[esp+edx*4+14]
004C75D1 add ebx,eax
004C75D3 inc edx
004C75D4 cmp edx,26
004C75D7 jle short mirc.004C75DB
004C75D9 xor edx,edx
004C75DB inc esi
004C75DC cmp esi,ecx
004C75DE jl short mirc.004C75C0
用C描述:
j = 0;
for(i=3; i < strlen(username); i++)
{
RegCode2 += (username[i-1] * username[i] *
tb[j]);
j++;
if(j > sizeof(tb))
j = 0;
}
代码:
004C75E0 mov ecx,dword ptr ss:[esp+10]
004C75E4 pop edi
004C75E5 pop esi
004C75E6 xor eax,eax
004C75E8 cmp ecx,ebx
; 比较2
004C75EA pop ebp
004C75EB sete al
004C75EE pop ebx
004C75EF add esp,0A4
004C75F5 retn
;到这里已经生成一次注册码了, 回到第一次调用
004C7400的地方
004C7657 call mirc.004C7400
;====>跟进去
004C765C test eax,eax
004C765E je short mirc.004C766E ;
如果上面注册失败跳转, 下面会对用户名进行转换后继
续注册
004C7660 pop edi
004C7661 mov eax,1
004C7666 pop esi
004C7667 add esp,208
004C766D retn
;如果我们在004c7657校验注册码失败的话回返回0,然后
跳转到下面代码
代码:
004C766E mov edx,104
004C7673 lea ecx,dword ptr ss:[esp+8]
004C7677 call mirc.0041EF30
004C767C mov edx,104
004C7681 lea ecx,dword ptr ss:[esp+10C]
004C7688 call mirc.0041EF30
004C768D push edi
004C768E mov edx,104
004C7693 lea ecx,dword ptr ss:[esp+C]
004C7697 call mirc.0041EE40
004C769C push esi
004C769D mov edx,104
004C76A2 lea ecx,dword ptr ss:[esp+110]
004C76A9 call mirc.0041EE40
004C76AE mov edx,2
004C76B3 lea ecx,dword ptr ss:[esp+8]
004C76B7 call mirc.004793B0
;====>这里对用户名进行转换,跟进
004C76BC lea edx,dword ptr ss:[esp+10C]
004C76C3 lea ecx,dword ptr ss:[esp+8]
004C76C7 call mirc.004C7400
;====>又调用一次, 这次注册失败的话,就没有机会了
004C76CC neg eax
004C76CE sbb eax,eax
004C76D0 pop edi
004C76D1 neg eax
004C76D3 pop esi
004C76D4 add esp,208
004C76DA retn
跟进004793b0:
代码:
sub_004793b0:
004793B0 sub esp,18
004793B3 push ebx
004793B4 push ebp
004793B5 push esi
004793B6 mov esi,ecx
004793B8 mov eax,esi
004793BA mov dword ptr ss:[esp+1C],edx
004793BE push edi
004793BF lea edx,dword ptr ds:[eax+1]
004793C2 /mov cl,byte ptr ds:[eax]
004793C4 |inc eax
004793C5 |test cl,cl
004793C7 \jnz short mirc.004793C2
004793C9 sub eax,edx
;计算字符串长度(用户名)
004793CB mov edi,eax
004793CD mov eax,mirc.0059B9F8
;0059B9F8这里存放了一个全局表g_tb0[]
004793D2 mov dword ptr ss:[esp+1C],edi
004793D6 lea edx,dword ptr ds:[eax+1]
004793D9 lea esp,dword ptr ss:[esp]
004793E0 /mov cl,byte ptr ds:[eax]
004793E2 |inc eax
004793E3 |test cl,cl
004793E5 \jnz short mirc.004793E0
004793E7 sub eax,edx
;计算g_tb0[]长度
表g_tb0如下:
char g_tb0[] ={
3, 7, 4, 2, 3, 8, 4, 6,
9, 3, 9, 8, 6, 5, 2, 6,
5, 2, 5, 4, 8, 9, 2, 6,
3, 4, 2, 7, 5, 6, 8, 9,
3, 2, 3, 5, 6, 8, 4, 0}
代码:
004793E9 mov ebp,eax
004793EB mov eax,dword ptr ss:[esp+20]
004793EF xor ebx,ebx
004793F1 cmp eax,ebx
004793F3 mov dword ptr ss:[esp+24],ebp
004793F7 mov dword ptr ss:[esp+18],ebx
004793FB mov dword ptr ss:[esp+14],ebx
004793FF je short mirc.00479457
00479401 xor ecx,ecx
00479403 cmp edi,ebx
00479405 mov dword ptr ss:[esp+18],ebx
00479409 mov dword ptr ss:[esp+14],ebx
0047940D jle short mirc.00479457
0047940F nop
00479410 /movzx eax,byte ptr ds:[ecx+esi]
00479414 |add ebx,eax
00479416 |cmp ebx,ebp
00479418 |jle short mirc.00479426
0047941A |lea ebx,dword ptr ds:[ebx]
00479420 |/sub ebx,ebp
00479422 ||cmp ebx,ebp
00479424 |\jg short mirc.00479420
00479426 |mov edi,dword ptr ss:[esp+14]
0047942A |add edi,eax
0047942C |cmp edi,1E
0047942F |mov dword ptr ss:[esp+14],edi
00479433 |jl short mirc.00479448
00479435 |mov eax,88888889
0047943A |mul edi
0047943C |shr edx,4
0047943F |imul edx,edx,-1E
00479442 |add edi,edx
00479444 |mov dword ptr ss:[esp+14],edi
00479448 |mov eax,dword ptr ss:[esp+1C]
0047944C |inc ecx
0047944D |cmp ecx,eax
0047944F \jl short mirc.00479410
00479451 mov dword ptr ss:[esp+18],ebx
00479455 mov edi,eax
00479457 xor eax,eax
00479459 xor ecx,ecx
0047945B test edi,edi
0047945D jle short mirc.00479475
0047945F nop
00479460 /mov dl,byte ptr
ds:[eax+59B9F8] ; 用户名转换
00479466 |add byte ptr ds:[ecx+esi],dl
00479469 |inc eax
0047946A |cmp eax,ebp
0047946C |jl short mirc.00479470
0047946E |xor eax,eax
00479470 |inc ecx
00479471 |cmp ecx,edi
00479473 \jl short mirc.00479460
00479475 mov eax,esi
00479477 xor ecx,ecx
00479479 lea edi,dword ptr ds:[eax+1]
0047947C lea esp,dword ptr ss:[esp]
00479480 /mov dl,byte ptr ds:[eax]
00479482 |inc eax
00479483 |test dl,dl
00479485 \jnz short mirc.00479480
00479487 sub eax,edi
; 计算字符串长度
00479489 dec eax
0047948A test eax,eax
0047948C jle short mirc.004794AA
0047948E mov edi,edi
00479490 /mov dl,byte ptr ds:[ecx+esi]
; 字符串反序
00479493 |mov byte ptr ss:[esp+13],dl
00479497 |mov dl,byte ptr ds:[eax+esi]
0047949A |mov byte ptr ds:[ecx+esi],dl
0047949D |mov dl,byte ptr ss:[esp+13]
004794A1 |inc ecx
004794A2 |mov byte ptr ds:[eax+esi],dl
004794A5 |dec eax
004794A6 |cmp ecx,eax
004794A8 \jl short mirc.00479490
004794AA mov eax,esi
004794AC lea edx,dword ptr ds:[eax+1]
004794AF nop
004794B0 /mov cl,byte ptr ds:[eax]
004794B2 |inc eax
004794B3 |test cl,cl
004794B5 \jnz short mirc.004794B0
004794B7 sub eax,edx
; 计算字符串长度
004794B9 lea ecx,dword ptr ds:[eax-1]
004794BC test ecx,ecx
004794BE jle short mirc.004794DB
004794C0 dec ecx
004794C1 shr ecx,1
004794C3 lea eax,dword ptr ds:[esi+1]
004794C6 inc ecx
004794C7 /mov dl,byte ptr ds:[eax-1]
; 字符串每两个字符反序
004794CA |mov bl,byte ptr ds:[eax]
004794CC |mov byte ptr ds:[eax-1],bl
004794CF |mov byte ptr ds:[eax],dl
004794D1 |add eax,2
004794D4 |dec ecx
004794D5 \jnz short mirc.004794C7
004794D7 mov ebx,dword ptr ss:[esp+18]
004794DB mov eax,dword ptr ss:[esp+20]
004794DF test eax,eax
004794E1 je mirc.004795E0
004794E7 cmp eax,1
004794EA jnz short mirc.00479500
004794EC call mirc.00572EFA
004794F1 cdq
004794F2 mov ecx,7
004794F7 idiv ecx
004794F9 inc edx
004794FA mov dword ptr ss:[esp+18],edx
004794FE jmp short mirc.0047950C
00479500 mov dword ptr ss:[esp+18],1
00479508 mov edx,dword ptr ss:[esp+18]
0047950C lea eax,dword ptr
ds:[edx+ebx]
0047950F cmp eax,ebp
00479511 jle short mirc.00479515
00479513 sub eax,ebp
00479515 mov edi,esi
00479517 lea ebp,dword ptr ds:[edi+1]
0047951A lea ebx,dword ptr ds:[ebx]
00479520 /mov cl,byte ptr ds:[edi]
00479522 |inc edi
00479523 |test cl,cl
00479525 \jnz short mirc.00479520
00479527 sub edi,ebp
; 字符串长度
00479529 xor ecx,ecx
0047952B test edi,edi
0047952D jle short mirc.0047954D
0047952F nop
00479530 /mov dl,byte ptr
ds:[eax+59B9F8] ; 又进行一次转换
00479536 |add byte ptr ds:[ecx+esi],dl
00479539 |mov edx,dword ptr ss:[esp+24]
0047953D |inc eax
0047953E |cmp eax,edx
00479540 |jl short mirc.00479544
00479542 |xor eax,eax
00479544 |inc ecx
00479545 |cmp ecx,edi
00479547 \jl short mirc.00479530
00479549 mov edx,dword ptr ss:[esp+18]
0047954D mov al,byte ptr ss:[esp+14]
00479551 add bl,64
00479554 mov byte ptr ds:[edi+esi],bl
; 加了一个字节
00479557 inc edi
00479558 add al,6E
0047955A mov byte ptr ds:[edi+esi],al
; 加一个字节
0047955D inc edi
0047955E lea ebp,dword ptr
ds:[edx+edi]
00479561 cmp edi,ebp
00479563 jge short mirc.00479581
00479565 /call mirc.00572EFA
0047956A |cdq
0047956B |mov ecx,64
00479570 |idiv ecx
00479572 |add dl,20
00479575 |mov byte ptr ds:[edi+esi],dl
; 加一个字节
00479578 |inc edi
00479579 |cmp edi,ebp
0047957B \jl short mirc.00479565
0047957D mov edx,dword ptr ss:[esp+18]
00479581 add dl,78
00479584 mov byte ptr ds:[edi+esi],dl
; 加一个字节
00479587 mov eax,esi
00479589 mov byte ptr ds:[edi+esi+1],0
; 串结束
0047958E xor ecx,ecx
00479590 lea edi,dword ptr ds:[eax+1]
00479593 /mov dl,byte ptr ds:[eax]
00479595 |inc eax
00479596 |test dl,dl
00479598 \jnz short mirc.00479593
0047959A sub eax,edi
0047959C dec eax
0047959D test eax,eax
0047959F jle short mirc.004795B3
004795A1 /mov bl,byte ptr ds:[eax+esi]
; 字符串反序
004795A4 |mov dl,byte ptr ds:[ecx+esi]
004795A7 |mov byte ptr ds:[ecx+esi],bl
004795AA |inc ecx
004795AB |mov byte ptr ds:[eax+esi],dl
004795AE |dec eax
004795AF |cmp ecx,eax
004795B1 \jl short mirc.004795A1
004795B3 mov eax,esi
004795B5 lea edx,dword ptr ds:[eax+1]
004795B8 /mov cl,byte ptr ds:[eax]
004795BA |inc eax
004795BB |test cl,cl
004795BD \jnz short mirc.004795B8
004795BF sub eax,edx
004795C1 lea ecx,dword ptr ds:[eax-1]
004795C4 test ecx,ecx
004795C6 jle short mirc.004795E0
004795C8 dec ecx
004795C9 shr ecx,1
004795CB lea eax,dword ptr ds:[esi+1]
004795CE inc ecx
004795CF nop
004795D0 /mov dl,byte ptr ds:[eax-1]
; 每两个字符反序
004795D3 |mov bl,byte ptr ds:[eax]
004795D5 |mov byte ptr ds:[eax-1],bl
004795D8 |mov byte ptr ds:[eax],dl
004795DA |add eax,2
004795DD |dec ecx
004795DE \jnz short mirc.004795D0
004795E0 pop edi
004795E1 pop esi
004795E2 pop ebp
004795E3 pop ebx
004795E4 add esp,18
004795E7 retn
上面函数对用户名进行了转化以后又调用004C7400注册,
这里会生成另外一个注册码.如果在比较失败的话,注册
就失败了.
4. 注册机
代码:
#include <iostream>
#include <windows.h>
using namespace std;
BOOL generator(char *username, DWORD *pRegCode1,
DWORD *pRegCode2)
{
int i, j, len;
DWORD tb[] ={
0x0B, 0x06, 0x11, 0x0C,
0x0C, 0x0E, 0x05, 0x0C,
0x10, 0x0A, 0x0B, 0x06,
0x0E, 0x0E, 0x04, 0x0B,
0x06, 0x0E, 0x0E, 0x04,
0x0B, 0x09, 0x0C, 0x0B,
0x0A, 0x08, 0x0A, 0x0A,
0x10, 0x08, 0x04, 0x06,
0x0A, 0x0C, 0x10, 0x08,
0x0A, 0x04};
len = strlen(username);
j=0;
for(i=3; i < len; i++)
{
*pRegCode1 += (username[i] *
tb[j]);
j++;
if(j > sizeof(tb))
j = 0;
}
j = 0;
for(i=3; i < len; i++)
{
*pRegCode2 += (username[i-1] *
username[i] * tb[j]);
j++;
if(j > sizeof(tb))
j = 0;
}
return TRUE;
}
int main()
{
char username[256];
DWORD RegCode1, RegCode2;
cout << "please user name:";
cin >> username;
if(strlen(username)<4){
cout << "username length need
great 4 ." << endl;
return 1;
}
RegCode1 = 0;
RegCode2 = 0;
generator(username, &RegCode1,
&RegCode2);
cout << RegCode1 << "-" << RegCode2 <<
endl;
return 0;
}