题 目: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
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课