前面文章介紹過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
運行成功