• 标 题:网络电视专家5.0算法分析
  • 作 者:blue_devil_bomb
  • 时 间:004-05-29,13:20
  • 链 接:http://bbs.pediy.com

【破解作者】 blue_devil_bomb[BCG]
【作者邮箱】 ninesunnine@sina.com
【使用工具】 peid OllyDbg1.09 regsnap
【破解平台】 Win9x/NT/2000/XP
【软件名称】 网络电视专家5.0
【下载地址】 Forget
【软件简介】 《网络电视专家》内置数百个电视台和电台地址,除了可以收看各省的卫星电视台外,还可以收看香港凤凰卫视、阳光卫视,韩国、日本、美国、法国等多个国家的电视电影频道,收视率在95%左右。软件中还设计了老幼皆宜的桌面游戏,让您轻松度过休闲时光。软件使用方法很简单,只要用鼠标点击想要收看或收听的节目频道名称,即可享受网络在线实时电视和广播了节目了。需要提醒您的是,你的系统必须已经安装了MediaPlayer 和ReaLoneplayer。全面支持Windows9x/ME/NT/2000/XP。
●未注册版与注册版的区别 
       未注册版           注册版  
只能收看23个电视频道 可以收看236个电视频道和18个网上电影院 
只能收听23个电台广播 可以收听120个电台广播 
只能玩15个休闲游戏   可以玩89个休闲游戏和流行节目 
软件弹出注册窗口     不会弹出窗口 
不能免费升级         终生免费升级 
一般的技术支持       更好的技术支持!更好的优质服务。 
注意:你的软件菜单如果是灰的,那是因为您还没有注册,所以限制了不能使用。您一旦注册后,将会取消这些限制,您就可以收到所有的电视和广播节目了。 
【软件大小】 331kb
【加壳方式】 ASPack 2.1 -> Alexey Solodovnikov
【破解声明】 不为破解而破解,只为学习而破解
--------------------------------------------------------------------------------
【破解内容】

    有一天无意中发现该软件,软件介绍描述的神乎其神便决定当下一试,一试不爽,有诸多限制,均是要求注册。注册费用不高,可我是穷人,地道的穷人,又没人施舍,自己的事情自己做,决定自己动手解决它,以节约几包烟钱。终于在抽了几包烟后,把它的注册搞定!但还是有问题,具体分析请看!
    该软件在没有注册时,每次启动就会弹出烦人的注册框,气煞老夫,我是什么,我是什么,哈哈,我到底是什么?靠,我是男人,我破了你的xxxxx。
    用peid检测发现是ASPack 2.1 -> Alexey Solodovnikov用专门的脱壳软件Stripper.exe来脱之,脱后运行,一切OK,运行破解之!拿常用的断点设之,不能中断,只能在字符参考上下断了。此时OK了。还有该软件在输入的注册信息不正确时没有任何的提示信息,只有注册成功时才有提示,且将注册信息写入注册表\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Sysdisk位置。
    我们一路跟踪到如下:

代码:
  00497A10   . 55             PUSH EBP 00497A11   . 8BEC           MOV EBP,ESP 00497A13   . 33C9           XOR ECX,ECX 00497A15   . 51             PUSH ECX 00497A16   . 51             PUSH ECX 00497A17   . 51             PUSH ECX 00497A18   . 51             PUSH ECX 00497A19   . 53             PUSH EBX 00497A1A   . 56             PUSH ESI 00497A1B   . 57             PUSH EDI 00497A1C   . 8BD8           MOV EBX,EAX 00497A1E   . 33C0           XOR EAX,EAX 00497A20   . 55             PUSH EBP 00497A21   . 68 247B4900    PUSH _nettv.00497B24 00497A26   . 64:FF30        PUSH DWORD PTR FS:[EAX] 00497A29   . 64:8920        MOV DWORD PTR FS:[EAX],ESP 00497A2C   . 33D2           XOR EDX,EDX 00497A2E   . 55             PUSH EBP 00497A2F   . 68 E47A4900    PUSH _nettv.00497AE4 00497A34   . 64:FF32        PUSH DWORD PTR FS:[EDX] 00497A37   . 64:8922        MOV DWORD PTR FS:[EDX],ESP 00497A3A   . 8D55 F8        LEA EDX,DWORD PTR SS:[EBP-8] 00497A3D   . 8B83 E0020000  MOV EAX,DWORD PTR DS:[EBX+2E0] 00497A43   . E8 D44BF9FF    CALL _nettv.0042C61C              ;  名字长度 00497A48   . 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]      ;  输入的名字 00497A4B   . 8D55 FC        LEA EDX,DWORD PTR SS:[EBP-4] 00497A4E   . E8 B90AF7FF    CALL _nettv.0040850C               00497A53   . 837D FC 00     CMP DWORD PTR SS:[EBP-4],0        ;  输入名字了吗? 00497A57   . 75 18          JNZ SHORT _nettv.00497A71                  00497A59   . A1 50A84900    MOV EAX,DWORD PTR DS:[49A850]     ;  00497A5E   . 8B00           MOV EAX,DWORD PTR DS:[EAX] 00497A60   . E8 D3FDFAFF    CALL _nettv.00447838              ;  输入名字空时在标题上显示未注册  00497A65   . A1 C0B94900    MOV EAX,DWORD PTR DS:[49B9C0] 00497A6A   . E8 C1FDFAFF    CALL _nettv.00447830 00497A6F   . EB 69          JMP SHORT _nettv.00497ADA 00497A71   > 8D55 F0        LEA EDX,DWORD PTR SS:[EBP-10] 00497A74   . 8B83 E4020000  MOV EAX,DWORD PTR DS:[EBX+2E4] 00497A7A   . E8 9D4BF9FF    CALL _nettv.0042C61C              ;  注册码长度 00497A7F   . 8B45 F0        MOV EAX,DWORD PTR SS:[EBP-10]     ;  输入的注册码 00497A82   . 8D55 F4        LEA EDX,DWORD PTR SS:[EBP-C] 00497A85   . E8 820AF7FF    CALL _nettv.0040850C 00497A8A   . 837D F4 00     CMP DWORD PTR SS:[EBP-C],0        ;  输入注册码了吗? 00497A8E     75 18          JNZ SHORT _nettv.00497AA8 00497A90   . A1 50A84900    MOV EAX,DWORD PTR DS:[49A850] 00497A95   . 8B00           MOV EAX,DWORD PTR DS:[EAX] 00497A97   . E8 9CFDFAFF    CALL _nettv.00447838              ;  没输注册码时,标题上显示未注册 00497A9C   . A1 C0B94900    MOV EAX,DWORD PTR DS:[49B9C0] 00497AA1   . E8 8AFDFAFF    CALL _nettv.00447830 00497AA6   . EB 32          JMP SHORT _nettv.00497ADA 00497AA8   > 8BC3           MOV EAX,EBX 00497AAA   . E8 25020000    CALL _nettv.00497CD4         ;  名字与注册码运算,注册算法核心,见下 00497AAF   . 84C0           TEST AL,AL                   ;  判断注册是否成功AL非0成功,0失败 00497AB1   . 74 09          JE SHORT _nettv.00497ABC      00497AB3   . 8BC3           MOV EAX,EBX 00497AB5   . E8 7A000000    CALL _nettv.00497B34         ;  注册成功时将注册信息写入注册表 00497ABA   . EB 1E          JMP SHORT _nettv.00497ADA 00497ABC   > B8 F4010000    MOV EAX,1F4 00497AC1   > 48             DEC EAX 00497AC2   .^75 FD          JNZ SHORT _nettv.00497AC1 00497AC4   . A1 50A84900    MOV EAX,DWORD PTR DS:[49A850] 00497AC9   . 8B00           MOV EAX,DWORD PTR DS:[EAX] 00497ACB   . E8 68FDFAFF    CALL _nettv.00447838 00497AD0   . A1 C0B94900    MOV EAX,DWORD PTR DS:[49B9C0] 00497AD5   . E8 56FDFAFF    CALL _nettv.00447830 00497ADA   > 33C0           XOR EAX,EAX 00497ADC   . 5A             POP EDX 00497ADD   . 59             POP ECX 00497ADE   . 59             POP ECX 00497ADF   . 64:8910        MOV DWORD PTR FS:[EAX],EDX 00497AE2   . EB 12          JMP SHORT _nettv.00497AF6 00497AE4   .^E9 D7B7F6FF    JMP _nettv.004032C0 00497AE9   . B8 F4010000    MOV EAX,1F4 00497AEE   > 48             DEC EAX 00497AEF   .^75 FD          JNZ SHORT _nettv.00497AEE 00497AF1   . E8 26BBF6FF    CALL _nettv.0040361C 00497AF6   > 33C0           XOR EAX,EAX 00497AF8   . 5A             POP EDX 00497AF9   . 59             POP ECX 00497AFA   . 59             POP ECX 00497AFB   . 64:8910        MOV DWORD PTR FS:[EAX],EDX 00497AFE   . 68 2B7B4900    PUSH _nettv.00497B2B 00497B03   > 8D45 F0        LEA EAX,DWORD PTR SS:[EBP-10] 00497B06   . E8 D1BFF6FF    CALL _nettv.00403ADC 00497B0B   . 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C] 00497B0E   . E8 C9BFF6FF    CALL _nettv.00403ADC 00497B13   . 8D45 F8        LEA EAX,DWORD PTR SS:[EBP-8] 00497B16   . E8 C1BFF6FF    CALL _nettv.00403ADC 00497B1B   . 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4] 00497B1E   . E8 B9BFF6FF    CALL _nettv.00403ADC 00497B23   . C3             RETN 注册算法核心如下: 00497CD4  /$ 55             PUSH EBP 00497CD5  |. 8BEC           MOV EBP,ESP 00497CD7  |. 83C4 E8        ADD ESP,-18 00497CDA  |. 53             PUSH EBX 00497CDB  |. 56             PUSH ESI 00497CDC  |. 33D2           XOR EDX,EDX 00497CDE  |. 8955 E8        MOV DWORD PTR SS:[EBP-18],EDX 00497CE1  |. 8955 EC        MOV DWORD PTR SS:[EBP-14],EDX 00497CE4  |. 8955 F4        MOV DWORD PTR SS:[EBP-C],EDX 00497CE7  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX 00497CEA  |. 33C0           XOR EAX,EAX 00497CEC  |. 55             PUSH EBP 00497CED  |. 68 D37D4900    PUSH _nettv.00497DD3 00497CF2  |. 64:FF30        PUSH DWORD PTR FS:[EAX] 00497CF5  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP 00497CF8  |. 33DB           XOR EBX,EBX                           ;EBX清零,做为结果存放用的 00497CFA  |. 8D55 F4        LEA EDX,DWORD PTR SS:[EBP-C] 00497CFD  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4] 00497D00  |. 8B80 E0020000  MOV EAX,DWORD PTR DS:[EAX+2E0] 00497D06  |. E8 1149F9FF    CALL _nettv.0042C61C                  ;返回EAX为字串长度 00497D0B  |. 8B45 F4        MOV EAX,DWORD PTR SS:[EBP-C]          ;将名字赋给EAX 00497D0E  |. E8 49C0F6FF    CALL _nettv.00403D5C                  ;获取字串长度 00497D13  |. 8BF0           MOV ESI,EAX 00497D15  |. 85F6           TEST ESI,ESI                 ;判断长度 00497D17  |. 7E 38          JLE SHORT _nettv.00497D51 00497D19  |. C745 F0 010000>MOV DWORD PTR SS:[EBP-10],1 00497D20  |> 8D45 EC        /LEA EAX,DWORD PTR SS:[EBP-14]   ;下面依次取名字字串字符运算 00497D23  |. 50             |PUSH EAX 00497D24  |. B9 01000000    |MOV ECX,1                       ;每次取1个 00497D29  |. 8B55 F0        |MOV EDX,DWORD PTR SS:[EBP-10]   ;第i个 00497D2C  |. 8B45 F4        |MOV EAX,DWORD PTR SS:[EBP-C]    ;将名字赋给EAX 00497D2F  |. E8 30C2F6FF    |CALL _nettv.00403F64            ;取名字字串第i个字符,每次取1个 00497D34  |. 8B45 EC        |MOV EAX,DWORD PTR SS:[EBP-14]   ;名字字串的第i个字符存放的内存 00497D37  |. E8 E4C1F6FF    |CALL _nettv.00403F20            ;判断第i个字符                  00497D3C  |. 8A00           |MOV AL,BYTE PTR DS:[EAX]        ;从内存中取出第i个值赋给AL 00497D3E  |. 25 FF000000    |AND EAX,0FF                     ;EAX&=0xff;将AL值赋给EAX 00497D43  |. 03D8           |ADD EBX,EAX                     ;用字符的值累加更新EBX的值 00497D45  |. 81F3 05FA0B00  |XOR EBX,0BFA05                  ;EBX^=0xBFA05;   00497D4B  |. FF45 F0        |INC DWORD PTR SS:[EBP-10]       ;i++; 00497D4E  |. 4E             |DEC ESI                         ;判断循环是否结束 00497D4F  |.^75 CF          \JNZ SHORT _nettv.00497D20 00497D51  |> A1 CCB94900    MOV EAX,DWORD PTR DS:[49B9CC]    ;一个固定的值为0x2977537 00497D56  |. 8BD0           MOV EDX,EAX                            00497D58  |. C1E0 04        SHL EAX,4                        ;2977537左移四位 00497D5B  |. 03C2           ADD EAX,EDX                      ;EAX=2977537+(2977537<<4) 00497D5D  |. 03D8           ADD EBX,EAX                      ;EBX=字串运算结果+EAX 00497D5F  |. 81C3 D4A31300  ADD EBX,13A3D4                   ;EBX+=0x13a3d4  00497D65  |. 81F3 8DED5900  XOR EBX,59ED8D                   ;EBX^=0x59ED8D 00497D6B  |. 8D55 E8        LEA EDX,DWORD PTR SS:[EBP-18] 00497D6E  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4] 00497D71  |. 8B80 E4020000  MOV EAX,DWORD PTR DS:[EAX+2E4] 00497D77  |. E8 A048F9FF    CALL _nettv.0042C61C             ;返回EAX为注册码长度 00497D7C  |. 8B45 E8        MOV EAX,DWORD PTR SS:[EBP-18]    ;注册码赋给EAX 00497D7F  |. E8 1C09F7FF    CALL _nettv.004086A0             ;注册码10进制数转化成16进制数赋给EAX 00497D84  |. 8BF3           MOV ESI,EBX 00497D86  |. 81F6 2473C400  XOR ESI,0C47324                  ;ESI=名字运算结果^0xC47324; 00497D8C  |. 3BC6           CMP EAX,ESI                      ;注册码与名字运算结果比较 00497D8E  |. 75 19          JNZ SHORT _nettv.00497DA9        ;相等注册成功; 00497D90  |. C645 FB 01     MOV BYTE PTR SS:[EBP-5],1 00497D94  |. B8 C4B94900    MOV EAX,_nettv.0049B9C4 00497D99  |. 8B55 F4        MOV EDX,DWORD PTR SS:[EBP-C] 00497D9C  |. E8 8FBDF6FF    CALL _nettv.00403B30 00497DA1  |. 8935 C8B94900  MOV DWORD PTR DS:[49B9C8],ESI 00497DA7  |. EB 04          JMP SHORT _nettv.00497DAD 00497DA9  |> C645 FB 00     MOV BYTE PTR SS:[EBP-5],0 00497DAD  |> 33C0           XOR EAX,EAX 00497DAF  |. 5A             POP EDX 00497DB0  |. 59             POP ECX 00497DB1  |. 59             POP ECX 00497DB2  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX 00497DB5  |. 68 DA7D4900    PUSH _nettv.00497DDA 00497DBA  |> 8D45 E8        LEA EAX,DWORD PTR SS:[EBP-18] 00497DBD  |. E8 1ABDF6FF    CALL _nettv.00403ADC 00497DC2  |. 8D45 EC        LEA EAX,DWORD PTR SS:[EBP-14] 00497DC5  |. E8 12BDF6FF    CALL _nettv.00403ADC 00497DCA  |. 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C] 00497DCD  |. E8 0ABDF6FF    CALL _nettv.00403ADC 00497DD2  \. C3             RETN 00497DD3   .^E9 9CB7F6FF    JMP _nettv.00403574 00497DD8   .^EB E0          JMP SHORT _nettv.00497DBA 00497DDA   . 8A45 FB        MOV AL,BYTE PTR SS:[EBP-5] 00497DDD   . 5E             POP ESI 00497DDE   . 5B             POP EBX 00497DDF   . 8BE5           MOV ESP,EBP 00497DE1   . 5D             POP EBP 00497DE2   . C3             RETN 下面函数为写入注册表部分 00497B34  /$ 55             PUSH EBP 00497B35  |. 8BEC           MOV EBP,ESP 00497B37  |. 33C9           XOR ECX,ECX 00497B39  |. 51             PUSH ECX 00497B3A  |. 51             PUSH ECX 00497B3B  |. 51             PUSH ECX 00497B3C  |. 51             PUSH ECX 00497B3D  |. 53             PUSH EBX 00497B3E  |. 56             PUSH ESI 00497B3F  |. 57             PUSH EDI 00497B40  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX 00497B43  |. 33C0           XOR EAX,EAX 00497B45  |. 55             PUSH EBP 00497B46  |. 68 497C4900    PUSH _nettv.00497C49 00497B4B  |. 64:FF30        PUSH DWORD PTR FS:[EAX] 00497B4E  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP 00497B51  |. B2 01          MOV DL,1 00497B53  |. A1 B8BB4400    MOV EAX,DWORD PTR DS:[44BBB8] 00497B58  |. E8 5B41FBFF    CALL _nettv.0044BCB8 00497B5D  |. 8BF8           MOV EDI,EAX 00497B5F  |. BA 01000080    MOV EDX,80000001 00497B64  |. 8BC7           MOV EAX,EDI 00497B66  |. E8 ED41FBFF    CALL _nettv.0044BD58 00497B6B  |. B1 01          MOV CL,1 00497B6D  |. BA 607C4900    MOV EDX,_nettv.00497C60                  ;  ASCII "\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Sysdisk"  写入注册表位置 00497B72  |. 8BC7           MOV EAX,EDI 00497B74  |. E8 4342FBFF    CALL _nettv.0044BDBC 00497B79  |. 8D45 F8        LEA EAX,DWORD PTR SS:[EBP-8] 00497B7C  |. E8 5BBFF6FF    CALL _nettv.00403ADC 00497B81  |. A1 C4B94900    MOV EAX,DWORD PTR DS:[49B9C4]    ;注册输入的名字赋给EAX 00497B86  |. E8 D1C1F6FF    CALL _nettv.00403D5C             ;取注册名字的长度 00497B8B  |. 8BD8           MOV EBX,EAX 00497B8D  |. 85DB           TEST EBX,EBX                     ;判断注册名字的长度是否大于0 00497B8F  |. 7E 40          JLE SHORT _nettv.00497BD1 00497B91  |. BE 01000000    MOV ESI,1 00497B96  |> 8D45 F0        /LEA EAX,DWORD PTR SS:[EBP-10]   ;注册的名字在写入注册表前进行运算。 00497B99  |. 50             |PUSH EAX 00497B9A  |. B9 01000000    |MOV ECX,1 00497B9F  |. 8BD6           |MOV EDX,ESI 00497BA1  |. A1 C4B94900    |MOV EAX,DWORD PTR DS:[49B9C4]   ;注册的名字赋给EAX 00497BA6  |. E8 B9C3F6FF    |CALL _nettv.00403F64             00497BAB  |. 8B45 F0        |MOV EAX,DWORD PTR SS:[EBP-10]   ;EAX内存位置存放名字第EDX个字符 00497BAE  |. E8 6DC3F6FF    |CALL _nettv.00403F20 00497BB3  |. 33D2           |XOR EDX,EDX  00497BB5  |. 8A10           |MOV DL,BYTE PTR DS:[EAX]        ;将第EDX个字符赋给DL 00497BB7  |. 83C2 05        |ADD EDX,5                       ;EDX+=5; 00497BBA  |. 8D45 F4        |LEA EAX,DWORD PTR SS:[EBP-C] 00497BBD  |. E8 C2C0F6FF    |CALL _nettv.00403C84 00497BC2  |. 8B55 F4        |MOV EDX,DWORD PTR SS:[EBP-C] 00497BC5  |. 8D45 F8        |LEA EAX,DWORD PTR SS:[EBP-8] 00497BC8  |. E8 97C1F6FF    |CALL _nettv.00403D64 00497BCD  |. 46             |INC ESI 00497BCE  |. 4B             |DEC EBX 00497BCF  |.^75 C5          \JNZ SHORT _nettv.00497B96 00497BD1  |> B8 C4B94900    MOV EAX,_nettv.0049B9C4 00497BD6  |. 8B55 F8        MOV EDX,DWORD PTR SS:[EBP-8]             ;名字变换后的字串赋给EDX 00497BD9  |. E8 52BFF6FF    CALL _nettv.00403B30 00497BDE  |. 8B0D C4B94900  MOV ECX,DWORD PTR DS:[49B9C4] 00497BE4  |. BA A47C4900    MOV EDX,_nettv.00497CA4                  ;  ASCII "FN ame" 00497BE9  |. 8BC7           MOV EAX,EDI 00497BEB  |. E8 6843FBFF    CALL _nettv.0044BF58  00497BF0  |. 8B0D C8B94900  MOV ECX,DWORD PTR DS:[49B9C8] 00497BF6  |. 81F1 0AB30000  XOR ECX,0B30A                            ;注册码^0xB30A为写入的注册码 00497BFC  |. BA B47C4900    MOV EDX,_nettv.00497CB4                  ;  ASCII "FP ass" 00497C01  |. 8BC7           MOV EAX,EDI 00497C03  |. E8 F443FBFF    CALL _nettv.0044BFFC 00497C08  |. 8BC7           MOV EAX,EDI 00497C0A  |. E8 05B2F6FF    CALL _nettv.00402E14                     ;写入注册表 00497C0F  |. A1 50A84900    MOV EAX,DWORD PTR DS:[49A850] 00497C14  |. 8B00           MOV EAX,DWORD PTR DS:[EAX] 00497C16  |. 8B80 D0020000  MOV EAX,DWORD PTR DS:[EAX+2D0] 00497C1C  |. BA C47C4900    MOV EDX,_nettv.00497CC4 00497C21  |. E8 A266FDFF    CALL _nettv.0046E2C8 00497C26  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4] 00497C29  |. E8 B6010000    CALL _nettv.00497DE4 00497C2E  |. 33C0           XOR EAX,EAX 00497C30  |. 5A             POP EDX 00497C31  |. 59             POP ECX 00497C32  |. 59             POP ECX 00497C33  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX 00497C36  |. 68 507C4900    PUSH _nettv.00497C50 00497C3B  |> 8D45 F0        LEA EAX,DWORD PTR SS:[EBP-10] 00497C3E  |. BA 03000000    MOV EDX,3 00497C43  |. E8 B8BEF6FF    CALL _nettv.00403B00 00497C48  \. C3             RETN 00497C49   .^E9 26B9F6FF    JMP _nettv.00403574 00497C4E   .^EB EB          JMP SHORT _nettv.00497C3B
 
    该软件的注册部分至此已较明晰,该软件第次启动都会读取注册表的注册信息进行判断,以决定是否以注册版本运行该软件,不过我还有一个疑问还没有解决,有兴趣的网友可以帮忙解决一下,就是如上注册成功后,该软件显示为注册版本,可是还是没有将菜单中的灰极按钮变亮,当然,我们可以很轻松将菜单有灰变亮,但这也给我的破解留下了遗憾! 

