题    目:MP3 CD Converter 3.02 注册码破解
软件来源:电脑报2002光盘
软件名称:MP3 CD Converter 3.02 
软件授权: 共享软件
使用限制: 注册之前,只可以刻录10个音轨(即10个文件)。
文件大小: 1643 KB
使用平台: Win9x/NT/2000/XP
软件描述:
    德国人开发的这个软件,注册费$19.9。MP3 CD Converter 仅需几次简单的点击就能将您钟爱的 MP3 乐曲烧录成极具个

性化的 CD 唱片!您可以在家里、汽车立体声环境中或是使用便携式 CD 播放器来享受它们。通过其内置的漂亮的迷你播放器

,您可在烧录之前对音轨进行测试,以确保将真正好品质的音轨烧录到 CD-R 中。该软件支持好多种语言,包括中日英等。

破解目的:找出注册码(但是其注册码算法非常复杂,但是最后是明码比较:))
工    具:TRW,PEID足矣
引子:
    今天看到电脑报2002光盘上这个小软件,安装完毕,立即启动,显示注册提示窗口,那就“注册”吧!首先用PEID查看是

否带壳,结果没有加壳,是VC开发的。这就比较好办了。在窗口内输入用户名wanggang及注册码7878787878。CTRL+N唤出TRW

,下断点bpx hmemcpy,F5退出TRW,点击Register按钮,被断下。按大约24次F12,换F10慢慢跟踪,来到如下代码处。

0042C6F1   56               PUSH ESI
0042C6F2   68 22040000      PUSH 422
0042C6F7   57               PUSH EDI
0042C6F8   E8 777B0300      CALL <JMP.&MFC42.#2370>   //此CALL取用户名
0042C6FD   5F               POP EDI       //D ecx看到用户名
0042C6FE   5E               POP ESI
0042C6FF   C2 0400          RETN 4        //这个返回指令会返回到Kernel继续读注册码
执行完读取注册码的流程到了下面这里:
0042C73A   56               PUSH ESI
0042C73B   BB 01000000      MOV EBX,1
0042C740   57               PUSH EDI
0042C741   8BE9             MOV EBP,ECX
0042C743   53               PUSH EBX
0042C744   E8 357D0300      CALL <JMP.&MFC42.#6334> 
0042C749   85C0             TEST EAX,EAX
0042C74B   75 22            JNZ SHORT MP3CDCON.0042C76F    //注册码不空则OK。
============================================================
继续到下面:
0042C76F   8B85 E4000000    MOV EAX,DWORD PTR SS:[EBP+E4]
0042C775   8DBD E4000000    LEA EDI,DWORD PTR SS:[EBP+E4]   //用户名地址送EDI
0042C77B   8B40 F8          MOV EAX,DWORD PTR DS:[EAX-8]    //用户名长度送EAX
0042C77E   85C0             TEST EAX,EAX      //长度不为0,则OK。
0042C780   75 2A            JNZ SHORT MP3CDCON.0042C7AC     //跳转到下面
*省去多行(如果用户名为空,则执行game over的指令)
0042C7AC   8B8D E0000000    MOV ECX,DWORD PTR SS:[EBP+E0]   //输入注册码的地址送ECX。
0042C7B2   8DB5 E0000000    LEA ESI,DWORD PTR SS:[EBP+E0]
0042C7B8   8B41 F8          MOV EAX,DWORD PTR DS:[ECX-8]    //注册码长度送EAX。
0042C7BB   85C0             TEST EAX,EAX   //测试是否为0。
0042C7BD   75 2D            JNZ SHORT MP3CDCON.0042C7EC     //不为0则继续。
*省去多行(如果注册码为空,则执行game over的指令)
0042C7EC   8D4C24 10        LEA ECX,DWORD PTR SS:[ESP+10]
0042C7F0   E8 59790300      CALL <JMP.&MFC42.#540>  
0042C7F5   8D4C24 14        LEA ECX,DWORD PTR SS:[ESP+14]
0042C7F9   C74424 24 000000>MOV DWORD PTR SS:[ESP+24],0
0042C801   E8 48790300      CALL <JMP.&MFC42.#540>
0042C806   51               PUSH ECX
0042C807   885C24 28        MOV BYTE PTR SS:[ESP+28],BL
0042C80B   8BCC             MOV ECX,ESP
0042C80D   896424 1C        MOV DWORD PTR SS:[ESP+1C],ESP
0042C811   57               PUSH EDI
0042C812   E8 8F7B0300      CALL <JMP.&MFC42.#535>
0042C817   8D5424 1C        LEA EDX,DWORD PTR SS:[ESP+1C]
0042C81B   52               PUSH EDX
0042C81C   E8 1FF6FFFF      CALL MP3CDCON.0042BE40 //经过观察,这个函数值得怀疑,F8跟入。因为其他的CALL都是

