反編譯調(diào)試flash的程序,有了Yogda,開發(fā)人員可以修改/優(yōu)化的Adobe Flash應(yīng)用程序編譯后的字節(jié)碼。
說起來修改FLASH游戲,理論上應(yīng)該可以找到更好的解決辦法——直接去修改二次編譯后的代碼,那樣就可以為所欲為了,咕~~(╯﹏╰)b。有位老大爺說得好,工欲善其事必先利其器!這東東嘎哈的不用說了,這丫的可以直接修改代碼……咕~~(╯﹏╰)b挺好挺強(qiáng)大。
yogda詳細(xì)介紹:
Yogda是一個AVM2 bytecode級的swf編輯器。
由著名flash開源3D引擎Yogurt3d的開發(fā)者開發(fā),但Yogda是一個商業(yè)軟件。
使用Yogda可更改/替換swf的tag,并可以直接對swf的doabc做匯編級別的修改(AVM2時代的flasm?),
可以把它看成一個高級一點的"閃客之錘"。
這意味著swf加解密又多了一個方便可靠的工具。
反編譯:
用你選擇的反編譯器打開導(dǎo)出的SWF,Yogda則依次展開左邊的樹,來到這里:
Public function _fla:frame1();
看右面(我只是右鍵復(fù)制的):
function 0000 *():
{
// Max stack : 5
// Local count : 1
// Scope depth : 10
// Max Scope depth : 11
// Exception Count : 0
// Trait Count : 0
// Code Length : 65 bytes.
0 getlocal0
1 pushscope
2 getlocal0
4 pushbyte 60
6 initproperty _w
7 getlocal0
9 pushbyte 60
11 initproperty _h
12 getlocal0
14 getlex graphics
16 initproperty gr
17 getlocal0
19 getproperty gr
22 callpropvoid clear,0
23 getlocal0
25 getproperty gr
27 pushbyte 1
29 pushint 1
32 callpropvoid lineStyle,2
33 getlocal0
35 getproperty gr
37 pushint 2
39 pushdouble 1
42 callpropvoid beginFill,2
43 getlocal0
45 getproperty gr
47 pushbyte 20
48 dup
49 getlocal0
51 getproperty _w
52 getlocal0
54 getproperty _h
57 callpropvoid drawRect,4
58 getlocal0
60 getproperty gr
63 callpropvoid endFill,0
64 returnvoid
}
看見紅的那幾行了吧(當(dāng)然你編輯器上不是紅的,看行號,要是沒紅的,看下面),就是gr.lineStyle(1, 0x999999);反編譯的結(jié)果了,0x999999呢?除了byte,bool類型,其他的一般都被索引代替了,可以翻看左面的Integers,里面依次有編號,但是編號和這里的編號不對應(yīng),應(yīng)該+1。 不扯遠(yuǎn)了,再次對比:
gr.lineStyle(1, 0x999999);
就是:
23 getlocal0
25 getproperty gr
27 pushbyte 1
29 pushint 1
32 callpropvoid lineStyle,2
注:前面的數(shù)字不是行號,是字節(jié)號。
翻譯一下,注意對照看ABC:
23,其語義應(yīng)理解為This.
25,Gr.
27,咱就不說堆棧,參數(shù)1
29,咱還不說堆棧,參數(shù)2
32,調(diào)用
前面的倆參數(shù),是給后面調(diào)用用的。很明白了吧。所以,我們想把這鬼子丫的改成清晰的黑框子,很易:
雙擊29那行,修改為pushbyte 1,點OK保存。然后小鼠標(biāo)輕點工具欄上內(nèi)保存按鈕,重新運行那個new.swf,丫的黑了吧!
很易是不,不過還得說,我們還得用WINHEX,因為我習(xí)慣于WINHEX,直接CTRL+ALT+X查找一串標(biāo)志性的16進(jìn)制,然后去編輯——2D 01改為24 01……暈了吧,開個玩笑。