网络电视大师
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、看雪等致以诚挚的感谢!来年再见!