文章目录
- 开发工具:
Android Studio 2020.3.1
- Rust 版本:
1.57.0
- NDK 版本:
21.4.7075529
- 电脑系统:
Windows 10 家庭中文版 (21H1) 64位
在开发中,为了防止别人对我们的apk
进行二次打包,都会加上签名校验的操作,这部分代码写在java
层对于破解来说形同虚设,写在NDK
可以一定程度上的增加破解的难度。使用 C/C++
写的签名校验例子很多,下面分享下关于使用 Rust
编写的校验代码。如果只想看代码,可直接访问gitee
仓库
Java
代码:hijack/src/main/java/com/hulytu/android/hijack/AntiHijack.java · Chris/ThinDroid
Rust
代码:[hijack_rust · Chris/ThinDroid](https://gitee.com/hulytu/thin-droid/tree/master/hijack_rust
# 准备工作
Android studio
或IntelliJ IDEA
建议安装下Rust
这个插件,安装完会提示安装Toml
,也一并安装上。Rust
和cargo
的安装,可参照上一节进行。
一、 Java 代码
`Java` 层代码比较简单,比如我在 `NDK` 初始化的时候添加签名校验
package com.hulytu.android.hijack;
import android.content.Context;
public class AntiHijack {
static {
System.loadLibrary("hijack");
}
public static native boolean init(Context context);
}
二、 Rust 实现
-
rust 项目创建
上一节我讲了
cargo-ndk
的安装,这节就直接使用cargo
来创建一个项目,这个目录可以放在和当前项目目录下,也可以放在其他地方,建议和当前项目放在一起。- 可以使用
Android studio
自带的控制台(Terminal
一般在底部位置)进入到当前项目目录下,我的项目叫ThinDroid
那打开的效果是这样的:
- 可以使用
rust_ndk_2_terminal.png
-
然后输入命令
cargo new hijack_rust --lib
然后会在当前目录下生成
hijack_rust
这个目录,名字可以取其他的。 -
添加
jni
依赖进入
hijack_rust
目录下,打开Cargo.toml
,在dependencies
节点下添加jni = "0.19.0"
添加
lib
节点,其中name
表示生成so
文件的名字[lib] name = "hijack" crate_type = ["dylib"]
-
完整
Cargo.toml
[package] name = "hijack_rust" version = "0.1.0" edition = "2021" [lib] name = "hijack" crate_type = ["dylib"] [dependencies] jni = "0.19.0"
-
编写
Rust
代码打开
src/lib.rs
文件,删除原来的代码先放完整代码,后面进行拆解
use std::ffi::c_void; use jni::{ JavaVM, JNIEnv, NativeMethod}; use jni::objects::{ JObject, JString, JValue}; use jni::strings::JNIString; use jni::sys::*; // 校验的包名 macro_rules! app_package { () => { "com.hulytu.android" }; } // 检验的签名 hash-code 获取方式可使用 com.hulytu.android.hijack.Utils.getSignInfoHashCode 方式获取 macro_rules! signature { () => { -779219788 }; } #[no_mangle] #[allow(non_snake_case)] fn JNI_OnLoad(jvm: JavaVM, _reserved: *mut c_void) -> jint { let methods = [ NativeMethod { name: JNIString::from("init"), sig: JNIString::from("(Landroid/content/Context;)Z"), fn_ptr: init as *mut c_void }, ]; let env = jvm.get_env().unwrap(); let version = env.get_version().unwrap(); // 注册native 方法 let cls = match env.find_class("com/hulytu/android/hijack/AntiHijack") { Ok(clazz) => clazz, Err(_) => { return JNI_ERR; } }; let result = env.register_native_methods(cls, &methods); return if result.is_ok