【破文标题】超级电视 4.4注册算法分析
【破文作者】XXNB
【作者邮箱】
【作者主页】
【破解工具】OD
【破解平台】xpsp2
【软件名称】超级电视 4.4
【软件大小】1013KB

【原版下载】http://www.onlinedown.net/soft/44942.htm
【保护方式】
【软件简介】超级电视可接收各地精彩电视节目和广播电台,软件界面简洁,人性化的的程序设计,使您操作更简便。所有节目免费试看,给您透明的选择! 不包含任何广告和插件。  
【破解声明】向大侠们学习!!!
------------------------------------------------------------------------
【破解过程】
------------------------------------------------------------------------

1、OD载入后,按Ctrl+N,在__vbaStrCmp这个函数下断“在每个参考上设置断点”,F9运行。

其间会有这样一句猛的运行。我们就把这下面句的断点取消掉。

0044F05F   .  FF15 7C124600 call    [<&MSVBVM50.__vbaStrCmp>]        ;  MSVBVM50.__vbaStrCmp

在程序正确运行后,点“帮助”-“注册”,随便输入用户名和注册码,按“立即注册”中断在下面这句。

0045D2E3   .  FF15 7C124600 call    [<&MSVBVM50.__vbaStrCmp>]        ;  MSVBVM50.__vbaStrCmp堆栈处可以看到用户名
0045D2E9   .  F7D8          neg     eax
0045D2EB   .  1BC0          sbb     eax, eax
0045D2ED   .  8D4D E0       lea     ecx, [ebp-20]
0045D2F0   .  F7D8          neg     eax
0045D2F2   .  F7D8          neg     eax
0045D2F4   .  8985 34FFFFFF mov     [ebp-CC], eax
0045D2FA   .  FF15 5C134600 call    [<&MSVBVM50.__vbaFreeStr>]       ;  MSVBVM50.__vbaFreeStr
0045D300   .  8D4D C8       lea     ecx, [ebp-38]
0045D303   .  FF15 58134600 call    [<&MSVBVM50.__vbaFreeObj>]       ;  MSVBVM50.__vbaFreeObj
0045D309   .  66:39BD 34FFF>cmp     [ebp-CC], di
0045D310   .  0F84 500A0000 je      0045DD66
0045D316   .  53            push    ebx
0045D317   .  FF95 0CFFFFFF call    [ebp-F4]
0045D31D   .  8D4D C8       lea     ecx, [ebp-38]
0045D320   .  50            push    eax
0045D321   .  51            push    ecx
0045D322   .  FF15 30124600 call    [<&MSVBVM50.__vbaObjSet>]        ;  MSVBVM50.__vbaObjSet
0045D328   .  8B10          mov     edx, [eax]
0045D32A   .  8D4D E0       lea     ecx, [ebp-20]
0045D32D   .  51            push    ecx
0045D32E   .  50            push    eax
0045D32F   .  8985 3CFFFFFF mov     [ebp-C4], eax
0045D335   .  FF92 A0000000 call    [edx+A0]
0045D33B   .  3BC7          cmp     eax, edi
0045D33D   .  7D 18         jge     short 0045D357
0045D33F   .  8B95 3CFFFFFF mov     edx, [ebp-C4]
0045D345   .  68 A0000000   push    0A0
0045D34A   .  68 C08A4000   push    00408AC0
0045D34F   .  52            push    edx
0045D350   .  50            push    eax
0045D351   .  FF15 08124600 call    [<&MSVBVM50.__vbaHresultCheckObj>;  MSVBVM50.__vbaHresultCheckObj
0045D357   >  8B45 E0       mov     eax, [ebp-20]                    ;  用户名
0045D35A   .  50            push    eax
0045D35B   .  FF15 E0114600 call    [<&MSVBVM50.__vbaLenBstr>]       ;  MSVBVM50.__vbaLenBstr
0045D361   .  8D4D E0       lea     ecx, [ebp-20]                    ;  这里得到用户名位数
0045D364   .  8985 20FFFFFF mov     [ebp-E0], eax
0045D36A   .  BE 01000000   mov     esi, 1
0045D36F   .  FF15 5C134600 call    [<&MSVBVM50.__vbaFreeStr>]       ;  MSVBVM50.__vbaFreeStr
0045D375   .  8D4D C8       lea     ecx, [ebp-38]
0045D378   .  FF15 58134600 call    [<&MSVBVM50.__vbaFreeObj>]       ;  MSVBVM50.__vbaFreeObj
0045D37E   >  3BB5 20FFFFFF cmp     esi, [ebp-E0]
0045D384   .  0F8F A6000000 jg      0045D430
0045D38A   .  53            push    ebx
0045D38B   .  FF95 0CFFFFFF call    [ebp-F4]
0045D391   .  8D4D C8       lea     ecx, [ebp-38]
0045D394   .  50            push    eax
0045D395   .  51            push    ecx
0045D396   .  FF15 30124600 call    [<&MSVBVM50.__vbaObjSet>]        ;  MSVBVM50.__vbaObjSet
0045D39C   .  8B45 C8       mov     eax, [ebp-38]
0045D39F   .  8D55 A4       lea     edx, [ebp-5C]
0045D3A2   .  8945 BC       mov     [ebp-44], eax
0045D3A5   .  52            push    edx
0045D3A6   .  8D45 B4       lea     eax, [ebp-4C]
0045D3A9   .  56            push    esi
0045D3AA   .  8D4D 94       lea     ecx, [ebp-6C]
0045D3AD   .  50            push    eax
0045D3AE   .  51            push    ecx
0045D3AF   .  C745 AC 01000>mov     dword ptr [ebp-54], 1
0045D3B6   .  C745 A4 02000>mov     dword ptr [ebp-5C], 2
0045D3BD   .  C745 C8 00000>mov     dword ptr [ebp-38], 0
0045D3C4   .  C745 B4 09000>mov     dword ptr [ebp-4C], 9
0045D3CB   .  FF15 68124600 call    [<&MSVBVM50.#632>]               ;  MSVBVM50.rtcMidCharVar
0045D3D1   .  8D55 94       lea     edx, [ebp-6C]
0045D3D4   .  8D45 E0       lea     eax, [ebp-20]
0045D3D7   .  52            push    edx
0045D3D8   .  50            push    eax
0045D3D9   .  FF15 CC124600 call    [<&MSVBVM50.__vbaStrVarVal>]     ;  MSVBVM50.__vbaStrVarVal
0045D3DF   .  50            push    eax
0045D3E0   .  FF15 F8114600 call    [<&MSVBVM50.#516>]               ;  MSVBVM50.rtcAnsiValueBstr
0045D3E6   .  0FBFC8        movsx   ecx, ax                          ;  逐位取用户名 的字母的ASCII码。其实是用来求和。
0045D3E9   .  03CF          add     ecx, edi
0045D3EB   .  0F80 850A0000 jo      0045DE76
0045D3F1   .  8BF9          mov     edi, ecx
0045D3F3   .  8D4D E0       lea     ecx, [ebp-20]
0045D3F6   .  FF15 5C134600 call    [<&MSVBVM50.__vbaFreeStr>]       ;  MSVBVM50.__vbaFreeStr
0045D3FC   .  8D4D C8       lea     ecx, [ebp-38]
0045D3FF   .  FF15 58134600 call    [<&MSVBVM50.__vbaFreeObj>]       ;  MSVBVM50.__vbaFreeObj
0045D405   .  8D55 94       lea     edx, [ebp-6C]
0045D408   .  8D45 A4       lea     eax, [ebp-5C]
0045D40B   .  52            push    edx
0045D40C   .  8D4D B4       lea     ecx, [ebp-4C]
0045D40F   .  50            push    eax
0045D410   .  51            push    ecx
0045D411   .  6A 03         push    3
0045D413   .  FF15 EC114600 call    [<&MSVBVM50.__vbaFreeVarList>]   ;  MSVBVM50.__vbaFreeVarList
0045D419   .  B8 01000000   mov     eax, 1
0045D41E   .  83C4 10       add     esp, 10
0045D421   .  03C6          add     eax, esi
0045D423   .  0F80 4D0A0000 jo      0045DE76
0045D429   .  8BF0          mov     esi, eax
0045D42B   .^ E9 4EFFFFFF   jmp     0045D37E
0045D430   >  A1 10F04500   mov     eax, [45F010]
0045D435   .  85C0          test    eax, eax
0045D437   .  75 19         jnz     short 0045D452
0045D439   .  8B1D E0124600 mov     ebx, [<&MSVBVM50.__vbaNew2>]     ;  MSVBVM50.__vbaNew2
0045D43F   .  68 10F04500   push    0045F010
0045D444   .  68 28634000   push    00406328
0045D449   .  FFD3          call    ebx                              ;  <&MSVBVM50.__vbaNew2>
0045D44B   .  A1 10F04500   mov     eax, [45F010]
0045D450   .  EB 06         jmp     short 0045D458
0045D452   >  8B1D E0124600 mov     ebx, [<&MSVBVM50.__vbaNew2>]     ;  MSVBVM50.__vbaNew2
0045D458   >  85C0          test    eax, eax
0045D45A   .  8985 2CFFFFFF mov     [ebp-D4], eax
0045D460   .  75 11         jnz     short 0045D473
0045D462   .  68 10F04500   push    0045F010
0045D467   .  68 28634000   push    00406328
0045D46C   .  FFD3          call    ebx
0045D46E   .  A1 10F04500   mov     eax, [45F010]
0045D473   >  8B10          mov     edx, [eax]
0045D475   .  50            push    eax
0045D476   .  FF92 00030000 call    [edx+300]
0045D47C   .  50            push    eax
0045D47D   .  8D45 C8       lea     eax, [ebp-38]
0045D480   .  50            push    eax
0045D481   .  FF15 30124600 call    [<&MSVBVM50.__vbaObjSet>]        ;  MSVBVM50.__vbaObjSet
0045D487   .  8BF0          mov     esi, eax
0045D489   .  8D55 E0       lea     edx, [ebp-20]
0045D48C   .  52            push    edx
0045D48D   .  56            push    esi
0045D48E   .  8B0E          mov     ecx, [esi]
0045D490   .  FF91 A0000000 call    [ecx+A0]
0045D496   .  85C0          test    eax, eax
0045D498   .  7D 12         jge     short 0045D4AC
0045D49A   .  68 A0000000   push    0A0
0045D49F   .  68 C08A4000   push    00408AC0
0045D4A4   .  56            push    esi
0045D4A5   .  50            push    eax
0045D4A6   .  FF15 08124600 call    [<&MSVBVM50.__vbaHresultCheckObj>;  MSVBVM50.__vbaHresultCheckObj
0045D4AC   >  A1 10F04500   mov     eax, [45F010]
0045D4B1   .  85C0          test    eax, eax
0045D4B3   .  75 11         jnz     short 0045D4C6
0045D4B5   .  68 10F04500   push    0045F010
0045D4BA   .  68 28634000   push    00406328
0045D4BF   .  FFD3          call    ebx
0045D4C1   .  A1 10F04500   mov     eax, [45F010]
0045D4C6   >  8B08          mov     ecx, [eax]
0045D4C8   .  50            push    eax
0045D4C9   .  FF91 00030000 call    [ecx+300]
0045D4CF   .  8D55 C4       lea     edx, [ebp-3C]
0045D4D2   .  50            push    eax
0045D4D3   .  52            push    edx
0045D4D4   .  FF15 30124600 call    [<&MSVBVM50.__vbaObjSet>]        ;  MSVBVM50.__vbaObjSet
0045D4DA   .  8BF0          mov     esi, eax
0045D4DC   .  8D4D DC       lea     ecx, [ebp-24]
0045D4DF   .  51            push    ecx
0045D4E0   .  56            push    esi
0045D4E1   .  8B06          mov     eax, [esi]
0045D4E3   .  FF90 A0000000 call    [eax+A0]
0045D4E9   .  85C0          test    eax, eax
0045D4EB   .  7D 12         jge     short 0045D4FF
0045D4ED   .  68 A0000000   push    0A0
0045D4F2   .  68 C08A4000   push    00408AC0                          ;下面是关键地方了。
0045D4F7   .  56            push    esi
0045D4F8   .  50            push    eax
0045D4F9   .  FF15 08124600 call    [<&MSVBVM50.__vbaHresultCheckObj>;  MSVBVM50.__vbaHresultCheckObj
0045D4FF   >  8B95 2CFFFFFF mov     edx, [ebp-D4]
0045D505   .  8B45 DC       mov     eax, [ebp-24]                     ;这里读取的是C盘下的文件Iotmrd里面的字符串
0045D508   .  50            push    eax
0045D509   .  8B1A          mov     ebx, [edx]
0045D50B   .  FF15 60134600 call    [<&MSVBVM50.#581>]               ;  MSVBVM50.rtcR8ValFromBstr
0045D511   .  FF15 24134600 call    [<&MSVBVM50.__vbaFpI4>]          ;  MSVBVM50.__vbaFpI4
0045D517   .  99            cdq
0045D518   .  B9 E8030000   mov     ecx, 3E8                         ;  3E8固定值到ecx
0045D51D   .  F7F9          idiv    ecx                              ;  用从c盘读取到的文件的字符串除以3E8
0045D51F   .  8BF2          mov     esi, edx                         ;  余数到esi
0045D521   .  8B55 E0       mov     edx, [ebp-20]                    ;  读到的字符串
0045D524   .  52            push    edx
0045D525   .  FF15 60134600 call    [<&MSVBVM50.#581>]               ;  MSVBVM50.rtcR8ValFromBstr
0045D52B   .  FF15 24134600 call    [<&MSVBVM50.__vbaFpI4>]          ;  MSVBVM50.__vbaFpI4
0045D531   .  99            cdq
0045D532   .  B9 E8030000   mov     ecx, 3E8
0045D537   .  F7F9          idiv    ecx
0045D539   .  0FAFF2        imul    esi, edx                         ;  余数平方放到esi
0045D53C   .  0F80 34090000 jo      0045DE76
0045D542   .  03F7          add     esi, edi                         ;  余数平方后记为A。A+用户名ASCII码累加值
0045D544   .  0F80 2C090000 jo      0045DE76
0045D54A   .  83C6 02       add     esi, 2                           ;  +2
0045D54D   .  0F80 23090000 jo      0045DE76
0045D553   .  46            inc     esi                              ;  +1。这里得到的数转换成10进制就是真正注册码了。
0045D554   .  0F80 1C090000 jo      0045DE76
0045D55A   .  56            push    esi
0045D55B   .  8BB5 2CFFFFFF mov     esi, [ebp-D4]
0045D561   .  56            push    esi
0045D562   .  FF93 04070000 call    [ebx+704]
0045D568   .  85C0          test    eax, eax
0045D56A   .  7D 12         jge     short 0045D57E
0045D56C   .  68 04070000   push    704
0045D571   .  68 487F4000   push    00407F48
0045D576   .  56            push    esi
0045D577   .  50            push    eax
0045D578   .  FF15 08124600 call    [<&MSVBVM50.__vbaHresultCheckObj>;  MSVBVM50.__vbaHresultCheckObj
0045D57E   >  8D55 DC       lea     edx, [ebp-24]
0045D581   .  8D45 E0       lea     eax, [ebp-20]
0045D584   .  52            push    edx
0045D585   .  50            push    eax
0045D586   .  6A 02         push    2
0045D588   .  FF15 FC124600 call    [<&MSVBVM50.__vbaFreeStrList>]   ;  MSVBVM50.__vbaFreeStrList
0045D58E   .  83C4 0C       add     esp, 0C
0045D591   .  8D4D C4       lea     ecx, [ebp-3C]
0045D594   .  8D55 C8       lea     edx, [ebp-38]
0045D597   .  51            push    ecx
0045D598   .  52            push    edx
0045D599   .  6A 02         push    2
0045D59B   .  FF15 F4114600 call    [<&MSVBVM50.__vbaFreeObjList>]   ;  MSVBVM50.__vbaFreeObjList
0045D5A1   .  A1 10F04500   mov     eax, [45F010]
0045D5A6   .  83C4 0C       add     esp, 0C
0045D5A9   .  85C0          test    eax, eax
0045D5AB   .  75 10         jnz     short 0045D5BD                   ;  ++++++++
0045D5AD   .  68 10F04500   push    0045F010
0045D5B2   .  68 28634000   push    00406328
0045D5B7   .  FF15 E0124600 call    [<&MSVBVM50.__vbaNew2>]          ;  MSVBVM50.__vbaNew2
0045D5BD   >  8B35 10F04500 mov     esi, [45F010]
0045D5C3   .  8D8D 40FFFFFF lea     ecx, [ebp-C0]
0045D5C9   .  51            push    ecx
0045D5CA   .  56            push    esi
0045D5CB   .  8B06          mov     eax, [esi]
0045D5CD   .  FF90 00070000 call    [eax+700]
0045D5D3   .  85C0          test    eax, eax
0045D5D5   .  7D 12         jge     short 0045D5E9
0045D5D7   .  68 00070000   push    700
0045D5DC   .  68 487F4000   push    00407F48
0045D5E1   .  56            push    esi
0045D5E2   .  50            push    eax
0045D5E3   .  FF15 08124600 call    [<&MSVBVM50.__vbaHresultCheckObj>;  MSVBVM50.__vbaHresultCheckObj
0045D5E9   >  8B5D 08       mov     ebx, [ebp+8]
0045D5EC   .  8BBD 10FFFFFF mov     edi, [ebp-F0]
0045D5F2   .  53            push    ebx
0045D5F3   .  FF97 08030000 call    [edi+308]
0045D5F9   .  8D55 C8       lea     edx, [ebp-38]
0045D5FC   .  50            push    eax
0045D5FD   .  52            push    edx
0045D5FE   .  FF15 30124600 call    [<&MSVBVM50.__vbaObjSet>]        ;  MSVBVM50.__vbaObjSet
0045D604   .  8BF0          mov     esi, eax
0045D606   .  8D4D E0       lea     ecx, [ebp-20]
0045D609   .  51            push    ecx
0045D60A   .  56            push    esi
0045D60B   .  8B06          mov     eax, [esi]
0045D60D   .  FF90 A0000000 call    [eax+A0]
0045D613   .  85C0          test    eax, eax
0045D615   .  7D 12         jge     short 0045D629
0045D617   .  68 A0000000   push    0A0
0045D61C   .  68 C08A4000   push    00408AC0
0045D621   .  56            push    esi
0045D622   .  50            push    eax
0045D623   .  FF15 08124600 call    [<&MSVBVM50.__vbaHresultCheckObj>;  MSVBVM50.__vbaHresultCheckObj
0045D629   >  8B55 E0       mov     edx, [ebp-20]                    ;  假码
0045D62C   .  52            push    edx
0045D62D   .  FF15 60134600 call    [<&MSVBVM50.#581>]               ;  MSVBVM50.rtcR8ValFromBstr
0045D633   .  FF15 5C124600 call    [<&MSVBVM50.__vbaFpR8>]          ;  MSVBVM50.__vbaFpR8
0045D639   .  DB85 40FFFFFF fild    dword ptr [ebp-C0]               ;这里将出现真正的注册码。
0045D63F   .  DD9D 04FFFFFF fstp    qword ptr [ebp-FC]
0045D645   .  DC9D 04FFFFFF fcomp   qword ptr [ebp-FC]               ;真假比较。浮点运算。
0045D64B   .  DFE0          fstsw   ax
0045D64D   .  F6C4 40       test    ah, 40
0045D650   .  74 07         je      short 0045D659


2、我们通过使用Smartcheck跟踪,可以找到机器码的生成在地址0045E1F2,所以我们能得到机器码计算的地方在这里:

0045E1CE   .  52            push    edx                              ;  从C盘文件读取到的字符串
0045E1CF   .  FF15 60134600 call    [<&MSVBVM50.#581>]               ;  MSVBVM50.rtcR8ValFromBstr
0045E1D5   .  DC8D 48FFFFFF fmul    qword ptr [ebp-B8]               ;  自己乘以自己,就是平方
0045E1DB   .  83EC 08       sub     esp, 8
0045E1DE   .  DC25 D8124000 fsub    qword ptr [4012D8]               ;  减去-1000000。就是加上1000000。
0045E1E4   .  DFE0          fstsw   ax                               ;  得到最终的机器码。
0045E1E6   .  A8 0D         test    al, 0D
0045E1E8   .  0F85 7B020000 jnz     0045E469
0045E1EE   .  DD1C24        fstp    qword ptr [esp]

【易语言注册机源码】
------------------------------------------------------------------------

.版本 2

.子程序 _按钮1_被单击
.局部变量 jiqima, 长整数型
.局部变量 a, 长整数型
.局部变量 string, 文本型
.局部变量 b, 长整数型
.局部变量 name, 文本型
.局部变量 len, 整数型
.局部变量 i, 整数型
.局部变量 c, 整数型
.局部变量 sum, 长整数型
.局部变量 code, 文本型

jiqima = 到整数 (编辑框1.内容)
jiqima = jiqima - 1000000
a = 求平方根 (jiqima)
b = a % 1000
name = 编辑框2.内容
len = 取文本长度 (name)
.计次循环首 (len, i)
    c = 取代码 (name, i)
    sum = sum + c
.计次循环尾 ()
b = b × b
sum = sum + b
code = 到文本 (sum + 3)
编辑框3.内容 = 到文本 (code)


【破解总结】
------------------------------------------------------------------------
这个算法很简单。但是,由于是VB,所以感觉挺麻烦的。

注册算法是:

1、读取C盘下的这个文件“Iotmrd.sys”。我们用记事本打开可以看到类似下面的东西。
[MyApp]
pt1=5555      《-----这个值
pt2=S
Form1Top= 1065
Form1Left= 2625
Form1Height= 8520
Form1Width= 11520

主要需要的是“pt1=5555”这个“5555”。机器码就是根据这个数运算出来的。我们可以随意更改,然后机器码也变了。机器码的计算是取这个数平方后加1000000。

2、得到上面的“5555”后,转成16进制,然后除以3E8求得余数。余数平方,结果记为A(16进制)。

3、A+用户名各位Ascii码值的累加值,他们的和记为B(16进制)。

4、B(16进制)+2+1=C(16进制)。C的10进制就是最终的注册码。