【破文作者】   rdsnow[BCG][PYG]

【 E-mail 】   rdsnow@163.com

【 作者QQ 】   83757177

【文章题目】   小易网络快递 V1.1的注册

【软件名称】   小易网络快递 V1.1

【下载地址】   http://nj.onlinedown.net/soft/40175.htm

----------------------------------------------------------------------------------------------
【加密方式】   序列号

【破解工具】   FlyOD V1.10

【软件限制】   功能限制

【破解平台】   Microsoft Windows XP SP2

----------------------------------------------------------------------------------------------
【软件简介】

你是否觉得在局域网中拷贝文件很繁琐?你是否觉得windows的网络邻居不好用?你是否为看不到局域网中的其他机器而烦恼?小易网络快递将

为你解决这些问题。通过小易网络快递,你可以:只需选中文件—〉右键弹出菜单“发送到”其他机器即可;不需打开网络邻居,就可以快速

地查看任何一台网络中的计算机。总而言之,小易网络快递是你快速使用局域网资源,在局域网中快速传递文件的好帮手。
   
主要功能   
1、可自动搜索局域网上的可写共享文件夹,并附加在系统右键的“发送到”菜单中。
2、解决在网络邻居中计算机能看见却无法访问或者计算机可以搜索到并且可以访问但是却在网络邻居中看不见等问题。
3、解决网络邻居打开很慢,甚至超时的问题。 

【文章简介】

程序Borland Delphi Heuristic Mode编写,无壳,采用了f(注册码)=MD5(机器码)的非明码验证方式,但是很容易让人找到爆破点。

----------------------------------------------------------------------------------------------
【破解过程】

偶的机器码是"CPU15850025426431",于是输入试探注册码"987654321abcde987654321",根据错误对话框来到这儿:

00480B09   .  8D55 F0         LEA EDX,DWORD PTR SS:[EBP-10]
00480B0C   .  8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
00480B0F   .  E8 24FCFFFF     CALL NetExpre.00480738           ;  读取机器码,偶电脑上得到字符串"CPU15850025426431"
00480B14   .  8B45 F0         MOV EAX,DWORD PTR SS:[EBP-10]
00480B17   .  8D55 F4         LEA EDX,DWORD PTR SS:[EBP-C]
00480B1A   .  E8 BD78F8FF     CALL NetExpre.004083DC
00480B1F   .  8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
00480B22   .  50              PUSH EAX
00480B23   .  8D55 E8         LEA EDX,DWORD PTR SS:[EBP-18]
00480B26   .  8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
00480B29   .  8B80 00030000   MOV EAX,DWORD PTR DS:[EAX+300]
00480B2F   .  E8 4420FCFF     CALL NetExpre.00442B78           ;  读取注册码
00480B34   .  8B45 E8         MOV EAX,DWORD PTR SS:[EBP-18]
00480B37   .  8D55 EC         LEA EDX,DWORD PTR SS:[EBP-14]
00480B3A   .  E8 9D78F8FF     CALL NetExpre.004083DC
00480B3F   .  8B55 EC         MOV EDX,DWORD PTR SS:[EBP-14]
00480B42   .  8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
00480B45   .  59              POP ECX
00480B46   .  E8 45FBFFFF     CALL NetExpre.00480690           ;  校验注册码
00480B4B   .  84C0            TEST AL,AL
00480B4D   .  0F84 DA000000   JE NetExpre.00480C2D             ;  校验成功就跳出注册成功的对话框
00480B53   .  B8 940C4800     MOV EAX,NetExpre.00480C94
00480B58   .  E8 37DCFAFF     CALL NetExpre.0042E794           ;  注册成功的对话框
……………………
00480C2B   .  EB 0A           JMP SHORT NetExpre.00480C37
00480C2D   >  B8 100D4800     MOV EAX,NetExpre.00480D10
00480C32   .  E8 5DDBFAFF     CALL NetExpre.0042E794           ;  对话框:注册码错误,请重试!

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

跟进00480B46     CALL NetExpre.00480690           ;  校验注册码

