关于如何使用反编译器,获取源码清单
2019獨角獸企業重金招聘Python工程師標準>>>
關于反編譯器? ?? ?從概念上講,反編譯器使用起來非常簡單。他就是把編譯器逆過來用:你給它 .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 == goto 201? ?? ?? ???continue;? ?? ?? ???i2 = i3;
? ?? ?撇開 Mocha 的問題不談,反編譯器在通常情況下還是能比較準確地翻譯出源代碼。一旦知道了某一反編譯器的弱點,您可以手工分析和轉換反編譯后的代碼,以使它們能較準確地符合原始源代碼。隨著反編譯器正變得越來越出色,
? ?? ?我們又碰到了另外一個問題:如果您不想讓任何人能反編譯您的代碼,那該怎么辦呢?小編在此友情推薦:愛加密安卓破解技術有哪些?如何防反編譯,講解的還不錯:http://www.ijiami.cn/newsInfo?id=289&v=3
轉載于:https://my.oschina.net/1590538xiaokai/blog/483646
總結
以上是生活随笔為你收集整理的关于如何使用反编译器,获取源码清单的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux网络流量实时监控工具-ifst
- 下一篇: Spring框架笔记(二十二)——切点表