题目:Easy CD Ripper的注册码(菜鸟级)
软件名称:Easy CD Ripper 1.41
文件大小:3949K
使用平台:Win9x/NT/2000/XP
最新版本:1.41
软件简介:
    Easy CD Ripper可将CD音乐及WAV直接转换成MP3、WMA、VQF格式的工具,采用全新快速的MP3编码(LAME 

v3.89)、支持CDDB、且使用上相当简单快速。在注册之前,只可以解压缩20首歌曲,而且每个文件只可以解码出

70%来。

破解目的:找出注册码
工具:TRW,PEID

引子:这几天碰到几个软件是用Asprotect压缩的,才网上找到的工具无法正确解压缩,用Casper也无法解压缩,

不知什么缘故?是不是解压出来的文件的Import表破坏了啊?现在正在学习如何手工脱壳,偶尔找出几个小软件练

手吧,也排解一下烦恼。这不找了一个Easy CD Ripper(CD音乐分割器2002电脑报合订本),用PEID一看是用

Petite2.x加壳了,用prodump没有成功去壳,运行出现错误。我只好用动态跟踪来解决了。运行软件,出现注册窗

口,输入你的大名和假注册码。比如wanggang,78787878。Ctrl+N调出TRW,下bpx hmemcpy断点,F5退出TRW,

然后点击OK按钮,被拦住,bd*禁止断点,F12按7次来到主程序空间。如下代码处,按F10继续跟踪:

0167:00428972 894304           MOV      [EBX+04],EAX
0167:00428975 8BD3             MOV      EDX,EBX
0167:00428977 8BC6             MOV      EAX,ESI
0167:00428979 E872B10000       CALL     00433AF0
0167:0042897E 5E               POP      ESI         //我们停在这里,F10继续跟踪下去
0167:0042897F 5B               POP      EBX
0167:00428980 C3               RET     
==================================================
0167:00430E4B 8955F0           MOV      [EBP-10],EDX
0167:00430E4E 894DF4           MOV      [EBP-0C],ECX
0167:00430E51 8B5508           MOV      EDX,[EBP+08]
0167:00430E54 8955F8           MOV      [EBP-08],EDX
0167:00430E57 33D2             XOR      EDX,EDX
0167:00430E59 8955FC           MOV      [EBP-04],EDX
0167:00430E5C 85C0             TEST     EAX,EAX
0167:00430E5E 740B             JZ       00430E6B
0167:00430E60 8D55F0           LEA      EDX,[EBP-10]
0167:00430E63 8BD8             MOV      EBX,EAX
0167:00430E65 8B432C           MOV      EAX,[EBX+2C]  //注册码长度送EAX
0167:00430E68 FF5328           CALL     NEAR [EBX+28] //把用户名拷贝到另一个地方去。
0167:00430E6B 8B45FC           MOV      EAX,[EBP-04]
0167:00430E6E 5B               POP      EBX
0167:00430E6F 8BE5             MOV      ESP,EBP
0167:00430E71 5D               POP      EBP
0167:00430E72 C20400           RET      04
==================================================
下面这段把用户名复制到另一个地方去。
0167:00484AF9 8B45F8           MOV      EAX,[EBP-08]
0167:00484AFC 8A00             MOV      AL,[EAX]
0167:00484AFE 8803             MOV      [EBX],AL
0167:00484B00 8B45F8           MOV      EAX,[EBP-08]
0167:00484B03 8A4001           MOV      AL,[EAX+01]
。。。省略多行
0167:00484B2A 884305           MOV      [EBX+05],AL
0167:00484B2D 8B45F8           MOV      EAX,[EBP-08]
0167:00484B30 8A4006           MOV      AL,[EAX+06]
0167:00484B33 884306           MOV      [EBX+06],AL
0167:00484B36 8B45F8           MOV      EAX,[EBP-08]
0167:00484B39 8A4007           MOV      AL,[EAX+07]
0167:00484B3C 884307           MOV      [EBX+07],AL
0167:00484B3F 8D55F4           LEA      EDX,[EBP-0C]
0167:00484B42 8B45FC           MOV      EAX,[EBP-04]
0167:00484B45 8B80F0020000     MOV      EAX,[EAX+02F0]
0167:00484B4B E850B3FAFF       CALL     0042FEA0
0167:00484B50 8B45F4           MOV      EAX,[EBP-0C]
0167:00484B53 E8C03CF8FF       CALL     00408818     //此CALL是关键函数。
==================================================
F8跟入484B53处的CALL,代码如下:
0167:0040881D 8BD8             MOV      EBX,EAX
0167:0040881F 8BD4             MOV      EDX,ESP
0167:00408821 8BC3             MOV      EAX,EBX
0167:00408823 E810A3FFFF       CALL     00402B38     //此CALL测试注册码第一位是否是20h,2Dh,2Bh,