来到:
……………………
004806C2  |.  64:8920         MOV DWORD PTR FS:[EAX],ESP
004806C5  |.  8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
004806C8  |.  E8 873CF8FF     CALL NetExpre.00404354           ;  计算注册码的长度
004806CD  |.  83F8 04         CMP EAX,4
004806D0  |.  7D 04           JGE SHORT NetExpre.004806D6      ;  注册码的长度不小于4,就跳下去继续校验
004806D2  |.  33DB            XOR EBX,EBX
004806D4  |.  EB 36           JMP SHORT NetExpre.0048070C      ;  注册码的长度小于4,就跳向死亡
004806D6  |>  8D55 E0         LEA EDX,DWORD PTR SS:[EBP-20]
004806D9  |.  8B45 F8         MOV EAX,DWORD PTR SS:[EBP-8]
004806DC  |.  E8 DBFBFFFF     CALL NetExpre.004802BC
004806E1  |.  8D45 E0         LEA EAX,DWORD PTR SS:[EBP-20]
004806E4  |.  8D55 F0         LEA EDX,DWORD PTR SS:[EBP-10]
004806E7  |.  E8 44FCFFFF     CALL NetExpre.00480330           ;  MD5(机器码)
004806EC  |.  8D4D F4         LEA ECX,DWORD PTR SS:[EBP-C]
004806EF  |.  8B55 FC         MOV EDX,DWORD PTR SS:[EBP-4]
004806F2  |.  8BC3            MOV EAX,EBX
004806F4  |.  E8 1B030000     CALL NetExpre.00480A14           ;  f(注册码) (跟进)
004806F9  |.  8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
004806FC  |.  8B55 F0         MOV EDX,DWORD PTR SS:[EBP-10]
004806FF  |.  E8 9C3DF8FF     CALL NetExpre.004044A0           ;  比较f(注册码)和MD5(机器码)
00480704  |.  75 04           JNZ SHORT NetExpre.0048070A      ;  相等就注册成功,否则跳向死亡(爆破点)
00480706  |.  B3 01           MOV BL,1
00480708  |.  EB 02           JMP SHORT NetExpre.0048070C
0048070A  |>  33DB            XOR EBX,EBX
0048070C  |>  33C0            XOR EAX,EAX

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

跟进004806F4     CALL NetExpre.00480A14            ;  f(注册码)

来到:
……………………
00480A4A  |.  8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
00480A4D  |.  B9 06000000     MOV ECX,6
00480A52  |.  33D2            XOR EDX,EDX
00480A54  |.  E8 5B3BF8FF     CALL NetExpre.004045B4           ;  取得机器码的前面五个字符,偶得到"CPU158"
00480A59  |.  8B55 F8         MOV EDX,DWORD PTR SS:[EBP-8]
00480A5C  |.  8BCE            MOV ECX,ESI
00480A5E  |.  8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
00480A61  |.  E8 02E8FFFF     CALL NetExpre.0047F268           ;  用取得的字符串"CPU158"参与注册码的变换 (跟进)

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

跟进00480A61     CALL NetExpre.0047F268           ;  用取得的字符串"CPU158"参与注册码的变换

