• 标 题:FlashPlay 2.0 2001 07破解(P-code,用WKT VBDebugger破的)~~~~~~~~ (8千字)
  • 作 者:Sam.com
  • 时 间:2002-1-20 3:23:26
  • 链 接:http://bbs.pediy.com

破解目标:FlashPlay 2.0 2001 07
下载地址:http://zxmzjys.myetang.com
使用工具:Peid 0.7 (为什么Fi 2.49不能用了?大家是否都一样)
     Caspr 1.1
          WKT VBDebugger (vbdebug13e.zip)
          以上工具在阿伦的主页上有下载
破解原因:
        我一直在玩Flash版的“百万裤窿”,但是怎么也拿不到一百万,同时我也有一些编译成exe文件的Flash,我想将它转换成swf文件,于是找到了FlashPlay,它的FlashTool可以将exe格式的Flash转换成swf格式的,而且还可以去除swf文件的一般保护和密码保护,如果不注册就会有限制,它一共有两个工具:FlashPlay是播放Flash的,FlashTool是转换格式的,不注册的话FlashPlay会有时间限制,FlashTool有运行次数限制,注册其中一个,另一个也同时成为注册版。

破解过程:
        先用Peid查一下,两个文件都加了壳,用Caspr可以轻松搞掂,将脱了壳的文件改个好记的名,再用Peid查,FlashPlay是VB的,呵呵这东西我怕怕,先放着吧,FlashTool是VC的,就先试试它吧,用W32Dasm反编译,搞了半天,没什么结果,想想试试FlashPlay吧,我可以用SMARTCHK嘛,谁知一载入,提示说程序是P-code的,心就想放弃了,突然想到我有个WKT VBDebugger是专门对付P-code的,一直都没用过,就拿它试试吧。
     
        首先将电脑的日期改成2001年7月,因为没注册它会提示你试用期过了,用WKT VBDebugger打开刚才脱了壳的FlashPlay,点击Execute鍵,程序运行,这时会先后出现两个对话框,一定要尽快在程序未进入主界面之前按下两个确定鍵,不然WKT VBDebugger的调试窗口就不会出现!好了,过了一会就进入了FlashPlay的主界面,并提示你注册,另外出现了一个全英文的窗口,中间很多文字是绿色的,它就是WKT VBDebugger的调试窗口了,下面介绍一下窗口的内容:
     
        左上窗口为p-code的代码,右上窗是堆践窗口,左下是程序运行的结果
        有几个按键常用的,其它的我讲不出来它的功能,Save Source是保存当前代码窗口里的代码,Save Messages保存运行结果,Form Manager可显示程序各个Form的资料,应该很有用的,Class Manager同上一样不过是显示Class的,API显示程序调用到的Api地址(双击可设断点),Opcodes显示OPcodes代码的地址(双击可设断点),On Execution是调试过程中的中断列表,其效果就象Trw的bl命令,Memory Dump等同于Trw的D和U命令,String Refs是程序的字串列表,不过没中文.
         
        右边还有5个鍵是调试程序用的,分别对应热鍵F8,F12,F10,F5,F6,前四个的功能和Trw的功能是一样的,F6能让你指定调试时一次运行的行数.

   其实WKT VBDebugger看起来很复杂,使用上和其它的调试工具都差不多,只要你熟悉Trw和Ollydbg的使用就应该挺容易上手的。

   好了继续,首先把FlashPlay正在播放的动画停掉,以免影响我们的调试,然后点击注册窗口,上面有我的机器码,在下面填上个假的注册码676767676,按下确定鍵,什么反应都没有,接下来点击WKT VBDebugger的调试窗口,按下F12鍵,这时会回到FlashPlay的注册窗口里(如果这时你移动鼠标WKT VBDebugger就弹出来的话,请试多几次,它应该在你按下了注册确定鍵后才会跳出来的),按下注册确定鍵后WKT VBDebugger弹出来了,就像Trw一样,呵呵~~~~~~~你看看在代码窗里是否出现了下面的代码并且光标停在42B2FE处,如果是的话我就恭喜你啦~~~~~~~~~~~~~~~~