调用MFC库函数,没有必要跟踪。这个地方必须得跟进去看看到底怎么得到注册码的。
0042C821   83C4 08          ADD ESP,8
0042C824   50               PUSH EAX
0042C825   8D4C24 14        LEA ECX,DWORD PTR SS:[ESP+14]
0042C829   C64424 28 02     MOV BYTE PTR SS:[ESP+28],2
0042C82E   E8 03790300      CALL <JMP.&MFC42.#858>
0042C833   8D4C24 18        LEA ECX,DWORD PTR SS:[ESP+18]
0042C837   885C24 24        MOV BYTE PTR SS:[ESP+24],BL
0042C83B   E8 F0780300      CALL <JMP.&MFC42.#800>
0042C840   8B06             MOV EAX,DWORD PTR DS:[ESI]   
0042C842   50               PUSH EAX                         //假码地址, D EAX可以看到
0042C843   8B4424 14        MOV EAX,DWORD PTR SS:[ESP+14] 
0042C847   50               PUSH EAX                         //真码地址, D EAX可以看到
0042C848   FF15 D8B84600    CALL DWORD PTR DS:[<&MSVCRT._mbscmp>] //真假注册码对比函数,在MFC库内比较的。

可以F8跟入看看怎么比较的。
0042C84E   83C4 08          ADD ESP,8
0042C851   85C0             TEST EAX,EAX                      //如果返回是0,则OK。
0042C853   74 42            JE SHORT MP3CDCON.0042C897        //跳往光明!
0042C855   6A 40            PUSH 40
0042C857   68 94000000      PUSH 94
0042C85C   E8 8F090000      CALL MP3CDCON.0042D1F0             //执行这个CALL则over!
============================================================
我们跟进0042C81C处的 CALL MP3CDCON.0042BE40,代码如下:
*省去多行
0042BE65   B9 0D000000      MOV ECX,0D      //需要复制的双字数目
0042BE6A   BE F8E54800      MOV ESI,MP3CDCON.0048E5F8  //密码表地址送ESI
0042BE6F   8DBC24 AC000000  LEA EDI,DWORD PTR SS:[ESP+AC]  //目的地址送EDI 
0042BE76   8B8424 00020000  MOV EAX,DWORD PTR SS:[ESP+200]
0042BE7D   F3:A5            REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]   //复制D个双字到目的地址
0042BE7F   A4               MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0042BE80   B9 0D000000      MOV ECX,0D   //需要复制的双字数目
0042BE85   BE C4E54800      MOV ESI,MP3CDCON.0048E5C4
0042BE8A   8D7C24 78        LEA EDI,DWORD PTR SS:[ESP+78]
0042BE8E   6A 64            PUSH 64
0042BE90   F3:A5            REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]  //复制另外一段密码表到目的地址


0042BE92   B9 0F000000      MOV ECX,0F     //需要复制的双字数目
0042BE97   BE 84E54800      MOV ESI,MP3CDCON.0048E584
0042BE9C   8DBC24 E8000000  LEA EDI,DWORD PTR SS:[ESP+E8]
0042BEA3   8B68 F8          MOV EBP,DWORD PTR DS:[EAX-8]
0042BEA6   F3:A5            REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] //复制另外一段密码表到目的地址


