• 标 题:网络电视大师 2004VER2.0.0.1版算法分析(简单)――本年度最后一篇
  • 作 者:mejy
  • 时 间: 2003年12月07日 06:58
  • 链 接:http://bbs.pediy.com

网络电视大师 2004VER2.0.0.1版算法分析(简单)――本年度最后一篇破文
今天想看中韩对战,去网上找网络电视软件,找到这个。主要目的不是分析的软件注册算法,想说我很佩服作者,因为他才用了比以前版本更为简单的算法,它把精力放到程序功能的提高上而不是注册算法。这种做法只得大家尊敬和支持!

《网络电视大师2004》是在原<<网络电视大师Ver5.0>>的基础上进一步升级,对软件的运算规则进行了全面优化,大大提高了网络连接的打开效率!<网络电视大师2004>收集了全国大部分省市电视台和国外的知名电视台和电台.近千个网络连接.该版本新增的功能我就不多介绍了,大家使用后就知道好不好咯! 
声明:只为技术而破解!
(txm123分析过他的低级版本网址http://tongtian.net/pediybbs/viewtopic.php?t=717)
作者:mejy【BCG】【FCG】
破解工具:OD1.09  ,DEDE ,DELPHI6.0简体中文版

利用fi249(:)俺的3.1什么时候不理我了)是delphi编写的,没有加壳。用DEDE反之,然后利用其导出功能,保存为delphi工程,因为个人认为看delphi更直观,当然直接在DEDE中看,也是可以的。
找到这儿:
procedure Tregform.okClick(Sender : TObject);
begin
0049FFE0   55                     push    ebp
。。。。。。。。。。。。
用户名 MEJY[BCG][FCG]
试练码  123456
呵呵 如果时小写的话注册码会出现UNICODE字符。这儿简化一下
下断把!现在好多DELPHI比较大的程序如果采用了变量名混乱技术,断点还是不太好找得。大家看一下《《资料收藏大师》》这个程序,好像断点不太好找。
0049FFE0   . 55             PUSH EBP
0049FFE1   . 8BEC           MOV EBP,ESP
×××××省略几行
004A0007   . E8 2443F6FF    CALL main.00404330
004A000C   . 8D55 F8        LEA EDX,DWORD PTR SS:[EBP-8]
004A000F   . 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004A0012   . 8B80 F0020000  MOV EAX,DWORD PTR DS:[EAX+2F0]
004A0018   . E8 0BE0F9FF    CALL main.0043E028
004A001D   . 837D F8 00     CMP DWORD PTR SS:[EBP-8],0  读入用户名
004A0021   . 0F84 E7000000  JE main.004A010E
004A0027   . 8D55 F4        LEA EDX,DWORD PTR SS:[EBP-C]
004A002A   . 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004A002D   . 8B80 F4020000  MOV EAX,DWORD PTR DS:[EAX+2F4]
004A0033   . E8 F0DFF9FF    CALL main.0043E028
004A0038   . 8D55 F0        LEA EDX,DWORD PTR SS:[EBP-10]
004A003B   . 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
004A003E   . E8 C9FEFFFF    CALL main.0049FF0C   
只觉告诉,这是注册码算法的关键,跟进
004A0043   . 8B55 F4        MOV EDX,DWORD PTR SS:[EBP-C]   将输入的假码入栈
004A0046   . 8B45 F0    MOV EAX,DWORD PTR SS:[EBP-10] 将用户名的变换结果入栈
004A0049   . E8 8285F6FF    CALL main.004085D0  关键比较call跟进
004A004E   . 85C0           TEST EAX,EAX
004A0050     74 2F          JE SHORT main.004A0081  关键跳转
上面的call
0049FF0C  /$ 55             PUSH EBP
0049FF0D  |. 8BEC           MOV EBP,ESP
0049FF0F  |. 83C4 F0        ADD ESP,-10       处理堆栈
0049FF12  |. 53             PUSH EBX
0049FF13  |. 56             PUSH ESI
0049FF14  |. 57             PUSH EDI
0049FF15  |. 33C9           XOR ECX,ECX
0049FF17  |. 894D F0        MOV DWORD PTR SS:[EBP-10],ECX
0049FF1A  |. 894D F4        MOV DWORD PTR SS:[EBP-C],ECX
0049FF1D  |. 8955 F8        MOV DWORD PTR SS:[EBP-8],EDX
0049FF20  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX EAX中保存的是用户名
0049FF23  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0049FF26  |. E8 A548F6FF    CALL main.004047D0 
0049FF2B  |. 33C0           XOR EAX,EAX  
0049FF2D  |. 55             PUSH EBP
0049FF2E  |. 68 CFFF4900    PUSH main.0049FFCF
0049FF33  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
0049FF36  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
0049FF39  |. 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
0049FF3C  |. E8 EF43F6FF    CALL main.00404330
0049FF41  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0049FF44  |. E8 9F46F6FF    CALL main.004045E8   该call的作用是求得用户名的长度。
0049FF49  |. 8BF0           MOV ESI,EAX       用户名长度――》esi
0049FF4B  |. 85F6           TEST ESI,ESI        用户名是否为空
0049FF4D  |. 7E 52          JLE SHORT main.0049FFA1
下面开始根据用户名计算注册码
0049FF4F  |. BB 01000000    MOV EBX,1      这是个初始值 i=1  以后每循环一次i++;
0049FF54  |> 8D43 1E        /LEA EAX,DWORD PTR DS:[EBX+1E]  j = i+1e
0049FF57  |. 50             |PUSH EAX         EAX= i+1e;
0049FF58  |. 8BC3           |MOV EAX,EBX  将EBX的值入栈 作为下面运算的被除数
0049FF5A  |. 5A             |POP EDX     EDX中可见到是上面EAX中的值
0049FF5B  |. 8BCA     |MOV ECX,EDX     
0049FF5D  |. 99             |CDQ
0049FF5E  |. F7F9           |IDIV ECX  EAX=EAX/ECX=1/1F=0,余数1放在EDX中
********************************汇编知识**********************************
IDIV    整数除法. ,结果回送: 
          商回送AL,余数回送AH, (字节运算); 或  商回送AX,余数回送DX, (字运算).
