資源描述:
《如何防止swf文件被反編譯》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、如何防止SWF文件被反編譯這篇文章的標(biāo)題所提出的問題的答案是“不可能”。至少對(duì)我來說是不可能的。借助適當(dāng)?shù)墓ぞ撸覀兛梢苑淳幾g任何S大小的Sacromedia提供給開發(fā)者一個(gè)“防止導(dǎo)入的口令保護(hù)”功能。如果你給SANDTHEP-CODE在flash5的時(shí)代,出現(xiàn)了兩種流行的工具,免費(fèi)的“Flasm”和商業(yè)的“ASV2.0”。Flasm就是“Flashasm”,它將SX時(shí)代的到來,許多反編譯工具的出現(xiàn),加快了Flash厄運(yùn)的速度?,F(xiàn)行版本的ASV4除了顯示得到匹配的actionscript代碼,得不到匹配的代碼以p-codes形式顯示。如果解釋成p-codes發(fā)生問題,將顯示SX2004提供通過
2、javascriptAPI來生成”fla”文件。那使它能夠建立發(fā)布成SWF格式的fla文件。此刻,所有的東西都在那邊了。更不用說聲音、形狀和位圖了,偷竊者不喜歡這些東西,因?yàn)樗鼈兲兹菀兹〉昧恕M蹈`者喜歡切的actionscript,因?yàn)槠渲须[藏著密碼,因?yàn)槠渲杏凶柚勾擞捌2シ诺哪_本代碼,如果ASV只能將腳本反編譯成字節(jié)碼,那么它對(duì)于大多數(shù)偷竊者是沒有用處的。因此很多人進(jìn)他們的最大努力來阻止ASV4將腳本反編譯成actionscript或者p-codes。實(shí)際上,對(duì)于大多數(shù)反編譯者來說,腳本得不到匹配,反編譯工具就無用了。這是曾經(jīng)用過的一些技術(shù),當(dāng)它們?cè)谝蛱鼐W(wǎng)上發(fā)布并且被反編譯組織揭示之后,
3、每種技術(shù)的保護(hù)效果最終都會(huì)變得非常薄弱和氣數(shù)將盡。依據(jù)數(shù)據(jù)尺寸(句子)分塊反編譯大多數(shù)之所以能夠成功的迷惑或者破壞反編譯器,原因在于播放器和反編譯器的不同行為。播放器逐個(gè)的執(zhí)行字節(jié)碼,就像現(xiàn)實(shí)世界中的讀書一樣,一個(gè)單詞,接著下一個(gè)單詞。然而反編譯器通常將字節(jié)鏈分成有意義的片斷,猶如現(xiàn)實(shí)世界中的讀書一樣,一個(gè)句子,接著下一個(gè)句子。反編譯器的行為如此簡(jiǎn)單的原因在于大多數(shù)的p-code都是遵循數(shù)據(jù)大小規(guī)律的。對(duì)于字節(jié)碼("96080000610007030000001D"),反編譯器遇到代表"push"操作的0x96時(shí)會(huì)想“p123下一頁[感謝閱讀這篇文章,..,]ush什么呢”?下個(gè)字節(jié)(0x00
4、08)指示的內(nèi)容:接下去8個(gè)字節(jié)中的內(nèi)容壓入堆棧,即把("0061000703000000")壓入堆棧。所以,通常反編譯器依據(jù)數(shù)據(jù)大小將簡(jiǎn)短的片斷切成一塊一塊的,這樣便會(huì)解釋成“pushsomething”。因此,("9608000061000703000000")就成為一個(gè)句子。下一個(gè)字節(jié)是下一個(gè)句子的開始,就是代表"setVariable"的0x1D。這樣8個(gè)字節(jié)的"something",將被更進(jìn)一步解釋成一個(gè)字符串“a”和一個(gè)數(shù)字“3”。讓我們來看一下字節(jié)碼:("990200050096")。0x99意味著分支(或者跳轉(zhuǎn)),在哪里分支呢?接下去的是(0002),因此數(shù)據(jù)存儲(chǔ)在機(jī)下去的兩個(gè)
5、字節(jié)中,將它在下面兩個(gè)字節(jié)處截?cái)?。總之,我們知?9902000500"是個(gè)句子。接下去的是0x96,代表下個(gè)句子的開始。再看第三個(gè)例子,字節(jié)碼:("8808000300630062006100960700")。0x88代表定義常數(shù),定義的常數(shù)內(nèi)容是什么呢?后續(xù)字節(jié)(0008),表明常數(shù)內(nèi)容存儲(chǔ)在后繼的8個(gè)字節(jié)中。所以,句子就是:("8808000300630062006100")。代表下個(gè)句子開始的("960700...),意味著將7個(gè)字節(jié)的數(shù)據(jù)壓入堆棧。因此,字節(jié)碼砍成單獨(dú)的句子。每個(gè)句子由命令和數(shù)據(jù)組成,并且以命令打頭。因此,每個(gè)句子都是一個(gè)基本的單元。理論上來說,對(duì)于這種方法沒有什么錯(cuò)
6、誤。使播放器從句子中間開始讀數(shù)據(jù)讓我們開始討論“是播放器從句子中間讀數(shù)據(jù)”的破壞反編譯器的技術(shù)。首先,我舉一個(gè)現(xiàn)實(shí)世界的例子:Johnsaysgoodmorning.Marysaysthankyou.現(xiàn)在生成Sorning.skip3說了什么,但語法不對(duì),匯報(bào)出錯(cuò);第二,它沒有看到第二個(gè)“skip”命令,因?yàn)樗幱诰渥又虚g;第三,當(dāng)它被迫退回7個(gè)字后,感到迷惑,認(rèn)為應(yīng)該從“Tomsaid”開始執(zhí)行整個(gè)句子;第四,這個(gè)錯(cuò)誤使它在第二行和第三行之間陷入無限循環(huán)之中。總之,我們?cè)黾恿恕癟omsaid”這句垃圾代碼,并提供整個(gè)句子長(zhǎng)度的錯(cuò)誤數(shù)據(jù)大小信息。這個(gè)錯(cuò)誤的長(zhǎng)度覆蓋了“skip”命令。來看個(gè)真實(shí)
7、的例子,請(qǐng)注意,這些技術(shù)需要操作字節(jié)碼,純actionscript不能夠?qū)崿F(xiàn)。例1:向前跳轉(zhuǎn)的包含無效尺寸數(shù)據(jù)的死代碼。pushTruebranchifTruelabel2constants''label2:push'a',3setVariable你仔細(xì)看的話,會(huì)發(fā)現(xiàn)"constants''"這行是垃圾代碼,它不可能被執(zhí)行到。然而,理論上,當(dāng)?shù)诙械慕Y(jié)果為"notTrue"時(shí),它將被執(zhí)行。因此,反