unidbg快速入门使用 so直接调用 ndk调试 unidbg实在太强大太方便辣

本文主要是介绍unidbg快速入门使用 so直接调用 ndk调试 unidbg实在太强大太方便辣,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

现在很多app都把核心加密放到了so层,如果是Java层主动调用ndk的形式运行的话,用unidbg直接调用会很方便

unidbg快速入门使用

    • 致谢
    • 开始
    • 代码部分
      • 初始化
      • 主动调用
      • 传参
      • 解决报错
    • 优化
    • 最后

致谢

unidbg github地址 https://github.com/zhkl0228/unidbg
蟹蟹成哥的帮助 https://www.cnblogs.com/xbjss/p/12110083.html
还有肉丝姐的星球有好多干货

开始

下载好后,用idea打开(需要预先配置好maven,这里不多说),最好上个机场,下载配置会快一点

全部搞定之后,到这个路径
(C:\Users\Administrator\Desktop\unidbg-master\unidbg-android\src\test\java\com\bytedance\frameworks\core\encrypt\TTEncrypt.java)
跑一遍,能跑通就是配置完成了

代码部分

初始化

直接看代码

  TTEncrypt(boolean logging) {this.logging = logging;//是否logemulator = new AndroidARMEmulator("com.qidian.dldl.official"); // 创建模拟器实例,要模拟32位或者64位,在这里区分final Memory memory = emulator.getMemory(); // 模拟器的内存操作接口![在这里插入图片描述](https://img-blog.csdnimg.cn/20201104103449870.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjQ1MzkwNQ==,size_16,color_FFFFFF,t_70#pic_center)memory.setLibraryResolver(new AndroidResolver(23)); // 设置系统类库解析vm = emulator.createDalvikVM(null); // 创建Android虚拟机vm.setVerbose(logging); // 设置是否打印Jni调用细节DalvikModule dm = vm.loadLibrary(new File("unidbg-android/src/test/resources/example_binaries/libttEncrypt.so"), false); // 加载libttEncrypt.so到unicorn虚拟内存,加载成功以后会默认调用init_array等函数dm.callJNI_OnLoad(emulator); // 手动执行JNI_OnLoad函数module = dm.getModule(); // 加载好的libttEncrypt.so对应为一个模块TTEncryptUtils = vm.resolveClass("com/bytedance/frameworks/core/encrypt/TTEncryptUtils");//注册调用类}
  • AndroidARMEmulator模拟器名字可以随便的
  • createDalvikVM(File file) 这个函数的file是apk文件,有些签名验证的部分可以通过导入apk文件来让他自动获取签名(成哥教的)
  • vm.loadLibrary加载类的路径可以通过idea直接右键复制,注意斜杠
  • vm.resolveClass调用的类需要跟调用so的类一模一样,在jadx中的smail代码模式可以复制到
    在这里插入图片描述
    初始化完成后就是主动调用的部分了.主要是下面这一句话

主动调用

 ByteArray array = TTEncryptUtils.callStaticJniMethodObject(emulator, "ttEncrypt([BI)[B", new ByteArray(vm, data), data.length); // 执行Jni方法
  • ttEncrypt([BI)[B 是so中的方法
  • ttEncrypt是方法名
  • [BI是参数 byte[] , int
  • [B是返回值
    也是可以从jadx中的smail代码模式可以复制到

传参

如果全都没错,而且是静态注册的话,已经可以正常跑起来了.

上面是byte和int 如果传其它参数的话这边大概有个参考

  • Context
 DvmObject context = vm.resolveClass("android/content/Context").newObject(null);vm.addLocalObject(context);
  • String
 vm.addLocalObject(new StringObject(vm, "123"));

解决报错

毕竟第一次使用,肯定会有各种各样的报错

  • vm.setJni
    直接按照上面写的话有可能会出现这个关键词的报错
vm.setJni(this);

添加到初始化部分的代码中

  • java.lang.UnsupportedOperationException: com.xxx.object->getPackageManager()Landroid/content/pm/PackageManager;

这里的错误是我的so进行了签名验证,但是我只加载了so文件,他没
Landroid/content/pm/PackageManager
这个方法,就报错了

可以通过重写部分函数来把环境补齐

public DvmObject callObjectMethodV(BaseVM vm, DvmObject dvmObject, String signature, VaList vaList) {if (signature.contains("->getPackageManager()Landroid/content/pm/PackageManager;")) {return vm.resolveClass("Landroid/content/pm/PackageManager;").newObject(null);}return dvmObject;}

因为extends AbstractJni 继承了AbstractJni,可以看看AbstractJni 中有什么可以重写的然后把so中需要的环境补齐,有时候可以返回空对象,有时候可以手动生成一个对象传过去给他调用

可以通过输出signature来确定走了哪些地方是跟java层有关的

优化

    public static void main(String[] args) throws Exception {
//        for (int i = 0; i <100 ; i++) {Long time1 = new Date().getTime();XXEncrypt test = new XXEncrypt();test.test();test.destroy();System.out.println(new Date().getTime() - time1);
//        }}

调用的时候可以创建对象之后多次调用,这样就不用浪费创建对象的时间了,因为要创建个虚拟机所以耗时还是挺大了,至少可以节省100~200ms,实际调用的时间就可以降低到20ms左右了
但是,unidbg作者说了,unicron有内存泄漏的风险,所以这个对象是需要定期更换的,这个大家自己动动脑子咯

最后

unidbg实在太强大太方便辣
我加了个unidbg-web的服务,把主动调用变成可直接调用的接口,还能直接打包放到线上服务器上~
可以看下一篇(还没写)

在这里插入图片描述

这篇关于unidbg快速入门使用 so直接调用 ndk调试 unidbg实在太强大太方便辣的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/235998

相关文章

python使用库爬取m3u8文件的示例

《python使用库爬取m3u8文件的示例》本文主要介绍了python使用库爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等库,实现获取、解析、下载视频片段并合并等步骤,具有... 目录一、准备工作二、获取m3u8文件内容三、解析m3u8文件四、下载视频片段五、合并视频片段六、错误

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

SpringBoot3应用中集成和使用Spring Retry的实践记录

《SpringBoot3应用中集成和使用SpringRetry的实践记录》SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故... 目录1. 简介2. 环境准备3. 使用方式3.1 注解方式 基础使用自定义重试策略失败恢复机制注意事项

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

在Windows上使用qemu安装ubuntu24.04服务器的详细指南

《在Windows上使用qemu安装ubuntu24.04服务器的详细指南》本文介绍了在Windows上使用QEMU安装Ubuntu24.04的全流程:安装QEMU、准备ISO镜像、创建虚拟磁盘、配置... 目录1. 安装QEMU环境2. 准备Ubuntu 24.04镜像3. 启动QEMU安装Ubuntu4

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

一文详解如何在idea中快速搭建一个Spring Boot项目

《一文详解如何在idea中快速搭建一个SpringBoot项目》IntelliJIDEA作为Java开发者的‌首选IDE‌,深度集成SpringBoot支持,可一键生成项目骨架、智能配置依赖,这篇文... 目录前言1、创建项目名称2、勾选需要的依赖3、在setting中检查maven4、编写数据源5、开启热

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.