第二位是否是78h,58h。
0167:00408828 8BF0             MOV      ESI,EAX
0167:0040882A 833C2400         CMP      DWORD [ESP],BYTE +00
0167:0040882E 7419             JZ       00408849
==================================================
F8跟入408823处的CALL,代码如下:
0167:00402B38 53               PUSH     EBX
0167:00402B39 56               PUSH     ESI
0167:00402B3A 57               PUSH     EDI
0167:00402B3B 89C6             MOV      ESI,EAX
0167:00402B3D 50               PUSH     EAX
0167:00402B3E 85C0             TEST     EAX,EAX
0167:00402B40 7473             JZ       00402BB5
0167:00402B42 31C0             XOR      EAX,EAX
0167:00402B44 31DB             XOR      EBX,EBX
0167:00402B46 BFCCCCCC0C       MOV      EDI,0CCCCCCC   //这个值在后面用来比较。
*
*省略多行
*
0167:00402B69 80FB58           CMP      BL,58
0167:00402B6C 745C             JZ       00402BCA
0167:00402B6E 80FB30           CMP      BL,30
0167:00402B71 7513             JNZ      00402B86      //注册码不为0则跳走
0167:00402B73 8A1E             MOV      BL,[ESI]
0167:00402B75 46               INC      ESI
0167:00402B76 80FB78           CMP      BL,78
0167:00402B79 744F             JZ       00402BCA
0167:00402B7B 80FB58           CMP      BL,58
0167:00402B7E 744A             JZ       00402BCA
0167:00402B80 84DB             TEST     BL,BL
0167:00402B82 7420             JZ       00402BA4
0167:00402B84 EB04             JMP      SHORT 00402B8A
0167:00402B86 84DB             TEST     BL,BL 
0167:00402B88 7434             JZ       00402BBE
0167:00402B8A 80EB30           SUB      BL,30         //注册码减30h变为16进制数
0167:00402B8D 80FB09           CMP      BL,09         //与9比较
0167:00402B90 772C             JA       00402BBE      //大于9则错。
0167:00402B92 39F8             CMP      EAX,EDI       //与EDI里面的值比较
0167:00402B94 7728             JA       00402BBE      //如果大于则错
0167:00402B96 8D0480           LEA      EAX,[EAX+EAX*4]  //EAX=5*EAX
0167:00402B99 01C0             ADD      EAX,EAX       //EAX=2*EAX (这2句相当于EAX乘10倍)
0167:00402B9B 01D8             ADD      EAX,EBX       //把各位注册码累加起来
0167:00402B9D 8A1E             MOV      BL,[ESI]      //继续取下位注册码
0167:00402B9F 46               INC      ESI
==================================================
0167:00484B58 8BD8             MOV      EBX,EAX       //EAX保存的累加和送EBX
0167:00484B5A 33C0             XOR      EAX,EAX
0167:00484B5C 5A               POP      EDX
0167:00484B5D 59               POP      ECX
0167:00484B5E 59               POP      ECX
0167:00484B5F 648910           MOV      [FS:EAX],EDX
0167:00484B62 EB0C             JMP      SHORT 00484B70 
0167:00484B64 E943E7F7FF       JMP      004032AC
0167:00484B69 33DB             XOR      EBX,EBX
0167:00484B6B E898EAF7FF       CALL     00403608
0167:00484B70 6A00             PUSH     BYTE +00
0167:00484B72 6A00             PUSH     BYTE +00
0167:00484B74 6893810000       PUSH     DWORD 8193
0167:00484B79 8B45FC           MOV      EAX,[EBP-04]
0167:00484B7C E8F713FBFF       CALL     00435F78
0167:00484B81 50               PUSH     EAX
0167:00484B82 E84D26F8FF       CALL     `USER32!SendMessageA`
0167:00484B87 A1002E4900       MOV      EAX,[00492E00]
0167:00484B8C 33D2             XOR      EDX,EDX
0167:00484B8E 52               PUSH     EDX
0167:00484B8F 50               PUSH     EAX
0167:00484B90 8BC3             MOV      EAX,EBX         //累加和送EAX
0167:00484B92 99               CDQ                      //扩充到EDX
0167:00484B93 3B542404         CMP      EDX,[ESP+04] 
0167:00484B97 7503             JNZ      00484B9C         //此处不能跳
0167:00484B99 3B0424           CMP      EAX,[ESP]       //真注册码值与假注册码累加和比较,D ESP

