Jump to content

0x00 前言Java可以通過JNI接口訪問本地的動態連接庫,從而擴展Java的功能。本文將以Tomcat環境為例,介紹通過jsp加載dll的方法,開源代碼,記錄細節。

0x01 簡介本文將要介紹以下內容:

基礎知識

Java通過JNI加載dll的方法

jsp通過JNI加載dll的方法

0x02 基礎知識JNI,全稱Java Native Interface,是Java語言的本地編程接口。可以用來調用dll文件

調用JNI接口的步驟:

1、編寫Java代碼,註明要訪問的本地動態連接庫和本地方法

2、編譯Java代碼得到.class文件

3、使用javah生成該類對應的.h文件

4、使用C++實現函數功能,編譯生成dll

5、通過Java調用dll

0x03 Java通過JNI加載dll的方法本節將要實現通過Java加載dll,在命令行輸出'Hello World'

1.編寫Java代碼,註明要訪問的本地動態連接庫和本地方法HelloWorld.java:

image.png

注:

也可以使用System.load指定加載dll的絕對路徑,代碼示例:System.load('c:\\test\\Hello.dll');

上述代碼註明了要訪問本地的Hello.dll,調用本地方法print()

2.編譯Java代碼得到.class文件cmd命令:

image.png

命令執行後,生成文件HelloWorld.class

3.使用javah生成該類對應的.h文件cmd命令:

image.png

命令執行後,生成文件HelloWorld.h

為了簡化後續C++工程的配置,這裡需要修改HelloWorld.h,將#include

image.png

4.使用C++實現函數功能,編譯生成dll使用Visual Studio,新建一個C++項目Hello,選中win2控制台應用程序, 應用程序類型為DLL,附加選項:導出符號

修改dllmain.cpp或者Hello.cpp均可,具體代碼如下:

image.png

項目需要引用以下三個文件:

jni.h,位置為%jdk%\include\jni.h

jni_md.h,位置為%jdk%\include\win32\jni_md.h

HelloWorld.h,使用javah生成

編譯生成dll

注:

測試環境為64位系統,所以選擇生成64位的Hello.dll

5.通過Java調用dll將Hello.dll和HelloWorld.class保存在同級目錄,執行命令:

image.png

獲得返回結果:

image.png

加載成功

0x04 jsp通過JNI加載dll的方法本節將要實現在Tomcat環境下,通過訪問jsp文件,執行cmd命令並獲得命令執行結果

1.編寫Java代碼,註明要訪問的本地動態連接庫和本地方法testtomcat_jsp.java:

image.png

Tomcat環境下,需要以下限制條件:

固定包名格式為org.apache.jsp

java文件名稱需要固定格式:***_jsp,並且後面的jsp文件名稱需要同其保持一致。例如testtomcat_jsp.java,那麼最終jsp的文件名稱需要命名為testtomcat.jsp

類名不需要限定為JniClass,可以任意

2.編譯Java代碼得到.class文件cmd命令:

image.png

命令執行後,生成文件testtomcat_jsp.class和testtomcat_jsp$JniClass.class

3.使用javah生成該類對應的.h文件將testtomcat_jsp$JniClass.class保存在\org\apache\jsp\下

cmd命令:

image.png

命令執行後,生成文件org_apache_jsp_testtomcat_jsp_JniClass.h

為了簡化後續C++工程的配置,這裡需要修改org_apache_jsp_testtomcat_jsp_JniClass.h,將#include

image.png

4.使用C++實現函數功能,編譯生成dll使用Visual Studio,新建一個C++項目TestTomcat,選中win2控制台應用程序, 應用程序類型為DLL,附加選項:導出符號

修改dllmain.cpp或者TestTomcat.cpp均可,具體代碼如下:

image.png image.png

注:

代碼JNIEXPORT jstring JNICALL Java_org_apache_jsp_testtomcat_1jsp_00024JniClass_exec(JNIEnv *env, jobject class_object, jstring jstr)需要和頭文件中的聲明保持一致

項目需要引用以下三個文件:

jni.h,位置為%jdk%\include\jni.h

jni_md.h,位置為%jdk%\include\win32\jni_md.h

org_apache_jsp_testtomcat_jsp_JniClass.h,使用javah生成

編譯生成dll

注:

測試環境為64位系統,所以選擇生成64位的TestTomcat.dll

5.通過jsp調用dll向Tomcat上傳TestTomcat.dll,在Web目錄創建testtomcat.jsp,內容如下:

image.png

注:

jsp文件名稱需要同之前的java文件保持一致

訪問URL:http://127.0.0.1:8080/testtomcat.jsp?cmd=whoami

獲得命令執行結果,加載成功

0x05 小結本文以Tomcat環境為例,介紹通過jsp加載dll的方法,開源代碼,記錄細節,能夠擴展jsp的功能。

0 Comments

Recommended Comments

There are no comments to display.

Guest
Add a comment...