【技术原创】Java利用技巧——通过JNI加载dll

admin 2022年3月7日20:48:38评论102 views字数 2224阅读7分24秒阅读模式

【技术原创】Java利用技巧——通过JNI加载dll

【技术原创】Java利用技巧——通过JNI加载dll
0x00 前言

Java可以通过JNI接口访问本地的动态连接库,从而扩展Java的功能。本文将以Tomcat环境为例,介绍通过jsp加载dll的方法,开源代码,记录细节。

【技术原创】Java利用技巧——通过JNI加载dll
0x01 简介

本文将要介绍以下内容:

  • 基础知识

  • Java通过JNI加载dll的方法

  • jsp通过JNI加载dll的方法

【技术原创】Java利用技巧——通过JNI加载dll
0x02 基础知识

JNI,全称Java Native Interface,是Java语言的本地编程接口。可以用来调用dll文件

调用JNI接口的步骤:

1、编写Java代码,注明要访问的本地动态连接库和本地方法

2、编译Java代码得到.class文件

3、使用javah生成该类对应的.h文件

4、使用C++实现函数功能,编译生成dll

5、通过Java调用dll

【技术原创】Java利用技巧——通过JNI加载dll
0x03 Java通过JNI加载dll的方法

本节将要实现通过Java加载dll,在命令行输出"Hello World"

1.编写Java代码,注明要访问的本地动态连接库和本地方法

HelloWorld.java:

【技术原创】Java利用技巧——通过JNI加载dll

注:

也可以使用System.load指定加载dll的绝对路径,代码示例:System.load("c:\test\Hello.dll");

上述代码注明了要访问本地的Hello.dll,调用本地方法print()

2.编译Java代码得到.class文件

cmd命令:

【技术原创】Java利用技巧——通过JNI加载dll

命令执行后,生成文件HelloWorld.class

3.使用javah生成该类对应的.h文件

cmd命令:

【技术原创】Java利用技巧——通过JNI加载dll

命令执行后,生成文件HelloWorld.h

为了简化后续C++工程的配置,这里需要修改HelloWorld.h,将#include

【技术原创】Java利用技巧——通过JNI加载dll

4.使用C++实现函数功能,编译生成dll

使用Visual Studio,新建一个C++项目Hello,选中win2控制台应用程序, 应用程序类型为DLL,附加选项:导出符号

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

【技术原创】Java利用技巧——通过JNI加载dll

项目需要引用以下三个文件:

jni.h,位置为%jdk%includejni.h

jni_md.h,位置为%jdk%includewin32jni_md.h

HelloWorld.h,使用javah生成

编译生成dll

注:

测试环境为64位系统,所以选择生成64位的Hello.dll

5.通过Java调用dll

将Hello.dll和HelloWorld.class保存在同级目录,执行命令:

【技术原创】Java利用技巧——通过JNI加载dll

获得返回结果:

【技术原创】Java利用技巧——通过JNI加载dll

加载成功

【技术原创】Java利用技巧——通过JNI加载dll
0x04 jsp通过JNI加载dll的方法

本节将要实现在Tomcat环境下,通过访问jsp文件,执行cmd命令并获得命令执行结果

1.编写Java代码,注明要访问的本地动态连接库和本地方法

testtomcat_jsp.java:

【技术原创】Java利用技巧——通过JNI加载dll

Tomcat环境下,需要以下限制条件:

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

java文件名称需要固定格式:***_jsp,并且后面的jsp文件名称需要同其保持一致。例如testtomcat_jsp.java,那么最终jsp的文件名称需要命名为testtomcat.jsp

类名不需要限定为JniClass,可以任意

2.编译Java代码得到.class文件

cmd命令:

【技术原创】Java利用技巧——通过JNI加载dll

命令执行后,生成文件testtomcat_jsp.class和testtomcat_jsp$JniClass.class

3.使用javah生成该类对应的.h文件

将testtomcat_jsp$JniClass.class保存在orgapachejsp下

cmd命令:

【技术原创】Java利用技巧——通过JNI加载dll

命令执行后,生成文件org_apache_jsp_testtomcat_jsp_JniClass.h

为了简化后续C++工程的配置,这里需要修改org_apache_jsp_testtomcat_jsp_JniClass.h,将#include

【技术原创】Java利用技巧——通过JNI加载dll

4.使用C++实现函数功能,编译生成dll

使用Visual Studio,新建一个C++项目TestTomcat,选中win2控制台应用程序, 应用程序类型为DLL,附加选项:导出符号

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

【技术原创】Java利用技巧——通过JNI加载dll

注:

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

项目需要引用以下三个文件:

jni.h,位置为%jdk%includejni.h

jni_md.h,位置为%jdk%includewin32jni_md.h

org_apache_jsp_testtomcat_jsp_JniClass.h,使用javah生成

编译生成dll

注:

测试环境为64位系统,所以选择生成64位的TestTomcat.dll

5.通过jsp调用dll

向Tomcat上传TestTomcat.dll,在Web目录创建testtomcat.jsp,内容如下:

【技术原创】Java利用技巧——通过JNI加载dll

注:

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

访问URL:http://127.0.0.1:8080/testtomcat.jsp?cmd=whoami

获得命令执行结果,加载成功

【技术原创】Java利用技巧——通过JNI加载dll
0x05 小结

本文以Tomcat环境为例,介绍通过jsp加载dll的方法,开源代码,记录细节,能够扩展jsp的功能。

【技术原创】Java利用技巧——通过JNI加载dll

【技术原创】Java利用技巧——通过JNI加载dll

原文始发于微信公众号(嘶吼专业版):【技术原创】Java利用技巧——通过JNI加载dll

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年3月7日20:48:38
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【技术原创】Java利用技巧——通过JNI加载dllhttps://cn-sec.com/archives/819926.html

发表评论

匿名网友 填写信息