见16进制的真码1004Ah
0167:00484B9C 5A               POP      EDX
0167:00484B9D 58               POP      EAX
0167:00484B9E 0F850A010000     JNZ      NEAR 00484CAE    //此处跳走则OVER,关键。
0167:00484BA4 813D002E4900E803+CMP      DWORD [00492E00],03E8
0167:00484BAE 0F86FA000000     JNA      NEAR 00484CAE    //此处跳走也没戏。
0167:00484BB4 6A10             PUSH     BYTE +10
0167:00484BB6 8D45F0           LEA      EAX,[EBP-10]
0167:00484BB9 50               PUSH     EAX
0167:00484BBA 8B1594194900     MOV      EDX,[00491994]
*
*省略多行,向注册表内写入好多内容。
*
0167:00484C7E 50               PUSH     EAX
0167:00484C7F 68D84D4800       PUSH     DWORD 00484DD8
0167:00484C84 6A00             PUSH     BYTE +00
0167:00484C86 E835A2FCFF       CALL     `SHELL32!ShellExecuteA`
0167:00484C8B A100194900       MOV      EAX,[00491900]
0167:00484C90 C70003000000     MOV      DWORD [EAX],03
0167:00484C96 6A00             PUSH     BYTE +00
0167:00484C98 6A00             PUSH     BYTE +00
0167:00484C9A 6A10             PUSH     BYTE +10
0167:00484C9C A1081C4900       MOV      EAX,[00491C08]
0167:00484CA1 8B00             MOV      EAX,[EAX]
0167:00484CA3 8B4024           MOV      EAX,[EAX+24]
0167:00484CA6 50               PUSH     EAX
0167:00484CA7 E8C024F8FF       CALL     `USER32!PostMessageA`   //此处显示注册成功提示框
0167:00484CAC EB60             JMP      SHORT 00484D0E          //此处通往光明!
0167:00484CAE 6A30             PUSH     BYTE +30 
0167:00484CB0 8D45E4           LEA      EAX,[EBP-1C]
*
*省略多行,为game over 准备材料
*
0167:00484D01 A1081C4900       MOV      EAX,[00491C08]
0167:00484D06 8B00             MOV      EAX,[EAX]
0167:00484D08 59               POP      ECX
0167:00484D09 E82691FCFF       CALL     0044DE34               //此处显示失败提示框!
==================================================

后记:
这个小程序我用了很短时间就找到注册码了,输入后显示成功注册。可是就是因为注册成功了,我也后悔了,因为

我没有把代码保存下来,无论我怎么卸载重新安装,这个软件都告诉你已经注册过的了,我FAINT了。我用REGSNAP

看了一下,也没有什么线索,不知这个软件在哪里记下了暗号了。真是滑稽!我上面的代码是通过操作一个功能,

出现对话框后,我在TRW下消息断点才进入程序的,然后U出来的。SOFTICE的u命令不如TRW的,SOFTICE的这个U命

令无法保存代码。
看来现在到了该学习如何脱壳的时候了,真是水到自然成。现在的软件都很邪门的,都采取了各种保护措施,不会

脱壳可是没的混了。:)希望各位大侠多写点这方面的文章供菜鸟学习。真是如饥似渴啊!!

感谢您花费宝贵时间阅读,让你见笑了!
总结:

Username: wanggang
Registercode: 65610 (注册码是1004A的十进制数。)


QduWg
qduwg@163.com
2006年1月8日完成