jni安全利用的简单学习

news/2024/9/23 23:33:23/文章来源:https://www.cnblogs.com/A8k1a4/p/18428175

首先定义一个最简单的类

public class EvilClass  {public static native String execCmd(String cmd);
}

因为我是MacOs端,在当前目录执行

javac EvilClass.java
javac -h . EvilClass.java

生成 EvilClass.h 文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include </Users/这里找不到,可以直接通过绝对路径添加头文件/jni.h>
#include </Users/这里找不到,可以直接通过绝对路径添加头文件/jni_md.h>
/* Header for class EvilClass */#ifndef INCLUDED_EVILCLASS  // 修改了预处理器宏名,避免以下划线开头
#define INCLUDED_EVILCLASS#ifdef __cplusplus
extern "C" {
#endif/** Class:     EvilClass* Method:    execCmd* Signature: (Ljava/lang/String;)Ljava/lang/String;*/
JNIEXPORT jstring JNICALL Java_EvilClass_execCmd(JNIEnv *, jclass, jstring);#ifdef __cplusplus
}
#endif#endif  // INCLUDED_EVILCLASS

查找的命令如下

find $JAVA_HOME -name "jni.h"

并且需要针对CmakeList.txt进行修改

键入C代码

//
// Created by water aka on 2024/9/23.
//#include <string.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include "EvilClass.h"int execmd(const char *cmd, char *result)
{char buffer[1024*12]; //定义缓冲区FILE *pipe = popen(cmd, "r"); //打开管道,并执行命令if(!pipe)return 0; //打开管道,并执行命令while (!feof(pipe)){if(fgets(buffer , 128 , pipe)){//将管道输出到result中strcat(result, buffer);}}pclose(pipe);return 1;
}
JNIEXPORT jstring JNICALL Java_EvilClass_execCmd(JNIEnv *env, jclass class_object, jstring jstr)
{const char *cstr = (*env)->GetStringUTFChars(env, jstr, NULL);char result[1024 * 12] = ""; //定义存放结果的字符串数组if (1 == execmd(cstr, result)){// printf(result);}char return_messge[100] = "";strcat(return_messge, result);jstring cmdresult = (*env)->NewStringUTF(env, return_messge);//system();return cmdresult;
}

编译生成对应动态链接库文件

gcc -fPIC -I"/Library/对应CmakeList.txt的路径/include" \
-I"/Library//Library/对应CmakeList.txt的路径/include/darwin" \
-shared -o libcmd.jnilib EvilClass.c

后续通过System.load 构建java,调用即可

这里有一个坑点,因为刚接触JNI,所以没发现,相同的代码在不同类下,不能够执行命令,例如

原因是JNI 方法签名不匹配

JNI 方法签名是由类名、包名和方法名组合而成的。如果类名不一样,即使方法内容相同,JNI 也会因为签名不匹配而无法正确调用方法。

对于类 EvilClass,在 JNI 中,方法名是 Java_EvilClass_execCmd,而对于类 Eclass,方法名应该是 Java_Eclass_execCmd

也就是Java_EvilClass_execCmdJava_Eclass_execCmd 的区别

如果 Java 类是 EvilClass,那么 JNI 方法的签名应该是:

JNIEXPORT jstring JNICALL Java_EvilClass_execCmd(JNIEnv *, jclass, jstring);

如果 Java 类是 Eclass,那么 JNI 方法的签名应该是:

JNIEXPORT jstring JNICALL Java_Eclass_execCmd(JNIEnv *, jclass, jstring);

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/802484.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day6[Llamaindex RAG实践]

"xtuner是什么?"在使用 LlamaIndex 之前InternLM2-Chat-1.8B模型不会回答借助 LlamaIndex 后 InternLM2-Chat-1.8B 模型具备回答的能力

