現(xiàn)在網(wǎng)絡(luò)上越來(lái)越流行.net和java寫(xiě)的客戶端的小應(yīng)用程序,而且后綴是exe。本文討論的是如何從exe4j封裝的exe文件中將自己想要的jar抽取出來(lái)。
exe4j一直是一種比較通用的java exe封裝工具,但是其并沒(méi)有將jar轉(zhuǎn)換為本地文件,而是將jar文件通過(guò)特殊處理后,封裝成的一個(gè)exe文件。因此只要我們了解了exe4j的原理,就可以將jar文件從exe文件中提取出來(lái),并通過(guò)反編譯工具來(lái)查看程序代碼。
1. 分析Exe4J,得知其在添加文件到.exe時(shí),使用0x88將文件內(nèi)容Xor,所以第一步,我們需要將原始的數(shù)據(jù)提取出來(lái):
import java.io.*;
import java.util.*;
public class gen {
public static void main(String args[]) throws IOException {
FileInputStream fin = new FileInputStream(args[0]); // 可以將整個(gè)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();
}
}
2.分析提取出來(lái)的數(shù)據(jù)文件,使用WinHex查看其16進(jìn)制代碼。由于Jar文件的開(kāi)頭總是PK開(kāi)頭,并且總包含有manifest.mf文件,并且結(jié)尾總是有3個(gè)00,同時(shí)結(jié)尾段有整個(gè)Jar包文件的索引,我們可以根據(jù)這一特性來(lái)分析我們需要的片段。
1、搜索Jar的manifest,然后往前找,找到的第一個(gè)PK段,即為一個(gè)Jar的開(kāi)頭。
2、查看片段里Jar里的每個(gè)class信息,直到最后的文件索引片段。
3、一個(gè)Jar的結(jié)束片段位于索引片段之后,仍然包含著PK段,并且最后包含著3個(gè)00,且這3個(gè)00距離PK大概20個(gè)字節(jié)左右
根據(jù)以上3條準(zhǔn)則,足以提取整個(gè)Jar數(shù)據(jù)段,然后導(dǎo)入新文件中,并且以zip字段命名,嘗試用ZIP解壓縮軟件打開(kāi),看看是否抽取正確。
需要注意的是WinHex非注冊(cè)版,只能保存280K大小的文件,更大的Jar文件,需要注冊(cè)版的WinHex才行。