2010-03-29 63 views
15

是否有類似於Java的OllyDbg/SoftICE的實用程序?即執行類(從jar /帶有類路徑),並且在沒有源代碼的情況下,顯示中間代碼的反彙編,能夠遍歷/跨越/搜索引用/編輯內存中的特定中間代碼/將編輯應用於文件...是否有針對java的反彙編程序+調試器(ala OllyDbg/SoftICE for assembler)?

如果沒有,是否甚至有可能寫這樣的東西(假設我們願意在調試時間內沒有熱點)?

編輯:我不是在談論JAD或JD或Cavaj。這些都是很好的反編譯器,但我不想有一個反編譯器出於幾個原因,最值得注意的是它們的輸出是不正確的(最好,有時只是錯誤的)。我沒有尋找一個神奇的「編譯字節到Java代碼」 - 我想看看即將執行的實際字節。另外,我希望能夠更改這些字節(就像在彙編調試器中一樣),並希望將更改後的部分寫回到類文件中。編輯2:我知道javap存在 - 但它只有一種方法(也沒有任何分析)。 實施例(從vmspec文檔取代碼): 從Java代碼,我們使用 「的javac」 編譯此:

void setIt(int value) { 
    i = value; 
} 
int getIt() { 
    return i; 
} 

到一個Java類文件。使用的javap -c我能得到這樣的輸出:

Method void setIt(int) 
    0 aload_0 
    1 iload_1 
    2 putfield #4 
    5 return 
    Method int getIt() 
    0 aload_0 
    1 getfield #4 
    4 ireturn 

這是拆卸部分OK(不是很好不加分析 - 「欄#4是Example.i」),但我無法找到兩個其他「工具」:

  1. 一個調試器自己翻查指令(包括堆棧,內存轉儲等),允許我檢查實際的代碼和環境。
  2. 一種反轉過程的方法 - 編輯反彙編的代碼並重新創建.class文件(使用編輯後的代碼)。

回答

11

我不認爲這真的是一個完整的答案,但一些可能會提供一些可行的指針:

(1)在觀看方面,並與字節碼直接合作的老BCEL Class Construction Kit可能是有用的(它是我只知道字節碼的GUI編輯器)。 (2)在調試和遍歷字節碼方面,與Eclipse調試器集成的this Eclipse plugin可以滿足您的需求。

我不知道任何將結合這些功能並允許您在代碼執行時操作字節碼的實用程序(至少以您在OllyDbg等中的相同方式)。但是,Java debugger API應該能夠支持在運行時操作代碼(儘管如此,鑑於HotSpot和JIT的性質,我不知道是否可以在調用指令前重寫指令---當前正在執行的字節碼操作碼實際上是解釋器如何選擇實現操作的抽象,與反彙編操作碼實際上是發送給CPU的指令的本地代碼不同。或者,您可以查看Java Instrumentation API,它提供了一種在運行時重新定義字節碼的方法。當然,any of the various open source bytecode manipulation libraries也許能夠提供幫助或提供靈感。

而且,當然,總是可以選擇繞過整個JVM基礎架構,並簡單地將調試器附加到JVM進程。有一些關於in this questionthis page linked from that question的討論。

但是,底線是,你似乎試圖完成的事情,儘管在本地代碼世界的共同點,並不是在Java世界常見的做法(部分原因是使用Java是所有血腥細節的抽象)。這和字節碼反編譯相對簡單的性質(與C++相比)導致了這種類型的需求稀缺的情況,這種類型的工具也是如此。

+0

哇,很好的答案。可惜沒有這樣的工具。我懷疑我會自己創建一個(非常有趣 - 但工作壓力,生活,沒有足夠的領域知識...)。 感謝您的非常完整的答案。 – 2010-04-02 12:18:08

+0

+1所有這些信息幫助了我很多! =)謝謝 – jyz 2010-10-09 23:01:56

2

查看JAD Decomplier來反編譯Java代碼。然後,您可以使用生成的源代碼運行IDE的內置調試器。 IDE可以是IntelliJ,Eclipse或NetBeans。這種方法不是完全自動的,但它應該完成這項工作。

+0

不是我在找什麼 - 請查看我的編輯完整回覆。 – 2010-03-31 08:07:40

+0

那麼,答案是「沒有這樣的事情」。 – 2010-04-01 17:19:12

+0

:(。 有沒有辦法創建這樣的東西?虛擬機調試API是否支持它? – 2010-04-01 21:36:48