【专题】2024AI智慧生活白皮书:AI智能科技重塑居家体验报告合集PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p=37748 AI 已然成为家电家居市场的创新核心动力,可在个性化识别、预测维护等多方面提升产品价值。家享生活行业智能化展现多元场景,清洁智能崛起超厨房智能居第二,全屋智能潜力巨大。“套装 / 集成智能” 等品类增长快,智能新客多由老客升级…

kettle从入门到精通 第八十七课 ETL之kettle kettle文件上传

1、kettle本身文件上传功能不是很友好,甚至是不能直接使用,需要调整文件上传接口才可以正常接收到文件,本次讲解内容主要是通过自定义插件解决这个问题。 2、通过springboot 编写简单demo,模拟文件上传,接口支持三个参数unitCode、password、和文件dataFile。 java代码如下…

密码学承诺原理与应用 - 概览

作者:@warm3snow https://github.com/warm3snow 微信公众号:密码应用技术实战 博客园首页:https://www.cnblogs.com/informatics/ 标签:技术分享模板目录简介承诺方案原理符号定义方案定义常见承诺方案和原理哈希承诺ElGamal承诺Pedersen承诺零知识证明承诺Sigma承诺Sigma承…

Rhino基础操作1

Rhino的基础操作,包含视图操作、物件选取等非常基础的,本篇未涉及到具体的工具。注:非结构建模专业,纯粹是用Rhino写实用新型专利,所以学了下Rhino的建模。不理解最简面、曲线阶数的影响等,请原谅。--本篇导航--常用命令、鼠标中键菜单 基础设置(修改默认单位尺寸、修改…

arm各个集成开发环境+rvds4.1

ARM 之 各集成开发环境(IDE)说明(Keil、RVDS、ADS、DS-5、MDK) - xiaoheikkkk - 博客园 (cnblogs.com)最近,ARM官网进行了较大的改版,原来很多老工具可以免费下载(付费使用),但是改版后需要有购买凭证才可以下载!部分旧工具(补丁)的具体下载地址为https://silver.a…

python代码

1.求1+2+3+4+5+6+7+8+9+102.

FreeMarker 禁止自动转义标签-noautoesc

💖简介 FreeMarker 是一个用 Java 语言编写的模板引擎,它被设计用来生成文本输出(HTML 网页、电子邮件、配置文件等)。在 FreeMarker 中,默认情况下,当你在模板中输出变量时,如果这些变量包含 HTML 标签,FreeMarker 会自动转义这些标签以防止 XSS(跨站脚本攻击)。 �…

企业级堡垒机 JumpServer

1 堡垒机和 JumpServer 生产应用场景2 JumpServer 安装 2.1 基于 Docker 部署官方说明 https://docs.jumpserver.org/zh/master/install/setup_by_fast/JumpServer 环境要求: 硬件配置: 2个CPU核心, 4G 内存, 50G 硬盘(最低) 案例:基于自定义网络利用Docker部署 JumpServe…

9.23 csp

今天模拟赛出了四道zroi的题,挺GG的。 T1、奇观 因为删除的边比较少,所以从m入手,f[i][j]表示长度为i,终点为j的链的方案数。 C 是长度为3的链,F是 1条 长度为3 的链 和 2条 长度为2 的链。 输出 CCF 即可 G T2、铁路 救命的签到题。 因为每次合并时每走一个点就会减少一个…

业财一体化视角下-电商ERP采购模块的设计

本文将深入探讨如何在采购模块的设计中有效体现业财一体化理念,从财务三大报表的基本概念出发,详细解析采购过程中的财务管理关键要素,并分享采购流程设计中应注意的重点,以期为企业提供有价值的参考和指导。业财一体化的重要性日益凸显,越来越多企业认识到业务运营与财务管…

第二十三讲:MySQL是怎么保证主备一致的?

第二十三讲:MySQL是怎么保证主备一致的? 简概开篇 ​ 在前面的文章中,我不止一次地和你提到了 binlog,大家知道 binlog 可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了 binlog 就可以跟主库保持一致了呢?今天我就正式地和你介绍一下它。毫…