来到:
……………………
0047F2C7  |.  8B45 D8         MOV EAX,DWORD PTR SS:[EBP-28]
0047F2CA  |.  E8 8550F8FF     CALL NetExpre.00404354           ;  计算"CPU158"的长度,得到6
0047F2CF  |.  8945 F0         MOV DWORD PTR SS:[EBP-10],EAX
0047F2D2  |.  837D F0 00      CMP DWORD PTR SS:[EBP-10],0
0047F2D6  |.  75 08           JNZ SHORT NetExpre.0047F2E0      ;  如果长度为0,就用下面的字符串"topsoft"代替,应该是用不到的了
0047F2D8  |.  B8 08F44700     MOV EAX,NetExpre.0047F408        ;  ASCII "topsoft"
0047F2DD  |.  8945 DC         MOV DWORD PTR SS:[EBP-24],EAX
0047F2E0  |>  33F6            XOR ESI,ESI
0047F2E2  |.  8D45 D0         LEA EAX,DWORD PTR SS:[EBP-30]
0047F2E5  |.  50              PUSH EAX
0047F2E6  |.  8D45 CC         LEA EAX,DWORD PTR SS:[EBP-34]
0047F2E9  |.  8B55 E0         MOV EDX,DWORD PTR SS:[EBP-20]
0047F2EC  |.  E8 9B4FF8FF     CALL NetExpre.0040428C
0047F2F1  |.  8B45 CC         MOV EAX,DWORD PTR SS:[EBP-34]
0047F2F4  |.  B9 02000000     MOV ECX,2
0047F2F9  |.  BA 01000000     MOV EDX,1
0047F2FE  |.  E8 B152F8FF     CALL NetExpre.004045B4           ;  取出注册码的前面两个字符
0047F303  |.  8B4D D0         MOV ECX,DWORD PTR SS:[EBP-30]
0047F306  |.  8D45 D4         LEA EAX,DWORD PTR SS:[EBP-2C]
0047F309  |.  BA 18F44700     MOV EDX,NetExpre.0047F418
0047F30E  |.  E8 8D50F8FF     CALL NetExpre.004043A0
0047F313  |.  8B45 D4         MOV EAX,DWORD PTR SS:[EBP-2C]
0047F316  |.  E8 6594F8FF     CALL NetExpre.00408780           ;  字符串"98"转化为整数型,作为A
0047F31B  |.  8BF8            MOV EDI,EAX
0047F31D  |.  C745 E8 0300000>MOV DWORD PTR SS:[EBP-18],3      ;  设[EBP-18]=i,i赋初始值3,准备循环
0047F324  |>  8D45 C4         /LEA EAX,DWORD PTR SS:[EBP-3C]
0047F327  |.  50              |PUSH EAX
0047F328  |.  8D45 C0         |LEA EAX,DWORD PTR SS:[EBP-40]
0047F32B  |.  8B55 E0         |MOV EDX,DWORD PTR SS:[EBP-20]
0047F32E  |.  E8 594FF8FF     |CALL NetExpre.0040428C
0047F333  |.  8B45 C0         |MOV EAX,DWORD PTR SS:[EBP-40]
0047F336  |.  B9 02000000     |MOV ECX,2
0047F33B  |.  8B55 E8         |MOV EDX,DWORD PTR SS:[EBP-18]
0047F33E  |.  E8 7152F8FF     |CALL NetExpre.004045B4          ;  取第i个字符和第i+1个字符组成字符串
0047F343  |.  8B4D C4         |MOV ECX,DWORD PTR SS:[EBP-3C]
0047F346  |.  8D45 C8         |LEA EAX,DWORD PTR SS:[EBP-38]
0047F349  |.  BA 18F44700     |MOV EDX,NetExpre.0047F418
0047F34E  |.  E8 4D50F8FF     |CALL NetExpre.004043A0
0047F353  |.  8B45 C8         |MOV EAX,DWORD PTR SS:[EBP-38]
0047F356  |.  E8 2594F8FF     |CALL NetExpre.00408780          ;  得到的字符串转化为整数,作为B
0047F35B  |.  8945 E4         |MOV DWORD PTR SS:[EBP-1C],EAX
0047F35E  |.  3B75 F0         |CMP ESI,DWORD PTR SS:[EBP-10]
0047F361  |.  7D 03           |JGE SHORT NetExpre.0047F366
0047F363  |.  46              |INC ESI
0047F364  |.  EB 05           |JMP SHORT NetExpre.0047F36B
0047F366  |>  BE 01000000     |MOV ESI,1                       ;  设ESI=j,j从1到6循环取值
0047F36B  |>  8B45 DC         |MOV EAX,DWORD PTR SS:[EBP-24]
0047F36E  |.  33DB            |XOR EBX,EBX
0047F370  |.  8A1C30          |MOV BL,BYTE PTR DS:[EAX+ESI]    ;  取得"CPU158"中的第j+1的字符的ASC码,作为C,j=6时取0
0047F373  |.  335D E4         |XOR EBX,DWORD PTR SS:[EBP-1C]   ;  B跟C异或
0047F376  |.  3BFB            |CMP EDI,EBX
0047F378  |.  7C 0A           |JL SHORT NetExpre.0047F384
0047F37A  |.  81C3 FF000000   |ADD EBX,0FF
0047F380  |.  2BDF            |SUB EBX,EDI                     ;  (B^C)-A,如果(B^C)<A,运算式改为(B^C)+0xFF-A
0047F382  |.  EB 02           |JMP SHORT NetExpre.0047F386
0047F384  |>  2BDF            |SUB EBX,EDI
0047F386  |>  8D45 BC         |LEA EAX,DWORD PTR SS:[EBP-44]
0047F389  |.  8BD3            |MOV EDX,EBX
0047F38B  |.  E8 EC4EF8FF     |CALL NetExpre.0040427C
0047F390  |.  8B55 BC         |MOV EDX,DWORD PTR SS:[EBP-44]
0047F393  |.  8D45 EC         |LEA EAX,DWORD PTR SS:[EBP-14]
0047F396  |.  E8 C14FF8FF     |CALL NetExpre.0040435C
0047F39B  |.  8B7D E4         |MOV EDI,DWORD PTR SS:[EBP-1C]   ;  赋值A=B,参与下一轮循环
0047F39E  |.  8345 E8 02      |ADD DWORD PTR SS:[EBP-18],2     ;  i=i+2,继续参与下一轮的循环
0047F3A2  |.  8D45 B8         |LEA EAX,DWORD PTR SS:[EBP-48]
0047F3A5  |.  8B55 E0         |MOV EDX,DWORD PTR SS:[EBP-20]
0047F3A8  |.  E8 DF4EF8FF     |CALL NetExpre.0040428C
0047F3AD  |.  8B45 B8         |MOV EAX,DWORD PTR SS:[EBP-48]
0047F3B0  |.  E8 9F4FF8FF     |CALL NetExpre.00404354          ;  计算注册码的长度
0047F3B5  |.  3B45 E8         |CMP EAX,DWORD PTR SS:[EBP-18]
0047F3B8  |.^ 0F8F 66FFFFFF   \JG NetExpre.0047F324            ;  i<注册码的长度,就跳上去继续循环

