欢迎来到 嗅灵易学

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

版本虽旧,但可以作此教程另一种破解之法的补丁之用! (8千字)

版本虽旧,但可以作此教程另一种破解之法的补丁之用! (8千字)

PhotoCaster 2拆解手记
PhotoCaster 2是著名的多媒体创作工具Director 7的一个内置插件,它可以直
接导入用PhotoShop制作的分层PSD图形,并按原样在舞台上自动排列。未注册
版会在导入的图形中加上很多蓝色的斜线,从而导致无法正常使用。
我拆这个插件的原因除了为减轻本公司制作人员的工作负担之外,更重要的是
我在网上找到的唯一一个由著名的SIGEG组织制作的破解版竟然未能完全拆开。
致使有很多网友不得不舍弃Director 7内置的PhotoCaster 2.0.3而去使用早
期功能尚不完备的PhotoCaster 1.1.2破解版。
为了能让网友们用上最新版本,我走上了漫漫破解之路(这是我花了二十余天
业余时间拆完之后回头一看才发现的:-D)
一、首先,由于SIGEG的破解版已能成功注册,并能够去除部分斜线,因此我决
定先研究一下SIGEG的破解方法:
1、将Director 7自带的PhotoCaster 2插件复制并更名为P1.x32,将SIGEG破解
的PhotoCaster 2插件复制并更名为P2.x32,切换到MS-DOS窗口,使用DOS的文件
比较命令FC进行分析:(在提示符下输入如下指令)
FC P1.x32 P2.x32/B >diff.txt
即按二进制文件格式比较两个文件,并将结果保存到diff.txt中。
2、返回Windows 98,在记事本中打开diff.txt文件,发现两个文件共有六处不
同,将其相应地址记下。
3、使用反汇编软件Wasm 8.93对该插件进行反编译(尽管插件的扩展名为x32,
其实是32位的EXE文件格式,故而能够成功进行反编译)
4、在刚才记录的相应地址进行察看,发现六处改动的语句相同,原来均为
XOR ECX,EDX(即将寄存器ECX和EDX进行异或运算),而此句之后除第一处为
ADD EDI,ECX之外,其余均为ADD EDI,EDX,可见密码运算结果应该与这两句
有关,SIGEG对它们的处理是将第一处的XOR ECX,EDX改为XOR ECX,ECX其余
几处均改为XOR EDX,EDX(或其等效语句),从而使与EDI相加的值恒为0,
这样以图达到使密码计算程序无效的目的,然而实践证明这样做虽能正常注
册,但却不能完全去掉加在图面上的斜线(只能去掉一部分,剩下的部分
和输入的密码有关)
二、通过试验,发现PhotoCaster 2能够记录已导入的图层数、已输入的密码
值等等,因此可以断定它一定有写文件或注册表的动作。那么我们可以看一
下:
1、如果是在注册表中搞鬼的话,通常我们可以使用注册监测软件RegMon来进
行监视(一定要设置好过滤选项,让它只显示你要拆解的软件,否则...)不过
PhotoCaster似乎不是在注册表中记录信息的。
2、如果是通过文件记录的话,可以通过非常简单的方法搞定,首先将你的系
统时间改为2000年(或者是将来随便的哪一年、哪一天),然后不要运行其它
软件,直接运行Director,并且不进行其它操作,直接调出PhotoCaster进行
注册(即使注册失败也不会有任何提示,只是将输入框清空,可见PhotoCaster
是有备而来的哦!)
3、在"开始"菜单中选"查找",并设定好查找2000年的文件,结果只有几个,其
中在C:\Windows系统目录下有一个名为PhotoCaster 2 Prefs_D7.PRF的文件,
不用说,一定和注册有关!用UltraEdit或其它十六进制编辑软件打开看看吧!
其内容大致如下:
FE ED AC DC 00 00 00 64 00 00 40 87 00 00 00 00
00 00 00 00 FF 00 00 00 00 00 00 00 00 00 00 00
经试验,发现前四位为特征字,第十位到第十二位(00 40 87)为界面上各选项
的选择记录,第十三位为已输入注册号的次数(当此数达到33即十进制的51时
无论你输入任何密码均会报告注册成功,而实际上根本没有注册,可见它对穷
举试验法也有所防范),第二行的头四位用来记录已导入的层数,如果是未注
册版,允许你正常导入十层单层图,超过十层时就会发出警告,并且即使你再
导入单层图也会加上斜线。第二行的第五位至第十位为密码记录位,当未注册
成功时为FF 00 00 00 00 00,注册后则为你输入的注册号(不要以为改了这里
就行了,PhotoCaster每次都会从这里读出密码再进行计算,如果不是真正的
注册号,仍然不能正常工作),怎么样,够劲儿吧?
4、看起来不动点真格的是不行了。要想彻底拆开,恐怕还是得使用Softice。
  首先涉及到的问题就是断点的设置。通常情况下,最常用的断点设置方法