P-code代码(这就是P-code吗?我大大大部份都看不懂)
------------------------------------------------------------------
0042B2DF: FC Lead1/Cstr2Uni
0042B2E1: 6C ILdRf 00000000h
0042B2E4: 04 FLdRfVar 0066F094h
0042B2E7: FC Lead1/Cstr2Uni
0042B2E9: 6C ILdRf 00000001h
0042B2EC: 71 FStR4
0042B2EF: 32 FFreeStr
0042B2F8: 6C ILdRf 0C7A07FDh
0042B2FB: 71 FStR4
0042B2FE: 14 ExitProc  <----从字面上看好像是退出一个Call,可能是ret吧,这里请按F8会往下跳
0042B2FF: FF Lead4/Unknow
0042B301: 99 FMemStI4
0042B306: 3C SetLastSystemError
0042B307: 00 LargeBos
0042B309: 00 LargeBos
0042B30B: 00 LargeBos
0042B30D: 00 LargeBos
0042B30F: 00 LargeBos
0042B311: 00 LargeBos
-----------------------------------------------------------------

0043005A: FE CStrI4    <-----跳到这里来了
0043005C: 31 FStStr    <-----光标运行到此时,在结果窗口里会出现一串数字,请往下看"运行结果"的第2行(为了述说方便我在结果里编上了行号)这个可能是机器码之类的东西