0049FF60  |. 8BFA           |MOV EDI,EDX  余数送到EDI中
0049FF62  |. 8BC3           |MOV EAX,EBX   
0049FF64  |. 33C3           |XOR EAX,EBX
0049FF66  |. 33C3           |XOR EAX,EBX 这儿进行两个异或运算,他又不是回来了吗
0049FF68  |. 33F8           |XOR EDI,EAX    清零
0049FF6A  |. 8D43 14        |LEA EAX,DWORD PTR DS:[EBX+14]  j=i+14
0049FF6D  |. 50             |PUSH EAX    入栈
0049FF6E  |. 8BC3           |MOV EAX,EBX   将j作为下一个整除运算的被除数
0049FF70  |. 5A             |POP EDX   
0049FF71  |. 8BCA           |MOV ECX,EDX  ecx=j;
0049FF73  |. 99             |CDQ
0049FF74  |. F7F9           |IDIV ECX
0049FF76  |. 33D3           |XOR EDX,EBX
0049FF78  |. 03FA           |ADD EDI,EDX 将上一个计算的余数和这一次的余数相加
0049FF7A  |. 03FB           |ADD EDI,EBX  将两次余数相加的结果在与i相加
0049FF7C  |. 83F7 03        |XOR EDI,3     结果与3异或
0049FF7F  |. 47             |INC EDI   将上面的结果加1
0049FF80  |. 8D45 F0        |LEA EAX,DWORD PTR SS:[EBP-10]
0049FF83  |. 8B55 FC        |MOV EDX,DWORD PTR SS:[EBP-4]
0049FF86  |. 0FB6541A FF    |MOVZX EDX,BYTE PTR DS:[EDX+EBX-1] 
取用户名的每位的字符  EDX=M,E,J。。。。。
0049FF8B  |. 03D7           |ADD EDX,EDI  将上面的计算结果和用户名各位上的字符相加
0049FF8D  |. E8 7E45F6FF    |CALL main.00404510
0049FF92  |. 8B55 F0        |MOV EDX,DWORD PTR SS:[EBP-10]
0049FF95  |. 8D45 F4        |LEA EAX,DWORD PTR SS:[EBP-C]
0049FF98  |. E8 5346F6FF    |CALL main.004045F0   转化成字符
0049FF9D  |. 43             |INC EBX
0049FF9E  |. 4E             |DEC ESI
0049FF9F  |.^75 B3          JNZ SHORT main.0049FF54   如果用户名没有处理完成则继续
0049FFA1  |> 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
0049FFA4  |. 8B55 F4        MOV EDX,DWORD PTR SS:[EBP-C]
0049FFA7  |. E8 D843F6FF    CALL main.00404384
0049FFAC  |. 33C0           XOR EAX,EAX
0049FFAE  |. 5A             POP EDX
0049FFAF  |. 59             POP ECX
0049FFB0  |. 59             POP ECX
0049FFB1  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
0049FFB4  |. 68 D6FF4900    PUSH main.0049FFD6
0049FFB9  |> 8D45 F0        LEA EAX,DWORD PTR SS:[EBP-10]
0049FFBC  |. BA 02000000    MOV EDX,2
0049FFC1  |. E8 8E43F6FF    CALL main.00404354
0049FFC6  |. 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]
0049FFC9  |. E8 6243F6FF    CALL main.00404330
0049FFCE  . C3             RETN

