Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    86384032

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

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的功能。