今天想淺談一下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中的文件是相同的,奇怪啊
。