今天想浅谈一下JB打包的程序是如何运行的。众人皆知,在windows系统上一个
程序要想运行就必须是PE格式的,我们又知道JAVA的类要想运行就必须要虚拟机
的支持,(在JRE中就是将这个作为参数传递给java.exe).这两个要求是必须同时
满足的,那么我们现在就来看看JBuilder2006中的打包功能是如何做到这点的。
首先启动JB2006,由于我的系统只有256M的内存,所以启动那是相当的慢,趁此
机会去了趟WC,回来时它已经启动完成了,关闭上次的工程并新建工程,然后再
建三个类文件,其中一个main函数,另外两个没有,按照我最初的想法,这种组
合应该是最正常的,因为入口函数只应该有一个,首先将其打包成jar文件,然后
再:File--->New--->Build--->NativeExecutableBuilder(Missing setup
information),然后再一路OK最后ReBuilder一下就行了。此时在工程目录下会有
两个EXE文件:***.exe是命令行启动的而***W.exe是GUI启动的,但前须是这些类
是GUI的(继承于JFrame)。OK前奏已经结束,下面切入正题:
1、PE格式
首先来看一下那个带W的可执行文件有多少,结果为110K,呵呵这应该算是比较大
的了(我是JBuilder我怕谁!),下面用PEID来扫描一下,结果又出来了:
结果是BCB1999的编译器,而且还是SFX(自解压)的 ,其实仔细想一下应该是可以
解释的,JB和这个编译同属于Borland公司的产品,该公司也生产了Delphi的IDE
环境,但它和BCB使用的却是同一套VCL的库文件,不同的只是语法而已,科普完
毕。即然它补识别为BCB那么它的VCL特性有没有被加入其中呢?
现在打开DEDE来对它进行分析,发现是可以的,难道真的可以这样?不过在选扩
展分析和VCL函数识别时我们都失望了,它得到的可用信息数为0。再用OD加载看
看其入口代码:
004010F8 J> $ /EB 10 jmp short JavaMail.0040110A
; 入口
004010FA |66 db 66
; CHAR 'f'
004010FB |62 db 62
; CHAR 'b'
004010FC |3A db 3A
; CHAR ':'
004010FD |43 db 43
; CHAR 'C'
004010FE |2B db 2B
; CHAR '+'
004010FF |2B db 2B
; CHAR '+'
00401100 |48 db 48
; CHAR 'H'
00401101 |4F db 4F
; CHAR 'O'
00401102 |4F db 4F
; CHAR 'O'
00401103 |4B db 4B
; CHAR 'K'
00401104 |90 nop
00401105 |E9 db E9
00401106 . |98C04100 dd offset JavaMail.___CPPdebugHook
0040110A > /A1 8BC04100 mov eax,dword ptr ds:[41C08B]
0040110F . C1E0 02 shl eax,2
00401112 . A3 8FC04100 mov dword ptr ds:[41C08F],eax
00401117 . 52 push edx
00401118 . 6A 00 push 0
; /pModule = NULL
0040111A . E8 BFA30100 call <jmp.&KERNEL32.GetModuleHandleA>
; /GetModuleHandleA
0040111F . 8BD0 mov edx,eax
00401121 . E8 02B90000 call JavaMail.0040CA28
这种入口再熟悉不过了,的确是BCB程序的,到现在为止我们已经知道它只一个拥
有BCB程序PE头信息的EXE文件.
2、虚拟机
应该还记得刚我们在新建类的时候已经做了点额外的工作,现在我们重新建立一
个工程,再建立三个类,并且每个类都有自已的main函数,单独配置都可以运行
并在其中一个类中加入对另外两个类调用的代码。再重复第一次的工作,竟然也
可以得到一个EXE文件,运行可以,它会首先启动那个对其它产生调用的类。
现在打开FileMon对它的执行进行临视,就会了现一些有用的信息,它会在:
C:/Documents and Settings/thinkSJ/Local Settings/Temp
这个临时目录中放出JEn**.tmp那个**的地方是数字,它并不会在执行完时将这个
文件删除,重启时再放出同样的文件,而是不删除文件文件名中的数字部分每次
都加1,这个文件中的内容是什么呢?打开它,就会了现只有一行话:
mainclass javamail.FrameMain,看来它就是靠这句话得到正确的执行顺序的,
而向文件中写入什么就应该是JBuilder的事了,果然是神奇的JBuilder。另外程
序的执行在依赖JRE而不是JBuilder的环境,如果JDK没有安装,即使装有JBuilde
r也是无法运行的,它会搜索环境变量path,得到JDK的安装目录,然后启动虚拟机
,传递参数,就OK了。
让我感到奇怪的一件事是,它为什么会识别为SFX型的文件,而事实证明它的确可
以用WinRar之类软件解压缩,它释放出来的文件与JAR中的文件是相同的,奇怪啊
。