首页 > 其他分享 >jni安全利用的简单学习

jni安全利用的简单学习

时间:2024-09-23 23:36:48浏览次数:8  
标签:jstring Java 学习 EvilClass JNI 简单 jni include execCmd

首先定义一个最简单的类

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);

 

标签:jstring,Java,学习,EvilClass,JNI,简单,jni,include,execCmd
From: https://www.cnblogs.com/A8k1a4/p/18428175

相关文章

  • C++学习笔记(三)-----【内联函数】
    1内联函数1.1为什么要有内联函数答:还是为了补C语言的坑,补宏的坑#defineN10//实现一个ADD的宏函数//错误写法#defineADD(intx,inty){returnx+y;}#defineADD(x,y){returnx+y;}#defineADD(x,y)returnx+y;#defineADD(x,y)x+y;//宏不需......
  • 日入300+,民间诡异故事玩法,简单冷门流量大
    民间诡异故事一直以来都是一个受欢迎的题材,随着中视频计划的兴起,创作者能够轻松获得收益,尤其是播放量高的视频,常常能带来可观的收入。对于新手来说,入门门槛相对较低,竞争又不激烈。教程下载:百度网盘链接https://pan.baidu.com/s/1qJAU9nYHyGn65RHtpAGCvw?pwd=6666大纲:1.项目......
  • Spark学习(一):概述
    Spark学习(一):概述上周六面试腾讯时被问到是否了解Spark,彼时对Spark毫无接触故答不了解,面试结束后了解到Spark与MapReduce渊源颇深,去年夏天学习MIT6.824分布式系统设计时曾深入学习过MapReduce(分布式学习:MapReduce-pinoky-博客园(cnblogs.com))故对Spark产生兴趣,由此开始学习......
  • 简单搜索(BFS,DFS,剪枝)一网打尽
    深搜DFS含义深搜是一种遍历或搜索图和树的算法。实现方式(不撞南墙不回头)根据题目选择一个适合的源节点,从源节点开始选择一条路一直走,直到无法前进(不满足题目条件)时,返回到上一个节点重新尝试,直到当前的节点的所有子节点都已经被访问过,再次返回到当前节点的上一节点,继续重复......
  • d2l-ai深度学习日记(一)
    前言:这个博客《d2l-ai深度学习日记》将记录我在深度学习领域的学习与探索,特别是基于《动手学深度学习》这本经典教材的学习过程。在这个过程中,我不仅希望总结所学,还希望通过分享心得,与志同道合的朋友一起交流成长。这不仅是对知识的沉淀,也是我备战研究生考试、追逐学术进阶之......
  • d2l-ai深度学习日记之预备知识(一)
     引言        笔者目前在大三阶段,想跟着研究生老师学习,以便创造更多的深造机会,故学习深度学习.我使用教材d2l-zh进行学习.这篇文章主要是学习预备知识.在此之前,我已经有了python等语言的基本基础.这个博客《d2l-ai深度学习日记》将记录我在深度学习领域的学习与......
  • NLP--自然语言处理学习-day1
    一.初步认识NLP自然语言处理(NaturalLanguageProcessing,NLP)是计算机科学和人工智能(AI)的一个交叉领域,旨在使计算机能够理解、分析、生成和处理人类语言的能力。它结合了计算语言学、人工智能、机器学习和语言学等多个领域的知识。NLP的主要任务文本分类:将文本内容分......
  • 机器学习实战25-用多种机器学习算法实现各种数据分析与预测
    大家好,我是微学AI,今天给大家介绍一下机器学习实战25-用多种机器学习算法实现各种数据分析与预测。本文主要介绍了使用机器学习算法进行数据分析的过程。首先阐述了项目背景,说明进行数据分析的必要性。接着详细介绍了机器学习算法中的随机森林、聚类分析以及异常值分析等方法......
  • 2024最新LLM大模型学习:从零开始精通AI大模型,全面详细的入门指南,非常高详细收藏我这一
    一.初聊大模型1.为什么要学习大模型?在学习大模型之前,你不必担心自己缺乏相关知识或认为这太难。我坚信,只要你有学习的意愿并付出努力,你就能够掌握大模型,并能够用它们完成许多有意义的事情。在这个快速变化的时代,虽然新技术和概念不断涌现,但希望你能静下心来,踏实地学习。一......
  • CMake学习1
    构建一个项目的步骤1.执行编写cmakelists.txt文件2.执行cmake命令3.cd到makefile文件下,执行make命令。demo:#include<iostream>#include"head.h"intadd(inta,intb){returna+b;}#include<iostream>#include"head.h"intdivide(inta,intb){r......