004085D0  /$ 56             PUSH ESI
004085D1  |. 57             PUSH EDI
004085D2  |. 53             PUSH EBX
004085D3  |. 89C6           MOV ESI,EAX   变换后得用户名
004085D5  |. 89D7           MOV EDI,EDX     输入的注册码
004085D7  |. 09C0           OR EAX,EAX
004085D9  |. 74 03          JE SHORT main.004085DE
004085DB  |. 8B40 FC        MOV EAX,DWORD PTR DS:[EAX-4] 用户名长度
004085DE  |> 09D2           OR EDX,EDX
004085E0  |. 74 03          JE SHORT main.004085E5
004085E2  |. 8B52 FC        MOV EDX,DWORD PTR DS:[EDX-4]  加码的长度
004085E5  |> 89C1           MOV ECX,EAX
004085E7  |. 39D1           CMP ECX,EDX  比较输入的注册码和用户名变换后的长度
004085E9  |. 76 02          JBE SHORT main.004085ED
004085EB  |. 89D1           MOV ECX,EDX
004085ED  |> 39C9           CMP ECX,ECX
以下比较的关键:
004085EF  |> F3:A6          /REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS>
循环比较直到遇到一个不想等的字符,如果你输入的注册码和根据用户名计算后的串相同,则直接跳到0040861D处
****************汇编知识**************************8
REPE/REPZ      当ZF=1或比较结果相等,且CX/ECX<>0时重复.
004085F1  |. 74 2A          |JE SHORT main.0040861D 
004085F3  |. 8A5E FF        |MOV BL,BYTE PTR DS:[ESI-1] 
这里处理的是变化后得用户名
004085F6  |. 80FB 61        |CMP BL,61   和字符a比较
004085F9  |. 72 08          |JB SHORT main.00408603    JB 比较无符号数 当小于时跳
004085FB  |. 80FB 7A        |CMP BL,7A           和字符z比较
004085FE  |. 77 03          |JA SHORT main.00408603  JA比较无符号数 当大于时跳
00408600  |. 80EB 20        |SUB BL,20    如果是小写字母,将他转化为大写字母
00408603  |> 8A7F FF        |MOV BH,BYTE PTR DS:[EDI-1]  处理你输入的字符如果是小写的同样将他转化为大写。
00408606  |. 80FF 61        |CMP BH,61
00408609  |. 72 08          |JB SHORT main.00408613
0040860B  |. 80FF 7A        |CMP BH,7A
0040860E  |. 77 03          |JA SHORT main.00408613
00408610  |. 80EF 20        |SUB BH,20
00408613  |> 38FB           |CMP BL,BH 
比较输入的注册码和根据用户名比较的注册码相等继续下次循环,不等的话注册失败。
00408615  |.^74 D8          JE SHORT main.004085EF
00408617  |. 0FB6C3         MOVZX EAX,BL
0040861A  |. 0FB6D7         MOVZX EDX,BH 
0040861D  |> 29D0           SUB EAX,EDX  如果这儿eax=edx 则可注册成功
0040861F  |. 5B             POP EBX
00408620  |. 5F             POP EDI
00408621  |. 5E             POP ESI
00408622  . C3             RETN
这个注册算法很直观和以前版本的区别在于以前版本生成一个序列号,根据序列号计算,这个版本没用序列号,直接用了用户名。
总结一下:
本算法主要要到的汇编知识:
DIV    无符号除法. 
IDIV    整数除法. 
          以上两条,结果回送: 
              商回送AL,余数回送AH, (字节运算); 
          或  商回送AX,余数回送DX, (字运算).
CDQ    双字扩展.    (把EAX中的字的符号扩展到EDX中去)
XOR    异或运算.
REPE/REPZ      当ZF=1或比较结果相等,且CX/ECX<>0时重复. 
        REPNE/REPNZ    当ZF=0或比较结果不相等,且CX/ECX<>0时重复.
JAE/JNB(比较无符号数)  73  C=0  >=  高于或等于/不低于
JB/JNAE(比较无符号数)  72  C=1  <  低于/不高于或等于
JBE/JNA(比较无符号数)  76  C或Z=1  <=  低于或等于/不高于

至此,本文写作告一段落。一组可用MEJY[BCG][FCG]   PGKabHHSheOSVk
这也许是本年度的最后一篇破文,再次向所有关心我们菜鸟成长的牛人 例如FLY 、LORDER、YESKY1、看雪等致以诚挚的感谢!来年再见!