一種向目標進程內注入Java字節碼的方法及裝置的制造方法
【技術領域】
[0001]本發明涉及計算機進程注入技術,尤其涉及一種向目標進程內注入Java字節碼的方法。
【背景技術】
[0002]計算機編程中的注入技術是指將一個二進制文件,比如Iinux上的so文件和windows上的dll文件,注入到目標進程中,以實現對目標進程功能的擴展。另一方面,隨著計算機技術的發展,虛擬機技術得到了廣泛的應用。然而對于那些需要依賴于虛擬機運行的字節碼,就很難采用上述的方法注入到目標進程中。
【發明內容】
[0003]有鑒于此,有必要提供一種向目標進程內注入Java字節碼的方法及裝置,其能將Java字節碼注入到目標進程當中。
[0004]一種向目標進程內注入Java字節碼的方法,所述目標進程運行在一個宿主操作系統上,所述宿主操作系統上還運行有虛擬機,所述方法包括:
[0005]通過所述宿主操作系統提供的系統調用修改所述目標進程的寄存器以加載一個二進制共享庫,所述二進制共享庫內包括隨加載被自動啟動的函數;以及
[0006]通過所述二進制共享庫內自動啟動的函數將指定路徑的包含Java字節碼的文件加載到所述虛擬機中,并調用所述Java字節碼內的入口函數。
[0007]—種向目標進程內注入Java字節碼的裝置,所述目標進程運行在一個宿主操作系統上,所述宿主操作系統上還運行有虛擬機,所述裝置包括:
[0008]本地注入模塊,用于通過所述宿主操作系統提供的系統調用修改所述目標進程的寄存器以加載一個~■進制共孕庫;以及
[0009]Java字節碼加載模塊,其隨所述二進制共享庫加載而被調用,用于將指定路徑的包含Java字節碼的文件加載到所述虛擬機中,并調用所述Java字節碼內的入口函數。
[0010]根據上述的方法及裝置,可以實現向目標進程內注入依賴于虛擬機以及運行在虛擬機上的類庫的Java字節碼,提升了目標進程的功能。
[0011]為讓本發明的上述和其他目的、特征和優點能更明顯易懂,下文特舉較佳實施例,并配合所附圖式,作詳細說明如下。
【附圖說明】
[0012]圖1為一個運行有虛擬機的計算機的結構框圖。
[0013]圖2為第一實施例提供的向目標進程內注入Java字節碼的方法流程圖。
[0014]圖3為安卓設備的結構框圖。
[0015]圖4為第二實施例提供的向目標進程內注入Java字節碼的方法流程圖。
[0016]圖5為第三實施例提供的向目標進程內注入Java字節碼的裝置結構框圖。
[0017]圖6為第四實施例提供的向目標進程內注入Java字節碼的裝置結構框圖。
【具體實施方式】
[0018]為更進一步闡述本發明為實現預定發明目的所采取的技術手段及功效,以下結合附圖及較佳實施例,對依據本發明的【具體實施方式】、結構、特征及其功效,詳細說明如后。
[0019]圖1為一個運行有虛擬機的計算機的結構框圖。可以理解,此處的計算機包括個人電腦、服務器、智能手機、平板電腦等各種具有存儲器、處理器架構的計算設置。如圖1所示,計算機100包括:存儲器102、處理器104以及其他硬件106。可以理解,圖1所示的結構僅為示意,其并不對計算機100的結構造成限定。例如,計算機100還可包括比圖1中所示更多或者更少的組件,或者具有與圖1所示不同的配置。
[0020]存儲器102可用于存儲軟件程序以及模塊,處理器104通過運行存儲在存儲器102內的軟件程序以及模塊,從而執行各種功能應用以及數據處理。存儲器102可包括高速隨機存儲器,還可包括非易失性存儲器,如一個或者多個磁性存儲裝置、閃存、或者其他非易失性固態存儲器。在一些實例中,存儲器102可進一步包括相對于處理器104遠程設置的存儲器,這些遠程存儲器可以通過網絡連接至漏洞檢測服務器100。上述網絡的實例包括但不限于互聯網、企業內部網、局域網、移動通信網及其組合。
[0021]其他硬件106例如可包括顯示器、鍵盤、網卡、音頻電路等等,其一般用于提供輸入/輸出或者與其他設備交換數據的功能。
[0022]上述的軟件程序以及模塊例如可包括:操作系統內核122、JVMl24, Java類庫126以及Java應用程序128。操作系統內核122直接控制各種硬件,其具體的,例如為可為Windows操內容或者Linux內核。JVM124運行在系統內核122上,其實質上是一個虛構出來的計算機,通過在操作系統內核122上仿真模擬各種計算機功能來實現的。JVM124 —般包括一套字節碼指令集、一組寄存器、一個棧、一個垃圾回收堆和一個存儲方法域。JVMl24屏蔽了與具體操作系統平臺相關的信息,使Java程序只需生成在Java虛擬機上運行的目標代碼(字節碼),就可以在多種平臺上不加修改地運行。JVM124在執行字節碼時,實際上最終還是把字節碼解釋成具體平臺上的機器指令執行。Java類庫126是為了編程方便而提供的公共類庫,Java類庫126內可提供各種接口,以提供不同的功能,這些接口可被應用程序層引用。Java應用程序128是基于Java類庫的各種接口實現的具有各種功能的應用程序。
[0023]進一步地,上述軟件程序以及模塊還可包括:本地二進制共享庫130以及Java本地接口(Java Native Interface, JNI) 132。本地二進制共享庫130例如可為Windows系統下的.dll文件以及Linux系統下的.so文件。JNI132用于在不同JVM實現間提供一個標準接口,從而使Java應用可以使用本地二進制共享庫130,擴充了原有JVM124的功能。
[0024]第一實施例
[0025]本實施例提供一種向目標進程內注入Java字節碼的方法,參閱圖2,上述的方法包括以下步驟:
[0026]步驟S101、通過宿主操作系統提供的系統調用修改所述目標進程的寄存器以加載一個二進制共享庫。
[0027]在計算機系統中,程序代碼運行的兩種模式,一種是用戶模式,一種是內核模式。應用層的應用程序運行在用戶模式下,而設備驅動程序和文件系統運行在內核模式。在用戶模式下運行的程序受到嚴格的管理,不會破壞系統級應用。而在內核模式下運行的程序可以對電腦有完全的訪問權。系統調用就是運行在內核模式下的代碼為運行在用戶模式下的代碼提供服務。
[0028]以Linux系統為例,其系統調用通過int80h實現,用系統調用來區分入口函數。操作系統實現系統調用的基本過程是:應用程序調用庫函數(API) ;API將系統調用號存入EAX,然后通過中斷調用使系統進入內核態;內核中的中斷處理函數根據系統調用號,調用對應的內核函數(系統調用);系統調用完成相應功能,將返回值存入EAX,返回到中斷處理函數;中斷處理函數返回到API中;API將EAX返回給應用程序。
[0029]應用程序調用系統調用的過程是:把系統調用的編號存入EAX;把函數參數存入其它通用寄存器;觸發0x80號中斷(int0x80 )。
[0030]具體地,在Linux系統中,可以通過ptrace函數修改目標進程的寄存器,以調用dlopen函數。而dlopen函數是用來加載二進制共享庫的。在其他操作系統中,具體的命令可能會不一樣,但是其原理及過程是類似的。
[0031]所述的二進制共享庫例如可為圖1所示的二進制共享庫130,其內包括自動啟動的函數。在一個實例中,上述的自動啟動是通過全局變量來實現的。例如,在c/c++語言里,某個二進制共享庫(動態鏈接庫)被dlopen加載時,全局變量要被自動初始化,這時任意一個初始化時的函數調用都可以作為入口函數,在這個入口函數就可以完成所有需要的事件。
[0032]步驟S102,所述二進制共享庫將指定路徑的包含Java字節碼的文件加載到虛擬機中,并調用所述Java字節碼內的入口函數。
[0033]如上所述,在二進制共享庫被加載后,其內自動啟動的函數被啟動,啟動后即執行步驟S102,將指定路徑的包含Java字節碼的文件加載到虛擬機中,并可通過JNI132調用加載的Java字節碼內包含的入口函數。從而Java字節碼內的指令被執行,這些Java字節碼內的指令可以使用Java類庫內的各種接口,從而實現基于Java類庫的各種功能,即執行步驟 S103。
[0034]根據本實施例的方法,可以實現向目標進程內注入依賴于虛擬機以及運行在虛擬機上的類庫的Java字節碼,提升了目標進程的功能。
[0035]第二實施例
[0036]本實施例提供一種向目標進程內注入Java字節碼的方法,其與第一實施例的方法相似,其不同之處在于,本實施例的方法是應用于運行安卓(Android)操作系統的設備上。
[0037]參閱圖3,其為一個Android設備的架構示意圖。如圖3所示,Android設備200包括:存儲器102、處理器104以及其他硬件106,其與圖1所示相似,可一并參以上述描述。
[0038]圖3的存儲器102內的軟件程序以及模塊例如可包括:Linux內核222、Delvik虛擬機224、Android框架226以及Android應用程序228。Linux內核122直接控制各種硬件。Delvik 虛擬機(Delvik Virtual Machine,DVM) 224 運行在系統內核 222 上。JVMl24是一種堆棧機器,而DVM224則是寄存器機。