一.前言

安卓逆向分析时偶尔会遇到签名算法在native层的,想要调用该签名算法,可以采用以下三种方法:

(1)hook相关函数:hook是逆向中最常用的了,不过在电脑端还要整个虚拟机,装对应的app,内存占用较大,有时app还会崩溃,手机端的话也是得装app,需要hook几个不同软件的话内存也是吃力的。

(2)逆向so文件:使用IDA逆向so文件,需要定位到加密函数,还要看得懂汇编和C代码,工作量挺大。

(3)调用so文件:通过反编译技术定位到签名函数,找到定义native方法的类,确定使用的so文件,将so文件移植到自己的项目中,可以随时调用,而且可以整合多个so文件,占内存小,稳定性高。

二.正文

本教程介绍调用so文件的方法,有两种途径:

1.Android App

通过反编译工具jadx搜索定位到签名函数,继续深入找到定义native方法的类,确定使用的so文件,将so文件移植到自己的App中,可以随时调用。

(1) 解压目标App,在lib文件夹中找到目标so文件,将该so文件复制到自己App项目的libs目录下

Android中so的存放位置 android调用so文件函数_android

(2) 在自己App项目中建立签名类(具体的native方法定义通过反编译技术获取),要注意的是包名和类名要和原App一致,否则调用不了。例如某个调用了libNativeHelper.so的类定义如下:

package com.xxxxx.helpers;

public class AppNativeHelper {
    public static native int applyPatch(String str, String str2, String str3);

    public static final native String desCbcDecrypt(String str);

    public static final native String desCbcEncrypt(String str);

    public static final native String getDailySignApi(String str);

    public static final native String getFileMd5(String str);

    public static final native String getMd5(String str);

    public static final native String getServerApi(String str);

    public static native int makePatch(String str, String str2, String str3);

    public static final native String tokenDecrypt(String str);

    public static final native String tokenEncrypt(String str);

    public static native void uninstall(String str, int i, String str2, boolean z);

    static {
        try {
            System.loadLibrary("NativeHelper");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

(3) 在需要的地方直接调用相关即可

String sign = AppNativeHelper.getServerApi("123456");

优点:可以整合多个so文件到自己的APP中,占内存小,稳定性高;可以搭建简易签名服务,给局域网内用户使用;

缺点:需要Android Studio开发经验,开发一个App;

2.jar包

(1) 在JDK环境下建立签名类,最后打包成jar包;

(2) 将so文件放在系统的lib或lib64文件下;

(3) 调用jar包中的类即可;

优点:可以运行在Linux内核系统上,其他编程语言可以调用,通用性高;

缺点:一些App只提供ARM架构的so文件,在x86架构的PC上调用不了;

三.结语

以上教程针对的是没有验证机制的so文件,有些so文件会对App进行包名和签名验证,验证失败则调用不了,有空再写个so文件的去签名验证教程。

本教程基于本身需求经验编写,只供参考学习,不足之处还请指正,欢迎伙伴们来一起探讨交流!