Soundnailsd的破解教程(一)
这个软件是peterchen大哥推荐的,其实早就搞定了,由于近来事比较多,还有一个
重要的原因,那就是俺比较的懒嘛,所以教程现在这才写好....嘿嘿 *^_^*
下载地址:http://www.esoftware.com.cn/file/photo/animator/2001092101.shtml
简介 :
SWF 是 Macromedia Flash 的专属档案格式,它原是用来制作 Flash 动画时所产生的动画档;
而 MP3 是档案小、音极佳的多媒体音乐格式的代表。不过 MP3 并无法像 Flash 动画或串流多媒体格式,
直接在网络上播放,所以常常都只是透过 Internet 来传输档案,无法达到实时播放的功能,这是比较可惜的地方。
现在 Soundnails 能够以简单的步骤,将众多 MP3 档案轻易的批次转换为 SWF 档案,而且还能选择不同样板,输
出制式化的 HTML 网页,让网友直接在网页上播放音乐,这结合了 MP3 及 SWF 两者的优点,表现优异当然是可想而
知了。使用 Soundnails 的好处,是它并不需要先行安装 Macromedia Flash,而且要播放 SWF 档案也不需要安装其
它的音乐播放程序,只要选择想要转换的 MP3 档案,然后 step by step 的跟着做,就可以输出网页 HTML 组件,
然后再上传到 Web Server 中,网友就可以直接在网络上欣赏好听的音乐了。Soundnails 在制作 SWF 时,会自动抓出
MP3 的 ID3 Tag 信息,而呈现在所制作的 HTML 网页中 (或者也能在 Soundnails 中编辑 MP3 档案的 ID3 Tag);网
页上的播放按钮,内建有五组 Flash 动画可选择套用,而输出网页也有五套风格相异的网页样版可挑选。试用版有
30 天及一次处理只能 5 个 MP3 档案等功能限制。
先用wdasm32静态分析一下看看,略去了很多无关的代码
有兴趣的可以自己看一看.
代码如下:
:
:
:
:
:00457572 C605D8F0470000 mov byte ptr [0047F0D8],
00
:00457579 B890084800 mov eax,
00480890
:0045757E E801040000 call 00457984
--------->
:00457583 8BF0
mov esi, eax
:00457585 8D45C4
lea eax, dword ptr [ebp-3C]
:00457588 E8F7030000 call 00457984
---------->与上面的是同一个CALL.是个关键CALL
:0045758D 8BF8
mov edi, eax
:0045758F 3BF7
cmp esi, edi
:00457591 0F8DA1000000 jnl 00457638
:00457597 8BC7
mov eax, edi
:00457599 48
dec eax
:0045759A 7405
je 004575A1------>注意这个跳转和下面那个跳转,
这个跳转跳向 EASY Version
:0045759C 48
dec eax
:0045759D 741C
je 004575BB--->这个跳转跳向 PRO Version
:0045759F EB34
jmp 004575D5
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045759A(C)
|
:004575A1 6A00
push 00000000
* Possible StringData Ref from Code Obj ->"Registration"
|
:004575A3 B9A8764500 mov ecx,
004576A8
* Possible StringData Ref from Code Obj ->"EASY Version registered. Restart
" --->* *一个名字对应两个注册码,
->"Program to
activate Changes." 分别来对应 EASY Version
和下面
|
的 PRO Version
|
:004575A8 BAB8764500 mov edx,
004576B8
:004575AD A1E8F54700 mov eax,
dword ptr [0047F5E8]
:004575B2 8B00
mov eax, dword ptr [eax]
:004575B4 E8476FFFFF call 0044E500
:004575B9 EB32
jmp 004575ED
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0045759D(C)
|
:004575BB 6A00
push 00000000
* Possible StringData Ref from Code Obj ->"Registration"
|
:004575BD B9A8764500 mov ecx,
004576A8
* Possible StringData Ref from Code Obj ->"PRO Version registered. Restart "-->
* *
->"Program to
activate Changes."
|
:004575C2 BAF8764500 mov edx,
004576F8
:004575C7 A1E8F54700 mov eax,
dword ptr [0047F5E8]
:004575CC 8B00
mov eax, dword ptr [eax]
:004575CE E82D6FFFFF call 0044E500
:004575D3 EB18
jmp 004575ED
:
:
:
:(略去不少代码)
大体分析一下上面的代码,可断定:0045757E call 00457984 里面有注册码的算法及比较过程,那我们
就来动态跟踪分析一下这个call.用TRW2000.
(无关的代码没有作说明)
代码如下:
0167:00457984 PUSH EBP
0167:00457985 MOV EBP,ESP
0167:00457987 ADD ESP,BYTE -1C
0167:0045798A PUSH EBX
0167:0045798B PUSH ESI
0167:0045798C PUSH EDI
0167:0045798D XOR EDX,EDX
0167:0045798F MOV [EBP-14],EDX
0167:00457992 MOV [EBP-10],EDX
0167:00457995 MOV [EBP-0C],EDX
0167:00457998 MOV EBX,EAX
0167:0045799A XOR EAX,EAX
0167:0045799C PUSH EBP
0167:0045799D PUSH DWORD 00457B88
0167:004579A2 PUSH DWORD [FS:EAX]
0167:004579A5 MOV [FS:EAX],ESP
0167:004579A8 LEA EAX,[EBX+24]
0167:004579AB MOV EDX,00457BA0
0167:004579B0 CALL 00403BE0
0167:004579B5 XOR ESI,ESI
0167:004579B7 CMP DWORD [EBX],BYTE +00 ----->拿指向用户名的指针与00比较
0167:004579BA JZ 00457A1F
----->为0则跳转
0167:004579BC CMP DWORD [EBX+04],BYTE +00---->拿指向填的注册码指针与00比较
0167:004579C0 JZ 00457A1F
---->为0则跳转
0167:004579C2 MOV ECX,[EBX+08]
0167:004579C5 MOV EDX,[EBX]
0167:004579C7 LEA EAX,[EBP-0C]
0167:004579CA CALL 00403E58
0167:004579CF MOV EAX,[EBP-0C]
0167:004579D2 MOV EDX,[EBX+04]
0167:004579D5 CALL 00457320 ------------>关键call
0167:004579DA TEST AL,AL ------------->以AL为棋标
0167:004579DC JZ 00457A1F
0167:004579DE PUSH DWORD 00457BB0 ------->00457BB0指向"EASY
Version Registered for "
0167:004579E3 PUSH DWORD [EBX] ------->指向用户名的指针.下命令
D *EBX就可看到
0167:004579E5 PUSH DWORD 00457BD8
0167:004579EA PUSH DWORD 00457BE4
0167:004579EF PUSH DWORD 00457BF0 ------->00457BF0指向"
Serial#: "
0167:004579F4 PUSH DWORD [EBX+08]
0167:004579F7 LEA EAX,[EBX+24]
0167:004579FA MOV EDX,06
0167:004579FF CALL 00403ECC
0167:00457A04 MOV ESI,01
------>01送ESI. 这个值比较重要.
0167:00457A09 MOV EAX,[0047F0E4]
0167:00457A0E MOV [0047F0DC],EAX
0167:00457A13 MOV BYTE [0047F0D8],01
0167:00457A1A JMP 00457B6D
0167:00457A1F CMP DWORD [EBX],BYTE +00 ------>拿指向用户名的指针与00比较
0167:00457A22 JZ 00457A87
---->为0则跳转
0167:00457A24 CMP DWORD [EBX+04],BYTE +00---->拿指向填的注册码指针与00比较
0167:00457A28 JZ 00457A87
----->为0则跳转
0167:00457A2A MOV ECX,[EBX+08]
0167:00457A2D MOV EDX,[EBX]
0167:00457A2F LEA EAX,[EBP-10]
0167:00457A32 CALL 00403E58
0167:00457A37 MOV EAX,[EBP-10] ----------->eax指向填的用户名
0167:00457A3A MOV EDX,[EBX+04] ----------->edx指向所填的注册码
0167:00457A3D CALL 004573E0 ----------->关键call
0167:00457A42 TEST AL,AL
---------->以AL为棋标
0167:00457A44 JZ 00457A87
0167:00457A46 PUSH DWORD 00457C04------------>00457C04指向"PRO
Version Registered for "
0167:00457A4B PUSH DWORD [EBX] ----------->指向用户名的指针.下命令
D *EBX就可看到
0167:00457A4D PUSH DWORD 00457BD8
0167:00457A52 PUSH DWORD 00457BE4
0167:00457A57 PUSH DWORD 00457BF0 ------->00457BF0指向"
Serial#: "
0167:00457A5C PUSH DWORD [EBX+08]
0167:00457A5F LEA EAX,[EBX+24]
0167:00457A62 MOV EDX,06
0167:00457A67 CALL 00403ECC
0167:00457A6C MOV ESI,02
-------->02送ESI .这个值也比较重要.
0167:00457A71 MOV EAX,[0047F0E8]
0167:00457A76 MOV [0047F0DC],EAX
0167:00457A7B MOV BYTE [0047F0D8],01
0167:00457A82 JMP 00457B6D
: :
: :-->>(略去不少代码,主要是计算试用期剩余时间及时间计算的代码)
: :
: :
0167:00457B6D XOR EAX,EAX
0167:00457B6F POP EDX
0167:00457B70 POP ECX
0167:00457B71 POP ECX
0167:00457B72 MOV [FS:EAX],EDX
0167:00457B75 PUSH DWORD 00457B8F
0167:00457B7A LEA EAX,[EBP-14]
0167:00457B7D MOV EDX,03
0167:00457B82 CALL 00403BB0
0167:00457B87 RET
0167:00457B88 JMP 004035A0
0167:00457B8D JMP SHORT 00457B7A
0167:00457B8F MOV EAX,ESI
0167:00457B91 POP EDI
0167:00457B92 POP ESI
0167:00457B93 POP EBX
0167:00457B94 MOV ESP,EBP
0167:00457B96 POP EBP
0167:00457B97 RET
看到这里,我们已经比较清楚这个子程序的作用了. 这个子程序的大体流程是这样的,
首先,通过 0167:004579D5 CALL 0045732 根据所填的用户名计算出对应 EASY Version 正确的注册码,
并与填的假的注册码比较,再根据比较结果置AL,然后用AL为棋标测试,如果不是正确的EASY Version注册码,
则再通过0167:00457A3D CALL 004573E0 根据所填的用户名计算出对应 PRO Version 正确的注册码,并与填
的假的注册码比较,再根据比较结果置AL,然后用AL为棋标测试,如果不是正确的 PRO Version 注册码,则
为试用版,再计算时间,计算出30天试用期剩余的天数..大体流程就是这样的了.
由于一个注册名对应两个不同的注册码,所以注册码的算法应该有两个,(实际上EASY Version算法和PRO
Version的算法基本一样,只有一点小不同,在后面我会介绍 ). 看来要想得到注册码的算法,必须要在追进
0167:004579D5 CALL 00457320 和0167:00457A67 CALL 00403ECC
这两个CALL中再分析.
休息一下先,(懒劲又上来了) *^_^*
- 标 题:Soundnailsd的破解教程(一) (9千字)
- 作 者:破解勇[CCG]
- 时 间:2001-10-17 21:58:46
- 链 接:http://bbs.pediy.com