-
-
ImTOO DVD Ripper 2.0.52.630_分析
-
发表于:
2005-7-3 13:55
8161
-
ImTOO DVD Ripper 2.0.52.630_分析
【破文标题】ImTOO DVD Ripper 2.0.52.630_分析
【破文作者】sailor
【软件名称】ImTOO DVD Ripper
【破解工具】OD等
【破解难度】简单
----------------------------------------------------
软件介绍:
ImTOO DVD Ripper
有更多的功能设定,以及更方便简单的软件操作接口,能够将 DVD 影片光盘转换成 VCD、SVCD、DivX、MPEG、AVI。
功能方面,除了可以将 DVD 影片转换成高压缩比的高品质 DivX 编码的 AVI 影片外,还可以选择字幕语言或者无字幕、设定转出影片档的分片大小、设定影片为 PAL 或 NTSC 协议、选择音轨音量/频率/杜比环绕效果。
----------------------------------------------------
破解声名:
----------------------------------------------------
【破解分析】
无壳
1
、找注册失败的地方
0040A51B . 83F8 27
CMP EAX,27
; 比较注册码是否有27h位,不是必死
0040A51E . 0F85 D6050000
JNZ vconvert.0040AAFA
0040A524 . 68 D8BA4900
PUSH vconvert.0049BAD8
; ASCII "DVD Ripper"0040AAFA > 8D47 F0
LEA EAX,
DWORD PTR DS:[
EDI-10]
; 试炼码没有27h位的话,到这里,下去后死
0040AAFD . C68424 C4000000>
MOV BYTE PTR SS:[
ESP+C4],1
0040AB05 . 8D48 0C
LEA ECX,
DWORD PTR DS:[
EAX+C]
0040AB08 . 8BD6
MOV EDX,
ESI
0040AB0A . F0:0FC111
LOCK XADD DWORD PTR DS:[
ECX],
EDX ; LOCK 前缀
0040AB0E . 4A
DEC EDX
0040AB0F . 85D2
TEST EDX,
EDX
0040AB11 . 7F 08
JG SHORT vconvert.0040AB1B
0040AB13 . 8B08
MOV ECX,
DWORD PTR DS:[
EAX]
0040AB15 . 8B11
MOV EDX,
DWORD PTR DS:[
ECX]
0040AB17 . 50
PUSH EAX
0040AB18 . FF52 04
CALL DWORD PTR DS:[
EDX+4]
0040AB1B > 8B4424 1C
MOV EAX,
DWORD PTR SS:[
ESP+1C]
0040AB1F . 83C0 F0
ADD EAX,-10
0040AB22 . C68424 C4000000>
MOV BYTE PTR SS:[
ESP+C4],0
0040AB2A . 8D48 0C
LEA ECX,
DWORD PTR DS:[
EAX+C]
0040AB2D . 8BD6
MOV EDX,
ESI
0040AB2F . F0:0FC111
LOCK XADD DWORD PTR DS:[
ECX],
EDX ; LOCK 前缀
0040AB33 . 4A
DEC EDX
0040AB34 . 85D2
TEST EDX,
EDX
0040AB36 . 7F 08
JG SHORT vconvert.0040AB40
0040AB38 . 8B08
MOV ECX,
DWORD PTR DS:[
EAX]
0040AB3A . 8B11
MOV EDX,
DWORD PTR DS:[
ECX]
0040AB3C . 50
PUSH EAX
0040AB3D . FF52 04
CALL DWORD PTR DS:[
EDX+4]
0040AB40 > 8D45 F0
LEA EAX,
DWORD PTR SS:[
EBP-10]
0040AB43 . 89B424 C4000000
MOV DWORD PTR SS:[
ESP+C4],
ESI
0040AB4A . 8D48 0C
LEA ECX,
DWORD PTR DS:[
EAX+C]
0040AB4D . F0:0FC131
LOCK XADD DWORD PTR DS:[
ECX],
ESI ; LOCK 前缀
0040AB51 . 4E
DEC ESI
0040AB52 . 85F6
TEST ESI,
ESI
0040AB54 . 7F 08
JG SHORT vconvert.0040AB5E
0040AB56 . 8B08
MOV ECX,
DWORD PTR DS:[
EAX]
0040AB58 . 8B11
MOV EDX,
DWORD PTR DS:[
ECX]
0040AB5A . 50
PUSH EAX
0040AB5B . FF52 04
CALL DWORD PTR DS:[
EDX+4]
0040AB5E > 33C0
XOR EAX,
EAX ; 注册失败标志
0040AB60 > 8B8C24 BC000000
MOV ECX,
DWORD PTR SS:[
ESP+BC]
0040AB67 . 5F
POP EDI2
、输入27h位试炼码后,一直走,好久,到了注册码比较的地方
0040A96A . E8 71E8FFFF
CALL vconvert.004091E0
0040A96F . 8B7C24 20
MOV EDI,
DWORD PTR SS:[
ESP+20]
; edi=098765432109876543210987654321098765432
0040A973 . 8B7424 10
MOV ESI,
DWORD PTR SS:[
ESP+10]
; esi=098765432109876543218FA8-A380-36Bf-233A
0040A977 . 57
PUSH EDI
0040A978 . 56
PUSH ESI
0040A979 . E8 74B30600
CALL vconvert.00475CF2
; 比较试炼码和注册码
0040A97E . 83C4 08
ADD ESP,8
0040A981 . F7D8
NEG EAX
0040A983 . 1AC0
SBB AL,
AL
0040A985 . FEC0
INC AL
0040A987 . 0FB6D8
MOVZX EBX,
AL ; 是否成功标志
0040A98A . 8B4424 38
MOV EAX,
DWORD PTR SS:[
ESP+38]
注册码与试炼码前20位是一样的,后面19位有变化
往前找到内存中第一次出现类似8FA8-A380-36Bf-233A的地方
3
、往前来到了
0040A7D0 . 8D8C24 84000000
LEA ECX,
DWORD PTR SS:[
ESP+84]
0040A7D7 . E8 B4F10500
CALL vconvert.00469990
; 重点,关键
0040A7DC . 8D8C24 80000000
LEA ECX,
DWORD PTR SS:[
ESP+80]
0040A7E3 . C68424 C4000000>
MOV BYTE PTR SS:[
ESP+C4],0D
0040A7EB . E8 F0F00500
CALL vconvert.004698E0
; eax=85f8af80a53180043c69bcf1283c3eac
0040A7F0 . 50
PUSH EAX ; 取出奇数位,再加上-,就是注册码了
0040A7F1 . 8D4C24 3C
LEA ECX,
DWORD PTR SS:[
ESP+3C]
; 即8fa8a38036bf233a,再转为大写,再4位一组
0040A7F5 . E8 0677FFFF
CALL vconvert.00401F00
; 因此该CALL是关键(进去后发现不是)
0040A7FA . 8D4C24 10
LEA ECX,
DWORD PTR SS:[
ESP+10]
; 观察内存变化情况,发现前面那个CALL才是关键
0040A7FE . C68424 C4000000>
MOV BYTE PTR SS:[
ESP+C4],0E
4
、同样原则,最终进入了关键计算处
004699FE |. 8D7424 14
LEA ESI,
DWORD PTR SS:[
ESP+14]
00469A02 |. BF 10000000
MOV EDI,10
00469A07 |> 0FB659 FF
MOVZX EBX,
BYTE PTR DS:[
ECX-1]
; [ecx-2]=31 44 01 44 03 52 05 70 07 65 09 56 02 20 04 69 06 70 08 72 0A
00469A0B |. 33D2
XOR EDX,
EDX ; [ecx-1]=D1D3R5p7e9V2 4i6p8rA
00469A0D |. 8A71 01
MOV DH,
BYTE PTR DS:[
ECX+1]
00469A10 |. 83C6 04
ADD ESI,4
00469A13 |. 83C1 04
ADD ECX,4
00469A16 |. 8A51 FC
MOV DL,
BYTE PTR DS:[
ECX-4]
00469A19 |. C1E2 08
SHL EDX,8
00469A1C |. 0BD3
OR EDX,
EBX
00469A1E |. 0FB659 FA
MOVZX EBX,
BYTE PTR DS:[
ECX-6]
00469A22 |. C1E2 08
SHL EDX,8
00469A25 |. 0BD3
OR EDX,
EBX
00469A27 |. 4F
DEC EDI
00469A28 |. 8956 FC
MOV DWORD PTR DS:[
ESI-4],
EDX
00469A2B |.^ 75 DA
JNZ SHORT vconvert.00469A07
; 下面开始计算注册码,参与计算的字符串由前20位试炼码与两个固定的字符串合成string1
00469A2D |. 8B70 04
MOV ESI,
DWORD PTR DS:[
EAX+4]
; [eax]=01 23 45 67 89 AB CD EF FE DC BA 98 76 54 32 10
00469A30 |. 8B78 08
MOV EDI,
DWORD PTR DS:[
EAX+8]
00469A33 |. 8B50 0C
MOV EDX,
DWORD PTR DS:[
EAX+C]
00469A36 |. 8B00
MOV EAX,
DWORD PTR DS:[
EAX]
00469A38 |. 8B6C24 14
MOV EBP,
DWORD PTR SS:[
ESP+14]
/************************************************************/
省略近800条语句,其中没有另外调用任何函数
没错,吓死人。这么长!
不知是作者故意放有一部分垃圾代码还是其它原因,或真的有用
搞得这么“复杂”,却用了个明码比较:(
写注册机用其它语言,可够你累的
用汇编来写,轻松点
加上我自己的垃圾代码,竟然有1000多行,倒
挺佩服自己的,“开发”了一个这么复杂的“产品”
狂吐
/************************************************************/
0046A28B |. 33F2
XOR ESI,
EDX
0046A28D |. 03F3
ADD ESI,
EBX
0046A28F |. 8D8C31 91D386EB
LEA ECX,
DWORD PTR DS:[
ECX+
ESI+EB86D391]
0046A296 |. 8B7424 58
MOV ESI,
DWORD PTR SS:[
ESP+58]
0046A29A |. 8B1E
MOV EBX,
DWORD PTR DS:[
ESI]
0046A29C |. 03C3
ADD EAX,
EBX ; 注册码第一部分
0046A29E |. 8906
MOV DWORD PTR DS:[
ESI],
EAX
0046A2A0 |. 8BC1
MOV EAX,
ECX
0046A2A2 |. 8B5E 04
MOV EBX,
DWORD PTR DS:[
ESI+4]
0046A2A5 |. C1E0 15
SHL EAX,15
0046A2A8 |. C1E9 0B
SHR ECX,0B
0046A2AB |. 0BC1
OR EAX,
ECX
0046A2AD |. 03C3
ADD EAX,
EBX
0046A2AF |. 03C7
ADD EAX,
EDI ; 注册码第二部分
0046A2B1 |. 8946 04
MOV DWORD PTR DS:[
ESI+4],
EAX
0046A2B4 |. 8B46 08
MOV EAX,
DWORD PTR DS:[
ESI+8]
0046A2B7 |. 03C7
ADD EAX,
EDI
0046A2B9 |. 8946 08
MOV DWORD PTR DS:[
ESI+8],
EAX ; 注册码第三部分
0046A2BC |. 8B46 0C
MOV EAX,
DWORD PTR DS:[
ESI+C]
0046A2BF |. 5F
POP EDI
0046A2C0 |. 03C2
ADD EAX,
EDX ; 注册码第四部分
0046A2C2 |. 8946 0C
MOV DWORD PTR DS:[
ESI+C],
EAX
0046A2C5 |. 5E
POP ESI
0046A2C6 |. 5D
POP EBP
0046A2C7 |. 5B
POP EBX
0046A2C8 |. 83C4 44
ADD ESP,44
0046A2CB \. C3
RETN
string1
的内容
00126D2C 31 44 01 44 03 52 05 70 07 65 09 56 02 20 04 69 1DDRpe.V i
00126D3C 06 70 08 72 0A 30 30 30 39 38 37 36 35 34 33 32 pr.00098765432
00126D4C 31 30 39 38 37 36 35 34 33 32 31 44 56 44 20 52 10987654321DVD R
00126D5C 69 70 70 65 72 80 00 00 A8 01 00 00 00 00 00 00 ipper
?.?......----------------------------------------------------
【总结】
注册码生成过程
1
、注册码必须是27h(39)位
2
、注册码与用户名无关
3
、由任意前20位与DVD Ripper等组成字符串,再与0123456789ABCDEFFEDCBA9876543210计算出32位
4
、取32位中的奇数位,分成4组,再用-连接,组成19位
5
、加上试炼码20位,组成39位的注册码
----------------------------------------------------
【版权信息】
本代码的着色效果由xTiNt自动完成
[课程]Android-CTF解题方法汇总!