libinjection隨筆(二):libinjection動態連接庫使用

前面文章介紹過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

運行成功

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章