国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Java編譯、反編譯、反反編譯

2019-11-18 11:15:14
字體:
來源:轉載
供稿:網友

  「盜版」的行為,天天都在我們的周遭上演,所以今年五月由BSA(商業軟件聯盟)和法務部發起的「反盜版」活動,著實讓大家風聲鶴唳了好一陣子。但是,即使在這樣詭譎的氣氛之下,由大專院校學生為主的「反反盜版」活動,到也振振有詞,轟轟烈烈地攻占媒體版面。有「盜版」,就有「反盜版」;有「反盜版」,就有「反反盜版」,這個世界就是這么一回事。
  
  同樣的道理,有「編譯」(compile),就有「反編譯」(decompile);有「反編譯」,就有「反反編譯」。對于java和.NET這種虛擬機器的中間碼來說,尤其明顯。
  
  Java程序編譯后的結果是Java Bytecode,而.NET編譯后的結果是CIL(Common Intermediate Language),兩者都具有下列的特性:
  
  -同為堆棧式(stack-based)指令集。
  
  -同為高階面向對象機器語言
  
  -和平臺無關
  
  -Code Validation
  
  -Symbolic Link
  
  上述任何一點特色,都可以讓程序變得更輕易反編譯,全部五點結合起來更是不得了。所以要反編譯Java和.NET可以說是相當輕易的。網絡上就到處流傳著Java的反編譯器(decompiler),可以把編譯后的檔案反推出原始碼,
  相信不久之后.NET也會碰到一樣的問題。(至少,喜歡搞破壞的我就正嘗試著寫一個.NET decompiler。)
  
  試想,假如你將辛辛勞苦開發出來的Java和.NET程序交給別人(蔡學鏞?),他只要透過反編譯器,就可以推出源碼,你的智能財產很可能會受到侵犯。
  
  想要保護自己,你必須在Java或.NET軟件出貨前,進行反反編譯,這個動作通常稱為混淆(obfuscate)。被混淆過的程序代碼,依然遵照原來的檔案格式和指令集,所以依然可以執行,執行結果也和混淆前一樣。只是被混淆過的程序代碼變得更亂,更不輕易被反編譯成功。
  
  有的Java開發工具(例如JBuilder)有內附混淆器(obfuscator),或者你也可以購買功能更強大的混淆器。這些商業的混淆器通常只做三件事:
  
  -將每一個method內部用更亂的方式組織。
  
  -將Java Constant Pool,或.NET metadata內可以消除的Symbolic Data消除例如PRivate method的名字)。
  
  -將debug信息(例如Java的LocalVariableTable與LineNumberTable)全部刪除。
  
  Obfuscator的作用假如只是如同上述一般,只有method局部的作用,效果不大。
  
  欲大幅度地增加反編譯的難度,必須搭配下列的方式:
  
  -Class內的混淆:將class內的method互相混淆。
  -Class之間的混淆:將class之間的關系混淆,例如將父類別和子類別合并或拆解等。
  
  有一些學術論文有對上述兩點做出研究,但成效仍然不大,而且必須手動調整,無法由軟件自動處理。這方面值得大家投入更深入的研究。
  
  混淆過的程序會碰到下面的問題:
  
  -通常效率會變差
  
  -可能無法執行。我欲過這樣的情況,有可能是混淆器的錯,也有可能是JVM的錯。
  
  假如進行「Class之間的混淆」,稍有不慎,就很可能會無法執行。例如:Java程序中假如有用到instanceof,或者C#程序中有用到is,就要很小心的進行「Class之間的混淆」,否則后果不堪設想。
  
  混淆的目的有兩個層次:
  
  1.  讓程序無法被自動反編譯:例如做出一些非凡的跳躍(goto),讓程序區塊
  (block)的關系無法被找出特定的pattern。
  
  2.  讓程序就算被反編譯成功,也不輕易被程序員閱讀理解:想辦法加入一些不易被識破的程序代碼來欺騙程序員。
  
  Obfuscator不是萬靈丹,假如遇上了一個精通obfuscating技術的人,佐以profiling工具,原始碼還是會落入他的手中。所以,使用obfuscator時,你必須有這樣的心理預備:「防君子,不妨小人;防笨蛋,不防聰明人」。盡可能將軟件放在server改為提供service,而不將軟件賣到客戶手上,這才是上策。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 奉节县| 庆安县| 渑池县| 穆棱市| 乌兰浩特市| 资中县| 大新县| 永德县| 宜阳县| 龙里县| 佛教| 曲水县| 湖北省| 弥渡县| 房产| 大足县| 榕江县| 迭部县| 屏南县| 芜湖县| 沙田区| 陵川县| 鹤峰县| 什邡市| 霍山县| 楚雄市| 田阳县| 江孜县| 河池市| 抚松县| 宿松县| 平果县| 天柱县| 浦县| 莱芜市| 泰兴市| 饶平县| 苍山县| 鲜城| 黄石市| 离岛区|