0043005F: 2F FFree1Str
00430062: F5 LitI4: -> 1h 1
00430067: 04 FLdRfVar 0066F1B8h
0043006A: 4D CVarRef:
0043006F: 04 FLdRfVar 0066F18Ch
00430072: 0A ImpAdCallFPR4 rtcLeftCharVar on address 660248EEh
00430077: 04 FLdRfVar 0066F18Ch
0043007A: 3A LitVarStr '-'
0043007F: 5D HardType
00430080: 33 EqVarBool
00430082: 35 FFree1Var
00430085: 1C BranchF 004300AC (Jump <----这里一定要按F8, 我试过按F10程序就运行了,这样就跟不到下面的结果了,注意代码里的'Jump'是要光标运行到此行时才会出现的,下面的很多代码都是如此,大多都是些地址和数字之类的.

00430088: 6C ILdRf 0044FD38h
0043008B: 4A FnLenStr
0043008C: F5 LitI4: -> 1h 1
00430091: AE SubI4
00430092: 04 FLdRfVar 0066F1B8h
00430095: 4D CVarRef:
0043009A: 04 FLdRfVar 0066F18Ch
0043009D: 0A ImpAdCallFPR4 rtcRightCharVar on address 660EA4C5h
004300A2: 04 FLdRfVar 0066F18Ch
004300AC: 6C ILdRf 0044FD38h  <-----跳到此,后面都可以用F10啦
004300AF: 4A FnLenStr
004300B0: FD Lead2/CVarI4
004300B4: FC Lead1/FStVar
004300B8: 1B LitStr: ''
004300BB: 43 FStStrCopy
004300BE: 6C ILdRf 00000000h
004300C1: 28 LitVarI2 1h , 1
004300C6: F5 LitI4: -> 9h 9
004300CB: 04 FLdRfVar 0066F1B8h
004300CE: 4D CVarRef:
004300D3: 04 FLdRfVar 0066F16Ch
004300D6: 0A ImpAdCallFPR4 rtcMidCharVar on address 660EA557h
004300DB: 04 FLdRfVar 0066F16Ch
004300DE: 28 LitVarI2 31h , 49
004300E3: 17 XorVar
004300E7: FC Lead1/CI4Var
004300E9: 0B ImpAdCallI2 rtcBstrFromAnsi on address 660E53B7h
004300EE: 23 FStStrNoPop  <---运行到此,结果窗口出现了第3 行,注意那个'8'
004300F1: 2A ConcatStr    <---出现第4行结果
004300F2: 31 FStStr        <---第5行,先别管,往下看
004300F5: 2F FFree1Str
004300F8: 36 FFreeVar -> 2
004300FF: 6C ILdRf 00450834h
00430102: 28 LitVarI2 1h , 1
00430107: F5 LitI4: -> 2h 2
0043010C: 04 FLdRfVar 0066F1B8h
0043010F: 4D CVarRef:
00430114: 04 FLdRfVar 0066F16Ch
00430117: 0A ImpAdCallFPR4 rtcMidCharVar on address 660EA557h
0043011C: 04 FLdRfVar 0066F16Ch
0043011F: 28 LitVarI2 5Ah , 90
00430124: 17 XorVar
00430128: FC Lead1/CI4Var
0043012A: 0B ImpAdCallI2 rtcBstrFromAnsi on address 660E53B7h
0043012F: 23 FStStrNoPop <---出现第6行结果'Z'
00430132: 2A ConcatStr  <---光标到此,代码后面会出现两个地址,注意结果8
00430133: 31 FStStr      <---得到了一个字串'8Z'(第9行)
00430136: 2F FFree1Str
00430139: 36 FFreeVar -> 2
00430140: 6C ILdRf 00445E58h
00430143: 28 LitVarI2 1h , 1
00430148: F5 LitI4: -> 7h 7
0043014D: 04 FLdRfVar 0066F1B8h
00430150: 4D CVarRef:
00430155: 04 FLdRfVar 0066F16Ch
00430158: 0A ImpAdCallFPR4 rtcMidCharVar on address 660EA557h
0043015D: 04 FLdRfVar 0066F16Ch
00430160: 28 LitVarI2 78h , 120
00430165: 17 XorVar
00430169: FC Lead1/CI4Var
0043016B: 0B ImpAdCallI2 rtcBstrFromAnsi on address 660E53B7h
00430170: 23 FStStrNoPop
00430173: 2A ConcatStr
00430174: 31 FStStr
    .
    .中间省略,都是相似的代码,反正也看不懂
    .
    .
004302EF: FC Lead1/CI4Var
004302F1: 0B ImpAdCallI2 rtcBstrFromAnsi on address 660E53B7h
004302F6: 23 FStStrNoPop
004302F9: 2A ConcatStr
004302FA: 31 FStStr
004302FD: 2F FFree1Str
00430300: 36 FFreeVar -> 2
00430307: 6C ILdRf 0044EB80h
0043030A: 43 FStStrCopy
0043030D: 14 ExitProc    <---运行到此,我们得到了一个字串'8ZxnxNP13',再按F10我们就跳回到FlashPlay了,试试这个字串,呵呵~~~~~就是它啦!我在另一台机上得到的是'1^}e{O\59'不用怀疑,就是它~~~~~

0043030E: FF Lead4/Unknow
00430310: 4C FnLBound
00430311: 99 FMemStI4
00430316: 84 IStI2
00430319: 02 LargeBos
0043031B: 00 LargeBos
0043031D: 00 LargeBos
0043031F: 00 LargeBos
00430321: 00 LargeBos
----------------------------------------------------------------


运行结果
----------------------------------------------------------------
1  Return reached.
2  FStStr -> '209324029'
3  FStStrNoPop -> '8'
4  Concat->'' + '8'
5  FStStr -> '8'
6  Freeing Addrs: 0066F18Ch 0066F16Ch
7  FStStrNoPop -> 'Z'
8  Concat->'8' + 'Z'
9  FStStr -> '8Z'
10 Freeing Addrs: 0066F18Ch 0066F16Ch
11 0043016B: 0B ImpAdCallI2 rtcBstrFromAnsi on address 660E53B7h
12 00430170: 23 FStStrNoPop
13 00430173: 2A ConcatStr
14 Freeing Addrs: 0066F18Ch 0066F16Ch
15 004301AC: 0B ImpAdCallI2 rtcBstrFromAnsi on address 660E53B7h
16 Concat->'8Zx' + 'n'
17 FStStr -> '8Zxn'
18 Freeing Addrs: 0066F18Ch 0066F16Ch
19 FStStrNoPop -> 'x'
20 Concat->'8Zxn' + 'x'
21 FStStr -> '8Zxnx'
22 Freeing Addrs: 0066F18Ch 0066F16Ch
23 FStStrNoPop -> 'N'
24 Concat->'8Zxnx' + 'N'
25 FStStr -> '8ZxnxN'
26 Freeing Addrs: 0066F18Ch 0066F16Ch
27 FStStrNoPop -> 'P'
28 Concat->'8ZxnxN' + 'P'
29 FStStr -> '8ZxnxNP'
30 Freeing Addrs: 0066F18Ch 0066F16Ch
31 FStStrNoPop -> '1'
32 Concat->'8ZxnxNP' + '1'
33 FStStr -> '8ZxnxNP1'
34 Freeing Addrs: 0066F18Ch 0066F16Ch
35 FStStrNoPop -> '3'
36 Concat->'8ZxnxNP1' + '3'
37 FStStr -> '8ZxnxNP13'    <-----往哪跑~~~~~~~~
38 Freeing Addrs: 0066F18Ch 0066F16Ch
----------------------------------------------------------------------

总结一下:
        搞了老半天根本就搞不清楚程序是怎么算出注册码的,这也难怪,P-code的代码我能看得懂吗,虽然WKT VBDebugger一样可以看到程序的汇编代码,但我还是没有能力写个注册机出来的,不过至少我们学会了WKT VBDebugger的基本使用吧,这也不错呀,我们不用5分钟就把它搞掂啦,也是个好的开始吧!



      _/_/_/
    _/          _/_/_/  _/_/_/  _/_/
    _/_/    _/    _/  _/    _/    _/
        _/  _/    _/  _/    _/    _/
_/_/_/      _/_/_/  _/    _/    _/

                                              Sam.com
                                            20:40 2001-7-19