日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于如何使用反编译器,获取源码清单

發(fā)布時間:2024/4/15 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于如何使用反编译器,获取源码清单 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>

關(guān)于反編譯器? ?? ?從概念上講,反編譯器使用起來非常簡單。他就是把編譯器逆過來用:你給它 .class 文件,它還給你一個源代碼文件。
? ?? ?一些比較新的反編譯器有精致的圖形界面。但在一開始所舉的例子中,我們將使用的是 Mocha,它是第一個公開的可利用的反編譯器。在本文的最后,我會討論一下在 GPL 下一個較新的反編譯器。(請參閱參考資料,下載 Mocha 并獲取 Java 反編譯器的清單。)
? ?? ? 讓我們假設(shè)在目錄中有一個名為 Foo.class 的類文件。用 Mocha 對它進(jìn)行反編譯非常簡單,只要鍵入以下命令:
$ java mocha.Decompiler Foo.class
? ?? ?這會生成一個新的名為 Foo.mocha 的文件(Mocha 使用 Foo.mocha 這個名字以避免覆蓋原文件的源代碼)。這個新文件就是 Java 的源文件,并且假設(shè)一切順利的話,您現(xiàn)在就能正常地編譯它。只需把它重命名為 Foo.java 就可以開始了。

? ?? ?但是這兒有個問題:如果在一些您已經(jīng)有所改動的代碼上運(yùn)行 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 的位置不同。在原始源代碼中,它在與聲明的同一行中被表示為一個初始值,而在被反編譯后的源代碼中,它在一個構(gòu)造符中被表示為一條賦值語句。反編譯后的代碼告訴我們一些有關(guān)源代碼被編譯的方法;即它的初始值是作為在構(gòu)造符中的賦值來被編譯的。通過觀察其反編譯后的輸出結(jié)果,您能了解到不少 Java 編譯器的工作方法。
反編譯是困難的:不斷重復(fù)?? ?? ?雖然 Mocha 的確可以反匯編您的目標(biāo)代碼,但它不會總是成功的。由于困難重重,沒有一個反編譯器能夠準(zhǔn)確無誤地翻譯出源代碼,而且每個反編譯器處理它們在翻譯過程中的漏洞的方式也不同。舉例來說,Mocha 有時在輸出準(zhǔn)確的循環(huán)構(gòu)造的結(jié)構(gòu)方面有一些問題。如果真的這樣,它會在最終輸出中使用偽 goto 語句,如清單 5 所示。
清單 5. Mocha 不能準(zhǔn)確地反編譯? ?? ?? ???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 的問題不談,反編譯器在通常情況下還是能比較準(zhǔn)確地翻譯出源代碼。一旦知道了某一反編譯器的弱點(diǎn),您可以手工分析和轉(zhuǎn)換反編譯后的代碼,以使它們能較準(zhǔn)確地符合原始源代碼。隨著反編譯器正變得越來越出色,
? ?? ?我們又碰到了另外一個問題:如果您不想讓任何人能反編譯您的代碼,那該怎么辦呢?小編在此友情推薦:愛加密安卓破解技術(shù)有哪些?如何防反編譯,講解的還不錯:http://www.ijiami.cn/newsInfo?id=289&v=3

轉(zhuǎn)載于:https://my.oschina.net/1590538xiaokai/blog/483646

總結(jié)

以上是生活随笔為你收集整理的关于如何使用反编译器,获取源码清单的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。