JBuilder2006打包的PE文件

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章