是先在密码框中随便输入一个密码,然后按Ctrl+D激活Softice,并输入
bpx hmemcpy,即当程序读取密码时中断,按F5切回程序,按下"确定"或者
是"注册"之类的按钮进行注册,Softice弹出后,用bd *命令禁止所有断点,
以免发生重复中断,接下来按F12键直到发生错误为止,一定要记住按F12的
次数,再次按Ctrl+D激活Softice,用be *使断点再次生效,然后重复上面的
步骤,但要记得少按一次F12,然后改为按F10,直到发生错误为止,记住按
F10的次数,再重复一次上述操作,F10也要少按一次,一般说来,比较简单
的加密到这里就差不多可以破解了,从最后一句(这里通常情况下都是一个
CALL语句,是用来调用出错子程序显示信息的)向上找,通常都会找到这样
的语句之一:PUSH(将数据压入堆栈)、MOV(赋值)、LEA(调用有效地址)等等,
这些都是用于保存密码的,然后会有一个比较语句如CMP或XOR等,再接下来
是一个跳转语句如JMP、JZ、JNZ等等,而这些跳转语句通常都指向或跳过出
错子程序调用,如果是相等跳转JZ则改为无条件跳转JMP,如果是不等跳转,
则改为空操作NOP(因为一个NOP只占一个字节,通常要用几个NOP填满原位)。
可输入CODE ON命令,在代码窗口中显示语句的相应十六进制码,也就是它们
在程序源文件中实际存储的样子,记录后使用UltraEdit等软件更改源程序中
相应的代码即可完成破解。
    然而现在的许多软件为了防止被这样简单破掉,经常在比较注册码后再
做一些其它的事情,使得你在上述方法中最后一步向上察看时找不到真正比
较密码的地方。不幸的是,PhotoCaster正是这种情况,此类软件通常会表
现出如下症状:不弹出对话框,直接清空输入框(PhotoCaster就是如此)。
或者先清掉原先的窗口,再弹出对话框,而不是直接弹出对话框等等。
    虽然这些软件到处兜圈子,但是仍可以轻易找到密码比较程序之所在,
你只要注意到每次使用bpx hmemcpy中断后代码窗的情形就会明白:在程序
调用Windows功能的时候,代码窗口中的地址大多为XXXX:XXXX(即4位:4位)
的格式,在经过一次JMP XXXX:XXXXXXXX语句后,代码窗口中的地址则会变
为XXXX:XXXXXXXX(4位:8位)的格式,而代码窗口下面直线的中间或者上面
直线的左边也会显示出当前程序段所在位置,如PhotoCaster.text+XXXX的
字样,这就说明已经进入了PhotoCaster的地盘了,差不多每个加密者都会
先比较一下密码然后再去做别的,因此当你按F12到XXXX:XXXXXXXX形式的地
址时就应该注意改为用F10进行追踪了。当遇到一个CALL后出错时记下它的
位置,下次再追到此处时就可以分析一下这一句前面和后面的句子了,如果
走运的话,就可以找到刚才说的比较程序了(PUSH EDI、CMP EDI,EBX、JZ等)
照样一改就可以了,或者用?EDI等命令看一下被比较的寄存器或地址内的值
说不定可以直接看到注册码呢!
    可惜PhotoCaster又不是此类情况。
    拆到这儿,我觉得应该换一种断点试一下,于是就在选层导入的对话框
中设置了一个bpx destorywindow(即在注销窗口时中断),然后追到出现渲
染框为止,因为我觉得既然未册版单层可以正常导入,必定有一个判定的地
方,通过分析发现,导入单层和多层竟然不走一个子程序,强行跳过后则无
论选中多少层都只导入最后一层,而被跳过的部分中一连调用了好几层子程序
实在不容易分清究竟是哪个子程序给画面加上了蓝条条。
    最后,我不得不面对最根本的解决办法:破译加密子程序中所有算法,
