前面文章介绍过libinjection编译和例子的使用,那么如果需要在工程中使用编译好的动态连接库该如何处理呢?
我们知道libinjection时c语言的代码,如何在java中调用呢?
提到c,提到java,难道是采用JNI来编写调用接口么,虽然可以,但是还有更方便的选择哦,那就是使用JNA。
只要你用过了 JNA (java native access) , 那你可能就再也不想用 JNI 了。
当然JNA还是无法取代JNI的啦,因为JNA只能java到c的访问,c到java的访问还是老老实实使用JNI吧。
JNA的具体介绍就不做太多说明了,文章下面有使用的例子大家可以参考下。网上也有很多前辈大佬们写的文章可以参阅的。
例子
1、搭建Maven工程,引入jar包
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>4.1.0</version>
</dependency>
2、参考代码
package com.tt;
import com.sun.jna.Library;
import com.sun.jna.Native;
/**
* @author xiaobao
* @version 1.0
* 类说明
* @date 2020/5/21 17:05
*/
public class Injection {
//继承Library,用于加载库文件
public interface InjectionLib extends Library {
// 调用linux下面的so文件,注意,这里只要写injection就可以了,不要写libinjection,也不要加后缀
InjectionLib INSTANCE = (InjectionLib) Native.loadLibrary("injection", InjectionLib.class);
int libinjection_sqli(String input, int slen, byte[] fingerprint);
}
public int libinjection_sqli(String input, int slen, byte[] fingerprint) {
return InjectionLib.INSTANCE.libinjection_sqli(input, slen, fingerprint);
}
public static void main(String[] args) {
Injection ts = new Injection();
byte[] fingerprint = {0};
String input = "sleep(1)";
int slen = input.length();
int issqli;
issqli = ts.libinjection_sqli(input, slen, fingerprint);
if (issqli > 0) {
System.out.println("sqli with fingerprint");
} else {
System.out.println("not sqli");
}
}
}
#运行
java -jar com.tt-1.0-SNAPSHOT.jar
说好的操作简单呢,怎么报错了……差评
仔细看下报错信息,原来需要在指定的目录下
建立对应的目录,不同平台的目录结构不同哈,32和64位的也不一样的,大家注意哈
再次打包运行看看
java -jar com.tt-1.0-SNAPSHOT.jar
sqli with fingerprint
运行成功