• 标 题:打印机监控王 V3.08注册算法分析及注册机源码  
  • 作 者:lordor
  • 时 间:2003/04/27 09:13am 
  • 链 接:http://bbs.pediy.com

■、作者声明:初学破解,纯属技术交流,无其它目的。
■、工具:ollyDBg1.09,W32Dasm10,脱壳工具。
■、基本知识:基础汇编知识,基本工具使用。
■、注册形式:用户名+公司名+机器码+注册码
■、软件介绍:
打印机监控王 V3.08

软件大小:  673 KB
软件语言:  简体中文
软件类别:  国产软件 / 共享版 / 打印工具
应用平台:  Win9x/NT/2000/XP
界面预览:  无
加入时间:  2003-04-19 16:37:21
下载次数:  557
推荐等级:  

联 系 人:  newhzlan@163.com  
开 发 商:  http://arms.nease.net/prtmon/

软件介绍:
   主要功能:能监控到本机和网络上共享的打印机;监控到的信息包括:打印机名称,打印人,打印电脑,打印时间,打印档案名称,打印档案大小,打印档案页数及打印纸张类型及方向。能将监控到的信息进行管理,列印,查阅,从而达到节约公司资源的目的。运用多线程监控,可对监控到的信息分部门,分用户,分日期进行统计查询及报表。

---------------------------------------------------------------------

一、主要功能
  能监控到本机和网络上共享的打印机;
  监控到的信息包括:打印机名称,打印人,打印电脑,打印时间,打印档案名称,打印档案大小,打印档案页数及打印纸张类型及方向。
  能将监控到的信息进行管理,列印,查阅,从而达到节约公司资源的目的。


■、破解过程:

一、脱壳后,用w32Dasm载入分析出错信息,如下:

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00590414(C)
|

* Possible StringData Ref from Code Obj ->"注册码错误!"
                                 |
:00590488 B8CC055900              mov eax, 005905CC
:0059048D E8821BEDFF              call 00462014


* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005903C7(C)
|
:005903FB 8D55EC                  lea edx, dword ptr [ebp-14]
:005903FE 8B870C030000            mov eax, dword ptr [edi+0000030C]
:00590404 E88397EAFF              call 00439B8C
:00590409 8B55EC                  mov edx, dword ptr [ebp-14]
:0059040C 8B45F8                  mov eax, dword ptr [ebp-08]
:0059040F E8803EE7FF              call 00404294
:00590414 7572                    jne 00590488====>跳转出错

* Possible StringData Ref from Code Obj ->"PrtMonit.ini"
                                 |
:00590416 B964055900              mov ecx, 00590564
:0059041B B201                    mov dl, 01

* Possible StringData Ref from Code Obj ->"?ìG"


二、用ollydbg载入程序,进行注册过程动态分析。