自己算出注册码!
    经过多日苦战(光笔记本就用了三、四个),终于弄清了PhotoCaster的全部
算法:它的密码共有六位(这是第一处关卡,如果不对就会出错),首先它根据
程序的序号MK9-RACA算出一个常数79043,因为我试验了很多机器证实此序号
为PhotoCaster2的不变序号,因此就没有深究它是如何计算这个常数的。接下
来它取密码的最后一位与79043相加,所得的值保存起来。然后就进入了对其它
五位密码的大段计算过程,最后将计算结果与刚才的加和相比,如果相等则通
过(别想改此处的跳转,全部程序中用到密码的地方不下六处呢,还是老老实实
地算吧)。经过反复的试验和分析,终于搞懂了其余五位的加密算法。其中包括
位替换、逆序、与常数相乘、加和等等共计五大步二十小步的计算。
    下面是我按照所破译的算法用VB作的计算程序:
界面上共有一个按钮(执行计算用)、五个文本框,这些文本框为:
text1:输入测试初值(初始化为0)
text2:输入测试终值(初始化为10000)
text3:显示计算结果(初始化为0)
text4:输入比较值(即第6位+79043的值,初始化为79043)
text5:显示状态(是否成功)
其中只有按钮中有程序,内容如下:
Private Sub Command1_Click()
Dim s(4)
Dim d(4)
Dim num, restn, source, rests, fir, sec, result
Dim i, j, p, t
fir = Text1.Text
sec = Text2.Text
result = Text4.Text + 0
For source = fir To sec
rests = source
For i = 0 To 4
s(i) = Fix(rests / 10 ^ (4 - i))
rests = rests Mod 10 ^ (4 - i)
Next i
d(0) = s(0)
d(1) = s(1)
d(2) = s(2)
d(3) = s(3)
d(4) = s(4)
For i = 0 To 4
t = s(i) Mod 5
Select Case i
Case 0
d(t) = d(t) + s(1)
d(t) = Right(d(t), 1)
Case 1
d(t) = d(t) - s(2)
If d(t) < 0 Then
d(t) = 0
End If
Case 2
d(t) = d(t) + s(3)
d(t) = Right(d(t), 1)
Case 3
d(t) = d(t) - s(4)
d(t) = Right(d(t), 1)
If d(t) < 0 Then
d(t) = 0
End If
Case 4
d(t) = d(t) + s(0)
d(t) = Right(d(t), 1)
End Select
num = d(4) * 10000 + d(3) * 1000 + d(2) * 100 + d(1) * 10 + d(0)
Select Case i
Case 0
num = num + 10 * s(1) + 7 * s(0)
Case 1
num = num - 100 * (256 - s(2)) + 11 * s(1)
Case 2
num = num + 1000 * s(3) + 13 * s(2)
Case 3
num = num - 10000 * (256 - s(4)) + 17 * s(3)
Case 4
num = num + 100000 * s(0) + 19 * s(4)
End Select
restn = num
For j = 0 To 4
p = Fix(restn / 10 ^ (4 - j))
restn = num Mod 10 ^ (4 - j)
If p >= 0 Then
p = Right(p, 1)
d(j) = p
Else
p = Right(p, 1)
p = 16 - p
p = Right(p, 1)
d(j) = p
End If
Next j
num = d(0) * 10000 + d(1) * 1000 + d(2) * 100 + d(3) * 10 + d(4)
restn = num
For j = 0 To 4
d(4 - j) = Fix(restn / 10 ^ (4 - j))
restn = restn Mod 10 ^ (4 - j)
Next j
Next i
num = d(0) * 10000 + d(1) * 1000 + d(2) * 100 + d(3) * 10 + d(4)
If num = result Then
Text3.Text = source
Text5.Text = "成功了!"
Exit For
Else
Text3.Text = 0
Text5.Text = "没找到!"
End If
Next source
End Sub
有兴趣的网友可以研究一下具体的加密算法。
最后,我用它算出了三组有效的注册码:
868541
304323
653467
希望我的工作能为从事多媒体制作的网友们提供一点方便。
也希望我的拆解过程能给爱好Crack的网友一点帮助。

                          newx@21cn.com

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

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

0 0 0 举报
复制成功