菜单有灰变亮,可以使用的过程如下:
代码:
  00412672     BA BC264100    MOV EDX,_nettv.004126BC   ;  ASCII "False" 修改此处即可将菜单由灰变亮 00412677  |. E8 B414FFFF    CALL _nettv.00403B30 0041267C  |. EB 2F          JMP SHORT _nettv.004126AD 0041267E  |> 8BC6           MOV EAX,ESI               ;  Case 9 of switch 00412601 00412680  |. BA CC264100    MOV EDX,_nettv.004126CC   ;  ASCII "True" 00412685  |. E8 A614FFFF    CALL _nettv.00403B30 0041268A  |. EB 21          JMP SHORT _nettv.004126AD 0041268C  |> 8BC6           MOV EAX,ESI               ;  Case D of switch 00412601 0041268E  |. BA DC264100    MOV EDX,_nettv.004126DC   ;  ASCII "nil" 00412693  |. E8 9814FFFF    CALL _nettv.00403B30 00412698  |. EB 13          JMP SHORT _nettv.004126AD 0041269A  |> 8BC6           MOV EAX,ESI               ;  Case 0 of switch 00412601 0041269C  |. BA E8264100    MOV EDX,_nettv.004126E8   ;  ASCII "Null" 004126A1  |. E8 8A14FFFF    CALL _nettv.00403B30 004126A6  |. EB 05          JMP SHORT _nettv.004126AD 004126A8  |> E8 13F2FFFF    CALL _nettv.004118C0      ;  Default case of switch 00412601 004126AD  |> 5A             POP EDX 004126AE  |. 5E             POP ESI 004126AF  |. 5B             POP EBX 004126B0  \. C3             RETN
 