0059039D  |.  E8 623BE7FF   CALL unpacked.00403F04
005903A2  |.  8D55 F4       LEA EDX,DWORD PTR SS:[EBP-C]
005903A5  |.  8B87 04030000 MOV EAX,DWORD PTR DS:[EDI+304]
005903AB  |.  E8 DC97EAFF   CALL unpacked.00439B8C                   ;  取机器码
005903B0  |.  8B45 F4       MOV EAX,DWORD PTR SS:[EBP-C]             ;  机器码入eax
005903B3  |.  8D55 FC       LEA EDX,DWORD PTR SS:[EBP-4]
005903B6  |.  E8 3597E7FF   CALL unpacked.00409AF0                   ;  取机器码
005903BB  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
005903BE  |.  E8 C13DE7FF   CALL unpacked.00404184                   ;  取机器码位数
005903C3  |.  8BF0          MOV ESI,EAX
005903C5  |.  85F6          TEST ESI,ESI
005903C7  |.  7E 32         JLE SHORT unpacked.005903FB
005903C9  |.  BB 01000000   MOV EBX,1
005903CE  |>  8D45 F0       /LEA EAX,DWORD PTR SS:[EBP-10]           ;  密码位入eax
005903D1  |.  8B55 FC       |MOV EDX,DWORD PTR SS:[EBP-4]            ;  机器码入edx
005903D4  |.  0FB6541A FF   |MOVZX EDX,BYTE PTR DS:[EDX+EBX-1]       ;  机器码依次入edx
005903D9  |.  83EA 30       |SUB EDX,30                              ;  edx=edx-30,即转为十进制
005903DC  |.  03D3          |ADD EDX,EBX                             ;  edx=edx+ebx,ebx为计数器
005903DE  |.  B9 E0045900   |MOV ECX,unpacked.005904E0               ;  密码串YELK456DFAO-FDI446ZXDPLMGWT-T4548OYXMLYASDF-LK1387DFDFASPZ-PD132LJD-FDM入ecx
005903E3  |.  8A5411 FF     |MOV DL,BYTE PTR DS:[ECX+EDX-1]          ;  取第(EDX=机器码第N位数*N)密码串十六进制,入dl
005903E7  |.  E8 C03CE7FF   |CALL unpacked.004040AC
005903EC  |.  8B55 F0       |MOV EDX,DWORD PTR SS:[EBP-10]
005903EF  |.  8D45 F8       |LEA EAX,DWORD PTR SS:[EBP-8]
005903F2  |.  E8 953DE7FF   |CALL unpacked.0040418C
005903F7  |.  43            |INC EBX
005903F8  |.  4E            |DEC ESI
005903F9  |.^ 75 D3         \JNZ SHORT unpacked.005903CE             ;  以上生成注册真码
005903FB  |>  8D55 EC       LEA EDX,DWORD PTR SS:[EBP-14]
005903FE  |.  8B87 0C030000 MOV EAX,DWORD PTR DS:[EDI+30C]
00590404  |.  E8 8397EAFF   CALL unpacked.00439B8C
00590409  |.  8B55 EC       MOV EDX,DWORD PTR SS:[EBP-14]            ;  假码入edx
0059040C  |.  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]             ;  注册真码入eax
0059040F  |.  E8 803EE7FF   CALL unpacked.00404294
00590414  |.  75 72         JNZ SHORT unpacked.00590488===========>不等则出错
00590416  |.  B9 64055900   MOV ECX,unpacked.00590564                ;  ASCII "PrtMonit.ini"
0059041B  |.  B2 01         MOV DL,1
0059041D  |.  A1 F4C54700   MOV EAX,DWORD PTR DS:[47C5F4]
00590422  |.  E8 75C2EEFF   CALL unpacked.0047C69C
00590427  |.  8BD8          MOV EBX,EAX
00590429  |.  8D55 E8       LEA EDX,DWORD PTR SS:[EBP-18]
0059042C  |.  8B87 0C030000 MOV EAX,DWORD PTR DS:[EDI+30C]
00590432  |.  E8 5597EAFF   CALL unpacked.00439B8C
00590437  |.  8B45 E8       MOV EAX,DWORD PTR SS:[EBP-18]
0059043A  |.  50            PUSH EAX

总结:据机器码从密码表中取出正确的注册码,即
第N位注册码=第N位机器码的数+N

密码表:
YELK456DFAO-FDI446ZXDPLMGWT-T4548OYXMLYASDF-LK1387DFDFASPZ-PD132LJD-FDM
XCMQI-NDFLDKO-ALCMADOEEILAD-JEISOJKO-KDMCINJFDSWAEW(共:122位)

我的注册信息为:
机器码:04951545366515555705668(共23位)
注册码:Y5-F5OOF-444DZXDPGZGT-5
    

注册码的信息保存在windows目录下,在PrtMonit.ini的文件中。

VC6.0中的源代码(关键部分)

char ccode[24];//机器码
char sn[24];//注册码
int temp;
int i;
char code[]={'Y','E','L','K','4','5','6','D','F','A','O','-','F','D','I','4','4','6','Z','X','D','P','L','M','G','W','T','-','T','4','5','4','8','O','Y','X','M','L','Y','A','S','D','F','-','L','K','1','3','8','7','D','F','D','F','A','S','P','Z','-','P','D','1','3','2','L','J','D','-','F','D','M','X','C','M','QI','-','N','D','F','L','D','K','O','-','A','L','C','M','A','D','O','E','E','I','L','A','D','-','J','E','I','S','O','J','K','O','-','K','D','M','C','I','N','J','F','D','S','W','A','E','W'};


case IDC_BUTTON4:
GetDlgItemText(dhWnd,IDC_EDIT1,ccode,24);
for(i=0;i<24;i++ )
{
 temp=ccode[i]-48;//字符转换为数字
 temp=temp+i;
 sn[i]=scode[temp];
}
SetDlgItemText(dhWnd,IDC_EDIT2,sn);
return 1;