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创建一个功能完整的Windows风格计算器程序

《使用Python创建一个功能完整的Windows风格计算器程序》:本文主要介绍如何使用Python和Tkinter创建一个功能完整的Windows风格计算器程序,包括基本运算、高级科学计算(如三... 目录python实现Windows系统计算器程序(含高级功能)1. 使用Tkinter实现基础计算器2.

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展