加入收藏 | 设为首页 | 会员中心 | 我要投稿 银川站长网 (https://www.0951zz.com/)- 云通信、基础存储、云上网络、机器学习、视觉智能!
当前位置: 首页 > 服务器 > 安全 > 正文

我们一起谈谈 JNA 调用动态链接库

发布时间:2023-07-26 11:27:40 所属栏目:安全 来源:
导读:在一次实际项目中遇到了无法调用exe可执行文件,听说哥斯拉利用JNA技术实现了内存加载exe、执行命令等操作,特来实践一下。JNA 基础知识JNA全称:Java Native Access,是建立在JNI(Java Native Interface)技术之上

在一次实际项目中遇到了无法调用exe可执行文件,听说哥斯拉利用JNA技术实现了内存加载exe、执行命令等操作,特来实践一下。

JNA 基础知识

JNA全称:Java Native Access,是建立在JNI(Java Native Interface)技术之上的Java开源框架,JNA提供了一组Java工具类用于在运行期间动态访问的系统本地库。简单理解就是:JNA提供了一个"桥梁",可以利用Java代码直接访问动态链接库中的函数。

调用JNI接口

调用JNI接口的步骤为:

创建工程,将dll文件放到工程下

引入JNA相关的jar包

创建继承自Library类的接口

接口中创建对象用于加载DLL/SO的类库

接口中声明DLL/SO类库头文件中暴露的方法

调用该方法

编译DLL

以windows为例,使用Visual Studio 创建一个动态链接库的工程,并定义一个头文件testdll.h和源文件testdll.cpp。简单实现一个SayHello的方法创建testdll.cpp,作用是用来实现被声明的函数。

#include "pch.h"

#include "testdll.h"

 

void SayHello()

{

std::cout << "Hello!你成功了!" << std::endl;

}

创建testdll.h头文件,作用是用来声明需要导出的函数接口

#pragma once

#include <iostream>

extern "C" __declspec(dllexport) void SayHello();

//声明一个可被调用的函数“SayHello()”,它的返回类型是void。

//extern "C"的作用是告诉编译器将被它修饰的代码按C语言的方式进行编译

//__declspec(dllexport),此修饰符告诉编译器和链接器被它修饰的函数或变量需要从DLL导出

而后编译出dll。注意:要DLL位数要与JDK位数相同,否则无法调用。

导入JAR包

首先创建java工程,可以是普通项目也可以是maven功能。maven 需要导入依赖

<dependency>

<groupId>net.java.dev.jna</groupId>

<artifactId>jna</artifactId>

<version>5.13.0</version>

</dependency>

<dependency>

<groupId>net.java.dev.jna</groupId>

<artifactId>jna-platform</artifactId>

<version>5.13.0</version>

</dependency>

普通工程可以在 https://github.com/java-native-access/jna 下载jna jar包和platform jar包并导入。

(编辑:银川站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!