0042BEA8   66:A5            MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]
0042BEAA   A4               MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0042BEAB   B9 19000000      MOV ECX,19    //需要复制的双字数目
0042BEB0   33C0             XOR EAX,EAX
0042BEB2   8DBC24 28010000  LEA EDI,DWORD PTR SS:[ESP+128]
0042BEB9   C78424 F8010000 >MOV DWORD PTR SS:[ESP+1F8],1
0042BEC4   F3:AB            REP STOS DWORD PTR ES:[EDI]        //复制另外一段密码表到目的地址。
0042BEC6   8D8C24 04020000  LEA ECX,DWORD PTR SS:[ESP+204]
0042BECD   E8 20840300      CALL <JMP.&MFC42.#2915>            //复制用户名到ECX指定的地址处
0042BED2   8BCD             MOV ECX,EBP
0042BED4   8BF0             MOV ESI,EAX
0042BED6   8BD1             MOV EDX,ECX
0042BED8   8D7C24 78        LEA EDI,DWORD PTR SS:[ESP+78]      //密码表地址送EDI
0042BEDC   C1E9 02          SHR ECX,2
0042BEDF   F3:A5            REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]  //复制用户名到目的地址去。
0042BEE1   8BCA             MOV ECX,EDX
0042BEE3   83E1 03          AND ECX,3
0042BEE6   83FD 08          CMP EBP,8
0042BEE9   F3:A4            REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0042BEEB   7F 27            JG SHORT MP3CDCON.0042BF14
0042BEED   6A 64            PUSH 64
0042BEEF   8D8C24 04020000  LEA ECX,DWORD PTR SS:[ESP+204]    
0042BEF6   E8 F7830300      CALL <JMP.&MFC42.#2915>
0042BEFB   8BCD             MOV ECX,EBP
0042BEFD   8BF0             MOV ESI,EAX
0042BEFF   8BC1             MOV EAX,ECX
0042BF01   8DBC24 81000000  LEA EDI,DWORD PTR SS:[ESP+81]
0042BF08   C1E9 02          SHR ECX,2
0042BF0B   F3:A5            REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] //再次复制用户名到新地址去。
0042BF0D   8BC8             MOV ECX,EAX
0042BF0F   83E1 03          AND ECX,3
0042BF12   F3:A4            REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]
0042BF14   8BC5             MOV EAX,EBP
0042BF16   99               CDQ
0042BF17   83E2 07          AND EDX,7
0042BF1A   03C2             ADD EAX,EDX
0042BF1C   8BF0             MOV ESI,EAX
0042BF1E   C1FE 03          SAR ESI,3
0042BF21   46               INC ESI
0042BF22   83FE 01          CMP ESI,1
0042BF25   75 05            JNZ SHORT MP3CDCON.0042BF2C
0042BF27   BE 02000000      MOV ESI,2
0042BF2C   33FF             XOR EDI,EDI
0042BF2E   3BF3             CMP ESI,EBX
0042BF30   7E 22            JLE SHORT MP3CDCON.0042BF54
0042BF32   8D8CFC 24010000  LEA ECX,DWORD PTR SS:[ESP+EDI*8+124] //密码表第一段地址送ECX
0042BF39   8D94FC AC000000  LEA EDX,DWORD PTR SS:[ESP+EDI*8+AC]  //密码表第二段地址送EDX
0042BF40   51               PUSH ECX
0042BF41   8D44FC 7C        LEA EAX,DWORD PTR SS:[ESP+EDI*8+7C]
0042BF45   52               PUSH EDX
0042BF46   50               PUSH EAX        //这些地址统统进栈。
0042BF47   E8 44E2FFFF      CALL MP3CDCON.0042A190     //此函数关键地方了。
0042BF4C   83C4 0C          ADD ESP,0C
============================================================
我们看看这个函数到底干什么用的?代码如下:
//开头省略7700多行代码,不知这位开发者什么心态?用了7700多行进行内存赋值操作,形成一个表格。
0042BFBD   8A5404 14        MOV DL,BYTE PTR SS:[ESP+EAX+14]   //一下这四行就是把才密码表抽
                                                                取的注册码对调位置
0042BFC1   8A4C04 19        MOV CL,BYTE PTR SS:[ESP+EAX+19]   // 1,6个位置对调,2,7对调,
                                                                 3,8对调,4,9对调,5,10对调。
0042BFC5   885404 19        MOV BYTE PTR SS:[ESP+EAX+19],DL   //注册码在开始时抽取的是16位的,可能由于我输

入的假码是10位的,所以他就给出了10位的,实际上你可以看到其他4位的。不过没有用到而已。
0042BFC9   884C04 14        MOV BYTE PTR SS:[ESP+EAX+14],CL
0042BFCD   40               INC EAX
0042BFCE   83F8 05          CMP EAX,5                         //检查是否为5,如果到了5次自然结束对调了。
0042BFD1  ^7C EA            JL SHORT MP3CDCON.0042BFBD        //循环到上面去。
0042BFD3   E8 F2860300      CALL <JMP.&MFC42.#1158>
*略去10多行无用代码
0042C014   5E               POP ESI
0042C015   5D               POP EBP
0042C016   5B               POP EBX
0042C017   64:890D 00000000 MOV DWORD PTR FS:[0],ECX
0042C01E   81C4 E8010000    ADD ESP,1E8
0042C024   C3               RETN
============================================================
后记:经过1个小时的跟踪,一个小时的写在终于又一篇破文面世了,希望能够给菜鸟带去一点点帮助。现在的软件许多都加壳

了,脱壳就是必须的步骤,但是许多软件的壳不好脱,修复IMPORT表也比较麻烦的。需要耐心和细心!我曾经为了手工脱壳,

追了一个软件一天时间,最后头都晕了!:)破解的确是比较累人的差事!我搞破解就是为了娱乐!我觉得跟下棋差不多,就

是跟软件博弈的过程!有可能打败它,也有可能暂时被打败!需要毅力啊!

这个软件为了保护它的成果,竟然用了7000多行造表,可是最后还是明码比较,所以才被轻松破获。不知他们怎么个想法。

^_*害的我跟踪了大半天,浪费我们的宝贵时间。
感谢您浪费时间阅读此文!感谢提出批评与建议!

Username:wanggang
Code:          6594205992

QduwG

qduwg@163.com(请勿向该邮箱发送超过500K的东西,谢谢。)

完成时间:2006/1/10 Ethiopia