如何分離出exe4j打包的java可執行文件中的jar

今天看到一個比較實用的Java軟件,想知道它是如何實現的,可是這個軟件已經使用exe4j封裝成了可執行文件。經過搜索網絡,看到下面的這篇文章:

http://www.blogjava.net/cnfree/archive/2010/08/22/329559.html

其中的關鍵:

exe文件的解碼(OR 88)
使用WinHex從解碼後的文件中分離出jar文件
其中第一步在文中已經給出了源代碼以下:

import java.io.*;
import java.util.*;
public class gen {
public static void main(String args[]) throws IOException {
FileInputStream fin = new FileInputStream(args[0]); // 能夠將整個exe文件解碼
FileOutputStream fout = new FileOutputStream(args[1]);
BufferedInputStream bin = new BufferedInputStream(fin);
BufferedOutputStream bout = new BufferedOutputStream(fout);
int in = 0;
do {
in = bin.read();
if (in == -1)
break;
in ^= 0x88;
bout.write(in);
} while (true);
bin.close();
fin.close();
bout.close();
fout.close();
}
}

第二步在文章中是這樣描述的:

分析提取出來的數據文件,使用WinHex查看其16進制代碼。因爲Jar文件的開頭老是PK開頭,而且總包含有manifest.mf文件,而且結尾老是有3個00,同時結尾段有整個Jar包文件的索引,咱們能夠根據這一特性來分析咱們須要的片斷。
一、搜索Jar的manifest,而後往前找,找到的第一個PK段,即爲一個Jar的開頭。
二、查看片斷裏Jar裏的每一個class信息,直到最後的文件索引片斷。
三、一個Jar的結束片斷位於索引片斷以後,仍然包含着PK段,而且最後包含着3個00,且這3個00距離PK大概20個字節左右
根據以上3條準則,足以提取整個Jar數據段,而後導入新文件中,而且以zip字段命名,嘗試用ZIP解壓縮軟件打開,看看是否抽取正確。

這個步驟須要不斷嘗試才能獲得正確的文件,經過實踐發現有更簡單的方法:在解碼後的文件中,若是包含多個jar文件,則之間用十六進制88分隔,每一個jar文件均以PK開始,所以能夠在WinHex中這樣操做:

搜索十六進制串: 88888888504B03040A00,其中前面的88分隔符能夠根據須要調整數量,將找到的 PK(504B)標註爲塊的開始,按F3再次搜索此特徵串,從找到的下一個位置處往前搜索到第一個非88的字節做爲塊的結束,而後在Edit|Block 中將選中的塊插入到新文件便可,如今找到的PK的位置即爲下一個jar文件的開始。依次類推,可分離出全部的jar文件,注意:最後一個jar文件的結束 是PK200 (即jar文件所使用的壓縮算法)。

通過實踐,這個方法能快速地找到並分離exe4j打包的exe文件中的jar文件。

更簡單的方法是:

打包成可執行文件的Java程序在運行時,會將jar所有解壓而後調用java運行庫執行,只要到系統temp文件夾中搜索*.jar便可獲得。
相關文章
相關標籤/搜索