<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    rosial

    lost memory
    數(shù)據(jù)加載中……

    《爪哇夜未眠》- 系統(tǒng)篇 - 編譯、反編譯、反反編譯

    「盜版」的行為,天天都在我們的周遭上演,所以今年五月由 BSA(商業(yè)軟體聯(lián)盟)和法務(wù)部發(fā)起的「反盜版」活動(dòng),著實(shí)讓大家風(fēng)聲鶴唳了好一陣子。但是,即使在這樣詭譎的氣氛之下,由大專院校學(xué)生為主的「反反盜版」活動(dòng),到也振振有詞,轟轟烈烈地攻占媒體版面。有「盜版」,就有「反盜版」;有「反盜版」,就有「反反盜版」,這個(gè)世界就是這么一回事。

    同樣的道理,有「編譯」(compile),就有「反編譯」(decompile);有「反編譯」,就有「反反編譯」。對(duì)于 Java 和 .NET 這種虛擬機(jī)器的中間碼來說,尤其明顯。

    Java 程式編譯后的結(jié)果是 Java Bytecode,而 .NET 編譯后的結(jié)果是 CIL(Common Intermediate Language),兩者都具有下列的特性:


    同為堆疊式(stack-based)指令集。
    同為高階物件導(dǎo)向機(jī)器語言。
    和平臺(tái)無關(guān)。
    Code Validation
    Symbolic Link
    上述任何一點(diǎn)特色,都可以讓程式變得更容易反編譯,全部五點(diǎn)結(jié)合起來更是不得了。所以要反編譯 Java 和 .NET 可以說是相當(dāng)容易的。網(wǎng)路上就到處流傳著 Java 的反編譯器(decompiler),可以把編譯后的檔案反推出原始碼,相信不久之后 .NET 也會(huì)遇到一樣的問題。(至少,喜歡搞破壞的我就正嘗試著寫一個(gè) .NET decompiler。)

    試想,如果你將辛辛苦苦開發(fā)出來的 Java 和 .NET 程式交給別人(蔡學(xué)鏞?),他只要透過反編譯器,就可以推出原始碼,你的智慧財(cái)產(chǎn)很可能會(huì)受到侵犯。

    想要保護(hù)自己,你必須在 Java 或 .NET 軟體出貨前,進(jìn)行反反編譯,這個(gè)動(dòng)作通常稱為混淆(obfuscate)。被混淆過的程式碼,依然遵照原來的檔案格式和指令集,所以依然可以執(zhí)行,執(zhí)行結(jié)果也和混淆前一樣。只是被混淆過的程式碼變得更亂,更不容易被反編譯成功。

    有的 Java 開發(fā)工具(例如 JBuilder)有內(nèi)附混淆器(obfuscator),或者你也可以購買功能更強(qiáng)大的混淆器。這些商業(yè)的混淆器通常只做三件事:
    將每一個(gè) method 內(nèi)部用更亂的方式組織。
    將 Java Constant Pool,或 .NET metadata 內(nèi)可以消除的 Symbolic Data 消除(例如 private method 的名字)。
    將 debug 資訊(例如 Java 的 LocalVariableTable 與 LineNumberTable)全部刪除。
    Obfuscator 的作用如果只是如同上述一般,只有 method 局部的作用,效果不大。欲大幅度地增加反編譯的難度,必須搭配下列的方式:
    Class 內(nèi)的混淆:將 class 內(nèi)的 method 互相混淆。
    Class 之間的混淆:將 class 之間的關(guān)系混淆,例如將父類別和子類別合并或拆解等。
    有一些學(xué)術(shù)論文有對(duì)上述兩點(diǎn)做出研究,但成效仍然不大,而且必須手動(dòng)調(diào)整,無法由軟體自動(dòng)處理。這方面值得大家投入更深入的研究。

    混淆過的程式會(huì)遇到下面的問題:
    通常效率會(huì)變差。
    可能無法執(zhí)行。我遇過這樣的情況,有可能是混淆器的錯(cuò),也有可能是 JVM 的錯(cuò)。
    如果進(jìn)行「Class 之間的混淆」,稍有不慎,就很可能會(huì)無法執(zhí)行。例如:Java 程式中如果有用到 instanceof,或者 C# 程式中有用到 is,就要很小心的進(jìn)行「Class 之間的混淆」,否則后果不堪設(shè)想。

    混淆的目的有兩個(gè)層次:
    讓程式無法被自動(dòng)反編譯:例如做出一些特殊的跳躍(goto),讓程式區(qū)塊(block)的關(guān)系無法被找出特定的 pattern。

    讓程式就算被反編譯成功,也不容易被程式員閱讀理解:想辦法加入一些不易被識(shí)破的程式碼來欺騙程式員。

    Obfuscator 不是萬靈丹,如果遇上了一個(gè)精通 obfuscating 技術(shù)的人,佐以 profiling 工具,原始碼還是會(huì)落入他的手中。所以,使用 obfuscator 時(shí),你必須有這樣的心理準(zhǔn)備:「防君子,不妨小人;防笨蛋,不防聰明人」。盡可能將軟體放在 server 改為提供 service,而不將軟體賣到客戶手上,這才是上策。

    posted on 2006-07-10 14:51 rosial 閱讀(268) 評(píng)論(0)  編輯  收藏 所屬分類: 蔡學(xué)鏞

    主站蜘蛛池模板: 亚洲天堂一区二区三区| 国产免费不卡视频| 国产偷国产偷亚洲清高APP| 亚洲成AV人片在| 亚洲va中文字幕无码| 久久久久久国产精品免费免费| a级毛片无码免费真人久久| 国产成人高清亚洲一区91| www.亚洲日本| 97久久精品亚洲中文字幕无码 | 久久精品国产亚洲av日韩| 亚洲夜夜欢A∨一区二区三区| 国产精品成人无码免费| 成年人免费网站在线观看| 中国人xxxxx69免费视频| 久久九九全国免费| 好猛好深好爽好硬免费视频| 国产精品亚洲精品日韩电影| 亚洲精品伦理熟女国产一区二区 | 免费黄网站在线观看| 怡红院免费的全部视频| 一级中文字幕乱码免费| 免费的黄色的网站| 国产成人亚洲午夜电影| 亚洲av无码兔费综合| 亚洲乱妇熟女爽到高潮的片| 亚洲日日做天天做日日谢| 国产精品亚洲片夜色在线| 亚洲人成日本在线观看| 亚洲人成电影青青在线播放| 亚洲日本乱码一区二区在线二产线| 亚洲色图在线观看| 亚洲视频小说图片| 亚洲一级毛片在线播放| 亚洲综合色婷婷在线观看| 亚洲一本一道一区二区三区| 亚洲综合色婷婷在线观看| 色偷偷亚洲男人天堂| 猫咪www免费人成网站| 一级毛片a女人刺激视频免费| www一区二区www免费|