Android逆向 JNI静态注册
Android逆向 JNI静态注册
1. 新建空白Android项目
2. 新增jni代码
使用jni写的需要用native修饰
3. 生成头文件
首先在ADT中新建 jni文件夹
右击src文件夹 选择 Properties 查看文件夹路径
这里为 C:\Users\asura\source\repos\Android_JNI\02_JNI_register\Jnidemo\src
打开命令行 到达指定的目录执行javah命令
javah -jni -d ../jni com.example.jnidemo.MainActivity
刷新ADT后发现jni路径下生成对应的头文件
注意!
如果上述操作完全没错,但依然提示找不到xxx的类文件!需要先使用命令来进行切换
set classpath=C:\Users\asura\source\repos\Android_JNI\02_JNI_register\Jnidemo\src
4. 编写c++代码和ndk编译配置文件
在jni文件夹内新建文件
com_example_jnidemo_MainActivity.cpp
#include "com_example_jnidemo_MainActivity.h"
JNIEXPORT jstring JNICALL Java_com_example_jnidemo_MainActivity_Hello
(JNIEnv * env, jobject obj)
{
return env->NewStringUTF("Hello JNI");
}
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := hello #模块名称
LOCAL_SRC_FILES := com_example_jnidemo_MainActivity.cpp #源文件名
include $(BUILD_SHARED_LIBRARY) #编译为so库文件
Application.mk
APP_ABI := x86 armeabi-v7a
5. 编译ndk代码
命令行进入jni目录下执行编译命令
ndk-build
看到输出.so文件成功则说明编译成功
6. java内加载so库和调用
回到java文件中 编写加载so代码的逻辑
package com.example.jnidemo;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.Toast;
public class MainActivity extends Activity {
static {
System.loadLibrary("hello"); //加载hello模块
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toast.makeText(this,MainActivity.this.Hello(), 1).show(); //调用jni内方法
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private native String Hello();
}
7. 编译执行
相关代码
https://github.com/luodaoyi/Android_JNI/tree/master/02_JNI_register
如果是用android studio 请看NCK大佬的文章
安卓逆向4.Android Studio JNI静态注册(一个简单的JNI静态注册流程) – 凉游浅笔深画眉 – 博客园