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

运行成功

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