----------------------------------------------------------------------------------------------
【破解心得】

f(注册码)是这样的:

因为偶输入的试探注册码是:"987654321abcde987654321",机器码的前六个字符是"CPU158"

拆分成0x98 0x76 0x54 0x32 0x1a 0xbc 0xde 0x98 0x76 0x54 0x32 0x1参与运算

( 0x76^ASC(P) )+0xFF-0x98=0x8D   \
( 0x54^ASC(U) )+0xFF-0x76=0x8A   |
( 0x32^ASC(1) )+0xFF-0x54=0xAE   |
( 0x1a^ASC(5) )+0xFF-0x32=0xFC   | 至于加不加0xFF
( 0xbc^ASC(8) )     -0x1a=0x6A    >看异或结果够不够减
( 0xde^  0    )     -0xbc=0x22   | 详见程序0047F380处
( 0x98^ASC(P) )+0xFF-0xde=0xE9   |
( 0x76^ASC(U) )+0xFF-0x98=0x8A   |
( 0x54^ASC(1) )+0xFF-0x76=0xEE   |
( 0x32^ASC(5) )+0xFF-0x54=0xB2   /

f(注册码)=char(8D)+char(
8A)+char(AE)+char(FC)+char(6A)+char(22)+char(E9)+char(8A)+char(EE)+char(B2)

而MD5(机器码)="6912effda693651b763bbb14c8e5cadb"

f(注册码)不等于MD5(机器码),所以校验不通过。

逆向算法:

注册码有33个十六进制文本连接而成,每个十六进制文本有两个字符,组成的注册码总共66个字符:

定义字符数组MD5[32],内放机器码的MD5运算结果产生的32个字符

定义字符数组Temp[8],内放机器码的前六个字符组成的字符串,Temp[6]=0

第0个 = 任意
第1个 = ASC(MD5[0]) + 第0个 (结果如果>0xFF,就减去0xFF ) 然后再 ^ Temp[1]
第2个 = ASC(MD5[1]) + 第1个 (结果如果>0xFF,就减去0xFF ) 然后再 ^ Temp[2]
第3个 = ASC(MD5[2]) + 第2个 (结果如果>0xFF,就减去0xFF ) 然后再 ^ Temp[3]
第4个 = ASC(MD5[3]) + 第3个 (结果如果>0xFF,就减去0xFF ) 然后再 ^ Temp[4]
第5个 = ASC(MD5[4]) + 第4个 (结果如果>0xFF,就减去0xFF ) 然后再 ^ Temp[5]
第6个 = ASC(MD5[5]) + 第5个 (结果如果>0xFF,就减去0xFF ) 然后再 ^ Temp[6]
第7个 = ASC(MD5[6]) + 第6个 (结果如果>0xFF,就减去0xFF ) 然后再 ^ Temp[1]
第8个 = ASC(MD5[7]) + 第7个 (结果如果>0xFF,就减去0xFF ) 然后再 ^ Temp[2]
第9个 = ASC(MD5[8]) + 第8个 (结果如果>0xFF,就减去0xFF ) 然后再 ^ Temp[3]

……………………

第32个= ASC(MD5[31])+第31个 (结果如果>0xFF,就减去0xFF ) 然后再 ^ Temp[2]

连接第0~32个十六进制文本,得到长度为66的字符串就是注册码了。

----------------------------------------------------------------------------------------------
【破解声明】   我是一只小菜鸟,偶得一点心得,愿与大家分享:)

【版权声明】   本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢! 
----------------------------------------------------------------------------------------------
                                                                     文章写于2005-6-9 13:25:25