JNI 入门

引言

用C语言写Hello World,并且让java来执行,真的很酷的。😂

昨天开始有个要掉头发的设想,怎么破解JetBrains的IDEA呢?
javassist 注入一些区域注入不进去
x64dbg 这就更掉头发了,jvm->字节码->人肉反编译
jadx 一些地方混淆过了,关键字搜索页没搜到什么有用的信息。
java远程调试 玩不明白
今天看到有大佬说jb为了防止破解,使用了JNI,JNI不能调试(Java级),并且javaagent也不能代理native

准备工作

  1. jdk
  2. gcc
  3. google

ps: google 是 查问题用的

编写Java

public class main {
    public static native void hello(); // 本地方法,一会儿要用C写的方法名

    public static void main(String[] args) {
        System.loadLibrary("main"); //载入dll或so
        hello(); //执行本地方法
    }
}

生成头文件

javac main.java
javah main

写C代码

#include<stdio.h>
#include<jni.h> 
JNIEXPORT void JNICALL Java_main_hello(JNIEnv *env, jclass jc){
    printf("Hello Native Function\n");
}

编译

注意一下,此时需要把之前生成的头文件和c文件放到一起。
这里我是用的是绝对路径了,因为环境变量让我配置的像坨屎一样。emm

E:\StudyCode\Dev-Cpp\MinGW64\bin\gcc.exe "h:\main.c" -o "h:\main.dll"  -I"E:\StudyCode\Dev-Cpp\MinGW64\include" -I"E:\StudyCode\Dev-Cpp\MinGW64\x86_64-w64-mingw32\include" -I"E:\StudyCode\Dev-Cpp\MinGW64\lib\gcc\x86_64-w64-mingw32\4.8.1\include" -I"D:\Software\java\jdk1.8.0_301\include" -I"D:\Software\java\jdk1.8.0_301\include\win32" -L"E:\StudyCode\Dev-Cpp\MinGW64\lib" -L"E:\StudyCode\Dev-Cpp\MinGW64\x86_64-w64-mingw32\lib" -static-libgcc -shared

坑🕳

这说明你生成的是32位的,而jvm是64位的,不匹配。
Exception in thread "main" java.lang.UnsatisfiedLinkError: E:\StudyCode\Java\JNI\demo01\demo.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1850)
    at java.lang.Runtime.loadLibrary0(Runtime.java:871)
    at java.lang.System.loadLibrary(System.java:1122)
    at main.main(main.java:8)

这个报错信息是用visual studio编译报的错,也不知道是配置问题还是什么问题,就报了这个错

Exception in thread "main" java.lang.UnsatisfiedLinkError: E:\StudyCode\Java\JNI\demo01\demo.dll: Can't load this .dll (machine code=0x1) on a AMD 64-bit platform
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1934)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1850)
    at java.lang.Runtime.loadLibrary0(Runtime.java:871)
    at java.lang.System.loadLibrary(System.java:1122)
    at main.main(main.java:8)

运行效果

image.png

评论 0

还没有评论,来说点什么吧。

提交后需要审核才会公开。