亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

如何封鎖您的(或打開別人的)Java 代碼

2019-11-18 12:05:22
字體:
來源:轉載
供稿:網友

  無論是修改許多網上開放源代碼庫中的代碼,還是調用常見的操作系統例行程序,您免不了要花一些時間去琢磨您沒有編寫過的代碼,而且您還可能沒有這些代碼的源文件。在開始調試代碼時,您需要有一個好的 java 反編譯器,并了解正確使用它的技術。同時,您還要知道如何保護您自己的代碼不被窺視。為此,您還需了解有關代碼模糊處理的問題。在這篇有關打開和封鎖 Java 代碼的初學者指南中, Greg Travis 使用 Mocha、HoseMocha、jmangle 和 JODE 等流行工具中的示例,來循序漸進地教你有關反匯編、反編譯和 Java 代碼模糊處理的基礎知識。
  沒有比發現一個錯誤,卻沒有源代碼就不能修改更令人沮喪的了。正是這個原因導致了 Java 反編譯器的出現,它可以把編譯后的字節碼完全轉回成源代碼。盡管代碼反編譯器不只是針對 Java 語言,但它從來沒有象在 Java 開發人員中那樣被公開地或廣泛地使用。
  
  與反編譯針鋒相對的是模糊處理。假設反編譯人員能很輕易從編譯后的代碼中設法得到源代碼,那么要保護您的代碼和有價值的技術秘密就不是那么簡單了。隨著 Java 反編譯器的普遍使用, Java 模糊處理器也同樣被普及,它的作用就似乎放一塊煙幕在您的代碼前面。反編譯和模糊處理在商業開發領域中引起了一場爭論 -- 爭論中的大部分都集中在了 Java 語言上。
  
  在本文中,我將讓您了解代碼反編譯和模糊處理的具體過程,討論在這兩種技術之后的理論問題,同時簡要地談到它們在商業編程領域中所引起的爭論。我還將介紹一些比較有名的反編譯器和模糊處理器(有商業的,也有開放源代碼的),并隨著文章的深入使用它們來創建一些實例。
  
  什么是反編譯?
  反編譯是一個將目標代碼轉換成源代碼的過程。這應該很清楚了,因為編譯是一個將源代碼轉換成目標代碼的過程。但什么是目標代碼呢?大體上的定義是:目標代碼是一種用語言表示的代碼,這種語言能通過實機或虛擬機直接執行。對于象 C 這樣的語言,目標代碼通常運行在硬件 CPU 上,而 Java 目標代碼通常運行在虛擬機上。
  
  反編譯是困難的
  正如以上所描述的,反編譯聽上去比較簡單,但它實際上是非常困難的 -- 從本質上說,它所包含的是根據小規模、低層次的行為來推斷大規模、高層次的行為。為了對此有個直觀的理解,我們把一個計算機程序看作是一個復雜的公司組織結構。高層治理人員向他們的下屬下達類似“最大程度地提高技術生產能力”的命令,下屬們再把這些命令轉變成更具體的行動,例如安裝新的 xml 數據庫
  
  作為該公司的新雇員,您可能會問下屬他或她在做些什么,并得到回答,“我在安裝新的 XML 數據庫。”從這句話中,您不可能推斷出其最終目的是最大程度地提高技術生產能力。究竟,最終目標不盡相同,例如可能是分離供給鏈或累積消費者的數據。
  
  然而,假如屬于好奇心特強的那類人,您可能會再多問幾個問題,并讓公司中不同級別的下屬回答您的問題。最后,當把所有的答案匯總后,您可能會猜到企業更大的目標是最大程度地提高技術生產能力。
  
  假如您把計算機程序的工作方式看作類似一個公司的組織結構,那么對于為什么反編譯代碼不是無關緊要的,以上的這個比方就會給你一個直接的感受。從比較理論化的角度來看,這兒要引用在該領域的杰出研究員 Cristina Cifuentes 對反編譯過程的描述:
  
  任何一個二進制改造工程都需要對存儲在二進制文件中的代碼進行反匯編。從理論上說,分離 von Neumann 上的數據和代碼就好象停機問題,因此完全的靜態翻譯是不可能的。然而,實際上可以使用不同技術來提高可被靜態翻譯的代碼的所占比例,或者采取可在運行中被使用的動態翻譯技術。
  --"Binary Reengineering of Distributed Object Technology" (請參閱參考資料)
  
  把目標代碼轉換成源代碼并不是反編譯時碰到的唯一問題。一個 Java 類文件潛在包含了一些不同類型的信息。知道類文件中可能包含了哪類信息對于了解您如何利用該信息以及對于信息作何種處理都是很重要的。這其實就是 Java 反匯編器所要做的。
  
  反匯編一個類文件
  Java 類文件的真正二進制格式不是很重要。重要的是知道在那些字節中包含了哪些不同種類的信息。到了這一步,我們將利用多數 JDK 都帶有的一個工具 -- javap。 javap 是一個 Java 代碼反匯編器,它和反編譯器是不同的。反匯編器把機器可讀格式的目標代碼(如清單 1 所示)轉換成人們可讀的代碼(如清單 2 所示)。
  
  清單 1. 一個類文件的原始內容
  0000000 feca beba 0300 2d00 4200 0008 081f 3400
  0000020 0008 073f 2c00 0007 0735 3600 0007 0737
  0000040 3800 0007 0a39 0400 1500 000a 0007 0a15
  0000060 0800 1600 000a 0008 0a17 0800 1800 0009
  ...
  
  清單 2. javap 的輸出結果
  Local variables for method void PRiv(int)
   Foo this pc=0, length=35, slot=0
   int argument pc=0, length=35, slot=1
  
  Method void main(java.lang.String[])
   0 new #4
   3 invokespecial #10
   6 return
  
  請注重,清單 2 所示的并不是源代碼。該清單的第一部分列出了方法的局部變量;第二部分是匯編代碼,它也是人們可讀的目標代碼。
  
  一個類文件中的元素
  javap 被用來反匯編或解包一個類文件。這里簡要列出了可以通過使用 javap 進行反匯編的 Java 類文件所包含的信息:
  
  成員變量。每個類文件中包含了對應于該類每個數據成員的所有名稱信息和類型信息。
  
  經過反匯編后的方法。類的每一個方法都是由一串虛擬機指令來表示的,并附帶它的類型簽名。
  
  行號。每個方法中的每個節被映射到源代碼行,在可能的情況下,源代碼行來生成節。這使得實時系統和調試器能夠為在運行狀態的程序提供堆棧跟蹤。
  
  局部變量名一旦方法被編譯了,這個方法的局部變量就不太需要名稱了,但是能通過對 javac 編譯器使用 -g 選項來包含它們。這也使得實時系統和調試器能幫助您。
  
  既然對 Java 類文件的內部情況已有所了解,讓我們看一下如何能轉換這些信息來達到我們的目的。
  
  使用反編譯器
  從概念上講,反編譯器使用起來非常簡單。他就是把編譯器逆過來用:你給它 .class 文件,它還給你一個源代碼文件。
  
  一些比較新的反編譯器有精致的圖形界面。但在一開始所舉的例子中,我們將使用的是 Mocha,它是第一個公開的可利用的反編譯器。在本文的最后,我會討論一下在 GPL 下一個較新的反編譯器。(請參閱參考資料,下載 Mocha 并獲取 Java 反編譯器的清單。)
  
  讓我們假設在目錄中有一個名為 Foo.class 的類文件。用 Mocha 對它進行反編譯非常簡單,只要鍵入以下命令:
  
  $ java mocha.Decompiler Foo.class
  
  這會生成一個新的名為 Foo.mocha 的文件(Mocha 使用 Foo.mocha 這個名字以避免覆蓋原文件的源代碼)。這個新文件就是 Java 的源文件,并且假設一切順利的話,您現在就能正常地編譯它。只需把它重命名為 Foo.java 就可以開始了。
  
  但是這兒有個問題:假如在一些您已經有所改動的代碼上運行 Mocha,您會注重到它生成的代碼和源代碼不是完全一樣的。我舉個例子,這樣您能明白我的意思。清單 3 所示的原始源代碼是來自一個名為 Foo.java 的測試程序。
  
  清單 3. Foo.java 的一小部分原始源代碼
  
   private int member = 10;
  
   public Foo() {
    int local = returnInteger();
    System.out.println( "foo constrUCtor" );
    priv( local );
   }
  
  以下是 Mocha 生成的代碼
  
  清單 4. Mocha 生成的 Foo.java 的源代碼
  
    private int member;
  
    public Foo()
    {
      member = 10;
      int local = returnInteger();
      System.out.println("foo constructor");
      priv(local);
    }
  
  這兩個代碼片段的成員變量 member 被初始化為 10 的位置不同。在原始源代碼中,它在與聲明的同一行中被表示為一個初始值,而在被反編譯后的源代碼中,它在一個構造符中被表示為一條賦值語句。反編譯后的代碼告訴我們一些有關源代碼被編譯的方法;即它的初始值是作為在構造符中的賦值來被編譯的。通過觀察其反編譯后的輸出結果,您能了解到不少 Java 編譯器的工作方法。
  
  反編譯是困難的:不斷重復
  雖然 Mocha 的確可以反匯編您的目標代碼,但它不會總是成功的。由于困難重重,沒有一個反編譯器能夠準確無誤地翻譯出源代碼,而且每個反編譯器處理它們在翻譯過程中的漏洞的方式也不同。舉例來說,Mocha 有時在輸出準確的循環構造的結構方面有一些問題。假如真的這樣,它會在最終輸出中使用偽 goto 語句,如清單 5 所示。
  
  清單 5. Mocha 不能準確地反編譯
  
      if (i1 == i3) goto 214 else 138;
      j3 = getSegment(i3).getZOrder();
      if (j1 != 1) goto 177 else 154;
      if (j3 > k2 && (!k1 j3 < j2)) goto 203 else 173;
      eXPression 0
      if (j3 < k2 && (!k1 j3 > j2)) goto 203 else 196;
      expression 0
      if == go

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一网中文字幕| 亚洲男人天天操| 97久久精品人人澡人人爽缅北| 欧美性猛交xxxx黑人| 日韩国产高清污视频在线观看| 欧美日韩国产二区| 欧美性生活大片免费观看网址| 亚洲欧美日韩国产精品| 国产热re99久久6国产精品| 国产视频综合在线| 色婷婷久久一区二区| 色播久久人人爽人人爽人人片视av| 成人观看高清在线观看免费| 亚洲自拍小视频| 国产精品一区二区3区| 尤物九九久久国产精品的特点| 欧美激情国产精品| 一区二区三区四区视频| 在线电影欧美日韩一区二区私密| 亚洲视频网站在线观看| 亚洲最新视频在线| 97色在线视频观看| 亚洲天堂免费观看| 神马久久桃色视频| 国产欧美亚洲精品| 在线日韩av观看| 国产欧美日韩精品丝袜高跟鞋| 国产精品爽黄69天堂a| 亚洲美女中文字幕| 91精品国产91久久久久久吃药| 国产免费观看久久黄| 欧美日韩国产va另类| 欧美精品一二区| 亚洲深夜福利视频| 69av成年福利视频| 亚洲老头同性xxxxx| 精品自拍视频在线观看| 91在线免费看网站| 亚洲电影免费观看高清完整版在线观看| 午夜精品一区二区三区在线播放| 国产精品成人aaaaa网站| 午夜精品蜜臀一区二区三区免费| 欧美性猛交xxx| 精品国偷自产在线视频| 久久精品夜夜夜夜夜久久| 久久久精品视频在线观看| 亚洲综合国产精品| 国产在线视频91| 高潮白浆女日韩av免费看| 成人免费大片黄在线播放| 国产有码在线一区二区视频| 久久天天躁狠狠躁老女人| 日韩av网站大全| 免费av在线一区| 欧美国产日韩一区二区三区| 高清欧美性猛交xxxx黑人猛交| 91精品视频一区| 不卡av电影院| 欧美性xxxx极品hd满灌| 国产精品永久免费在线| 亚洲性视频网址| 亚洲精品短视频| 亚洲精品视频网上网址在线观看| 久久久久久久一区二区| 亚洲一区二区在线| 另类少妇人与禽zozz0性伦| 亚洲福利小视频| 91精品视频在线| 成人黄色大片在线免费观看| www.亚洲人.com| 91精品国产乱码久久久久久蜜臀| 亚洲日本中文字幕免费在线不卡| 欧美成人精品不卡视频在线观看| 亚洲女在线观看| 国产91精品不卡视频| 深夜精品寂寞黄网站在线观看| 亚洲一区亚洲二区亚洲三区| 国产精品久久一区| 久久成人这里只有精品| 日韩日本欧美亚洲| 在线观看成人黄色| 国产精品视频一| 亚洲第一福利网| 国内外成人免费激情在线视频| 国产成人精彩在线视频九色| 国产成人avxxxxx在线看| 在线看片第一页欧美| 亚洲美女免费精品视频在线观看| 欧美性xxxxx| 8x海外华人永久免费日韩内陆视频| 91高潮精品免费porn| 欧美日韩中文字幕| 精品久久久久久久大神国产| 欧美激情免费在线| 91在线观看免费高清| 国产成人综合一区二区三区| 狠狠躁夜夜躁人人爽超碰91| 亚洲欧美激情视频| 精品毛片三在线观看| 亚洲人成人99网站| 一个人看的www欧美| 26uuu亚洲伊人春色| 91在线观看免费高清| 性色av一区二区三区| 亚洲区中文字幕| 最近2019中文免费高清视频观看www99| 久久久久久久久中文字幕| 91色在线观看| 亚洲成人国产精品| 91精品视频专区| 2019中文字幕在线免费观看| 91在线观看免费网站| 欧美丰满少妇xxxxx| 丝袜情趣国产精品| 日韩专区在线播放| 69久久夜色精品国产69乱青草| 久久精品国产综合| 日韩电影免费观看在线| 日韩在线观看网址| 91高潮在线观看| 亚洲欧美中文日韩在线| 亚洲人精品午夜在线观看| 国产一区二区丝袜高跟鞋图片| 精品国产福利在线| 亚洲第一区第一页| 中文字幕亚洲激情| 中日韩美女免费视频网址在线观看| 91久久精品一区| 91中文在线视频| 亚洲xxxx视频| 亚洲色图美腿丝袜| 国产一区二区三区在线播放免费观看| 91欧美精品午夜性色福利在线| 中文字幕亚洲综合久久筱田步美| 成人激情视频网| 日韩美女福利视频| 国产精品夜色7777狼人| 欧美极品少妇全裸体| 亚洲精品视频网上网址在线观看| 97精品欧美一区二区三区| 欧洲美女7788成人免费视频| 国产精品999| 精品日韩视频在线观看| 国产在线拍揄自揄视频不卡99| 日韩欧美在线一区| 国产精品久久久久久久久久免费| 国产精品夫妻激情| 国产精品99久久久久久白浆小说| 亚洲综合中文字幕在线观看| 国产精品久久久久久久久久新婚| 日本乱人伦a精品| 激情懂色av一区av二区av| 亚洲性日韩精品一区二区| 亚洲jizzjizz日本少妇| 成人在线观看视频网站| 国产亚洲福利一区| 国产精品自产拍在线观看| 4438全国亚洲精品在线观看视频| 一区国产精品视频| 国产精品丝袜久久久久久不卡| 日韩精品中文字幕在线观看| 亚洲国产精品热久久| 国产成人精品a视频一区www| 亚洲精品少妇网址|