注:将412672处的MOV EDX,_nettv.004126BC 改为MOV EDX,_nettv.004126CC即可,此时软件运行正常。

上面我们将该软件的注册过程及算法描述的很清楚,
具体算法如下:
1、依次取名字的每一个字符,每一字符的ASCII值设为 Vlaue[i],结果存贮为JG=0,名字长度Len,注册码为ZCM;
2、JG+=Vlaue[i];JG^=0xbfa05;i=[0,Len-1];
3、JG+=0x2977537+(0x2977537<<4);
4、JG+=0x13a3d4;
5、JG^=0x59ed8d;
6、JG^=0xC47324;
7、ZCM=JG;
下面给出该算法的C源代码,程序在VC环境下调试通过,且在多台机器上注册成功!
代码:
代码:
  void CNettv50Dlg::OnButton1()  {   // TODO: Add your control notification handler code here   m_Ctrledit1.GetWindowText(m_Vedit1);   int i;   unsigned long eax,ebx=0;   for(i=0;i<m_Vedit1.GetLength();i++)   {     eax=m_Vedit1.GetAt(i);     eax&=0xff;     ebx+=eax;     ebx^=0xbfa05;   }   unsigned long edx;   //[49b9cc]=2977537   eax=edx=0x2977537;   eax<<=4;   eax+=edx;   ebx+=eax;   ebx+=0x13a3d4;   ebx^=0x59ed8d;   ebx^=0xC47324;   m_Vedit2.Format("%lu",ebx);   m_Ctrledit2.SetWindowText(m_Vedit2);      } --------------------------------------------------------------------------------
 
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整,并表明BCG字样,谢谢!
--------------------------------------------------------------------------------
【总结】注册成功后,该软件显示为注册版本,可是还是没有将菜单中的灰极按钮变亮,有兴趣的网友可以帮忙解决一下。
    由于本人水平有限,不足之处还请批评指正!
--------------------------------------------------------------------------------