Android逆向 JNI静态注册

内容纲要

Android逆向 JNI静态注册

1. 新建空白Android项目

打开 ADT 新建Android空白项目 全部默认下一步
file

file

file

file

file

file

2. 新增jni代码

使用jni写的需要用native修饰

file

3. 生成头文件

首先在ADT中新建 jni文件夹

file

右击src文件夹 选择 Properties 查看文件夹路径
这里为 C:\Users\asura\source\repos\Android_JNI\02_JNI_register\Jnidemo\src

file

打开命令行 到达指定的目录执行javah命令

javah -jni -d ../jni com.example.jnidemo.MainActivity

刷新ADT后发现jni路径下生成对应的头文件

file

注意!

如果上述操作完全没错,但依然提示找不到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

file

5. 编译ndk代码

命令行进入jni目录下执行编译命令

ndk-build

看到输出.so文件成功则说明编译成功

file

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. 编译执行

file

相关代码

https://github.com/luodaoyi/Android_JNI/tree/master/02_JNI_register

如果是用android studio 请看NCK大佬的文章

安卓逆向4.Android Studio JNI静态注册(一个简单的JNI静态注册流程) – 凉游浅笔深画眉 – 博客园