FlashPlay 2.0 2001 07破解(P-code,用WKT VBDebugger破的)~~~~~~~~ (8千字)

看雪資料發表於2002-01-20

破解目標: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,點選ExecuteI,程式執行,這時會先後出現兩個對話方塊,一定要儘快在程式未進入主介面之前按下兩個確定I,不然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個I是除錯程式用的,分別對應熱IF8,F12,F10,F5,F6,前四個的功能和Trw的功能是一樣的,F6能讓你指定除錯時一次執行的行數.

   其實WKT VBDebugger看起來很複雜,使用上和其它的除錯工具都差不多,只要你熟悉Trw和Ollydbg的使用就應該挺容易上手的。

   好了繼續,首先把FlashPlay正在播放的動畫停掉,以免影響我們的除錯,然後點選註冊視窗,上面有我的機器碼,在下面填上個假的註冊碼676767676,按下確定I,什麼反應都沒有,接下來點選WKT VBDebugger的除錯視窗,按下F12I,這時會回到FlashPlay的註冊視窗裡(如果這時你移動滑鼠WKT VBDebugger就彈出來的話,請試多幾次,它應該在你按下了註冊確定I後才會跳出來的),按下注冊確定I後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

相關文章