/////////////////////////////////
// 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
;====>关键跳转,跳转注册失败
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
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
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 串中查找字符 "-", 如果没
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
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 ;输入
的注册码的第一部分和计算出的值不等,跳转,注册失败
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课