Feeling - BlogJava

来源:百度文库 编辑:神马文学网 时间:2024/04/30 14:04:30
解决Exe4j无法从GreenJVMMake生成的JRE加载main class的问题GreenJVMMake 是一个精简JRE的小工具,详细信息请参见项目:

http://code.google.com/p/greenvm/

javaonepackage 是一个集成了GreenJVMMake的IDE,可以方便的生成自定义的JRE,详细信息请参见项目:

http://code.google.com/p/javaonepackage/

比较遗憾的是javaonepackage的作者遗失了代码,导致项目无法进一步的更新,影响了使用。

用以上工具生成的精简JRE通常不超过2M,可是用exe4j将Java应用转换成exe的时候,却会抛出Couldn't load mainclass,原因是因为exe4j使用自己的jar来加载用户的Jar包,这其中用到了一些反射机制,精简JRE里面当然是不含有多余的class文件的,所以加载必然失败。我们需要做的就是把这些相关的class添加到精简JRE中,这些class包含在 java\lang, java\util, sun\reflect 这三个包中。将这些class添加到精简jre中,大小也仅仅增加数百K而已,在我们可以的接受范围之内。

PS:由于GreenJVMMake的机制是检查运行时加载的class文件,所以它很可能遗失Jar运行所需要的exceptionclass,这会导致运行时JVM的崩溃,用户需手动加载所有可能会产生的exception class,包含runtime的和非runtime的。posted @ 2010-09-02 10:53 三人行,必有我师焉 阅读(1046) | 评论 (1) | 编辑 收藏

2010年8月22日#

从exe4j生成的exe中抽取jar文件现在网络上越来越流行.net和java写的客户端的小应用程序,而且后缀是exe。本文讨论的是如何从exe4j封装的exe文件中将自己想要的jar抽取出来。

exe4j一直是一种比较通用的javaexe封装工具,但是其并没有将jar转换为本地文件,而是将jar文件通过特殊处理后,封装成的一个exe文件。因此只要我们了解了exe4j的原理,就可以将jar文件从exe文件中提取出来,并通过反编译工具来查看程序代码。

1. 分析Exe4J,得知其在添加文件到.exe时,使用0x88将文件内容Xor,所以第一步,我们需要将原始的数据提取出来:
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();
    }
}
2.分析提取出来的数据文件,使用WinHex查看其16进制代码。由于Jar文件的开头总是PK开头,并且总包含有manifest.mf文件,并且结尾总是有3个00,同时结尾段有整个Jar包文件的索引,我们可以根据这一特性来分析我们需要的片段。

1、搜索Jar的manifest,然后往前找,找到的第一个PK段,即为一个Jar的开头。
2、查看片段里Jar里的每个class信息,直到最后的文件索引片段。
3、一个Jar的结束片段位于索引片段之后,仍然包含着PK段,并且最后包含着3个00,且这3个00距离PK大概20个字节左右

根据以上3条准则,足以提取整个Jar数据段,然后导入新文件中,并且以zip字段命名,尝试用ZIP解压缩软件打开,看看是否抽取正确。

需要注意的是WinHex非注册版,只能保存280K大小的文件,更大的Jar文件,需要注册版的WinHex才行。posted @ 2010-08-22 01:03 三人行,必