欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

Soundnailsd的破解教程(一) (9千字)

Soundnailsd的破解教程(一) (9千字)

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中再分析.
        休息一下先,(懒劲又上来了) *^_^*

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功