热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

逆向工具之unidbg(在pc端模拟执行so文件中的函数)

  昨天在逆向某App的时候,发现有个加密工具类中的native方法是用C语言编写的,隐藏在so文件中。某大佬推荐逆向工具unidbg,能在pc端直接调用so文件中的函数,最终成功

  昨天在逆向某App的时候,发现有个加密工具类中的native方法是用C语言编写的,隐藏在so文件中。某大佬推荐逆向工具unidbg,能在pc端直接调用so文件中的函数,最终成功解决了问题。

逆向工具之unidbg目录

  • 一、`unidbg`引入
  • 二、`unidbg`概述
  • 三、`unidbg`使用姿势
    • 1、下载`unidbg`项目
    • 2、导入到IDEA中
      • ①、解压压缩包
      • ②、打开`IDEA`,导入解压的项目
    • 3、测试`unidbg`
    • 4、运行自己的`so`文件
      • ①、编写`EncryptUtilsJni`类
      • ②、参数说明
      • ③、执行结果
  • 四、分析`so`文件的`IDA`工具
  • 五、总结
一、unidbg引入

  逆向某App,反编译dex得到Java代码,但是有两个加密工具类中的方法放到so文件中。
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
  方法的实现用的C语言编写的,放在了so文件中。在Java中,动态加载so文件,使用native方法的形式隐藏了方法的方法体。难道伟大的逆向工程就此放弃?这显然不符合我们技术人的性格,肯定要想方设法弄出来。

二、unidbg概述

  unidbg 是一个基于 unicorn 的逆向工具,可以直接调用AndroidiOS中的 so 文件。项目的GitHub地址为https://github.com/zhkl0228/unidbg
  我使用unidbg,直接调用libbaseEncryptLib.solibencryptLib.so中的方法,这样就不用想破脑袋去逆向so文件了。

备 注 : \color{red}备注: :so文件是unix系统中的动态连接库,属于二进制文件,作用相当于windows系统中的.dll文件。在Android中也可调用动态库文件(*.so),一般会将加密算法、密码等重要的方法、信息使用C语言编写,然后编译成so文件,增强了软件的安全性

三、unidbg使用姿势

1、下载unidbg项目

  下载地址:https://github.com/zhkl0228/unidbg
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》

2、导入到IDEA中

  unidbg项目用Java编写,并且上面下载的是一个标准的maven项目。我这里演示导入到IDEA中,如果你熟悉其它的IDE,也可以自己去弄。(顺带一提,如果你之前没接触过Java语言,要确保电脑安装好JDKmaven

①、解压压缩包

《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》

②、打开IDEA,导入解压的项目

《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
  浏览到刚刚解压好的文件夹
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
  后面一路无脑next即可。。。
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
  第一次导入此项目会自动下载一些jar包,和网速、maven服务器有关,耐心等待吧。
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》

3、测试unidbg

  项目中的src/test/java/com/xxxx/frameworks/core/encrypt路径中有一个TTEncrypt测试用例,直接执行其中的main方法。
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》

  控制台打印相关调用信息,说明项目导入成功。
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》

4、运行自己的so文件

  在前面,我们不是遇到了libbaseEncryptLib.solibencryptLib.so文件么,利用unidbg直接调用so文件中 的方法。下面演示调用libencryptLib.so文件中的getGameKey函数。

①、编写EncryptUtilsJni

package cn.hestyle;
import com.github.unidbg.Module;
import com.github.unidbg.arm.ARMEmulator;
import com.github.unidbg.linux.android.AndroidARMEmulator;
import com.github.unidbg.linux.android.AndroidResolver;
import com.github.unidbg.linux.android.dvm.*;
import com.github.unidbg.memory.Memory;
import java.io.File;
import java.io.IOException;
/** * description: EncryptUtils调用so * * @author hestyle * @version 1.0 * @className unidbg->EncryptUtilsJni * @date 2020-05-20 22:01 **/
public class EncryptUtilsJni extends AbstractJni {
// ARM模拟器
private final ARMEmulator emulator;
// vm
private final VM vm;
// 载入的模块
private final Module module;
private final DvmClass TTEncryptUtils;
/** * * @param soFilePath 需要执行的so文件路径 * @param classPath 需要执行的函数所在的Java类路径 * @throws IOException */
public EncryptUtilsJni(String soFilePath, String classPath) throws IOException {
// 创建app进程,包名可任意写
emulator = new AndroidARMEmulator("cn.hestyle");
Memory memory = emulator.getMemory();
// 作者支持19和23两个sdk
memory.setLibraryResolver(new AndroidResolver(23));
// 创建DalvikVM,利用apk本身,可以为null
vm = ((AndroidARMEmulator) emulator).createDalvikVM(null);
// (关键处1)加载so,填写so的文件路径
DalvikModule dm = vm.loadLibrary(new File(soFilePath), false);
// 调用jni
dm.callJNI_OnLoad(emulator);
module = dm.getModule();
// (关键处2)加载so文件中的哪个类,填写完整的类路径
TTEncryptUtils = vm.resolveClass(classPath);
}
/** * 调用so文件中的指定函数 * @param methodSign 传入你要执行的函数信息,需要完整的smali语法格式的函数签名 * @param args 是即将调用的函数需要的参数 * @return 函数调用结果 */
private String myJni(String methodSign, Object ...args) {
// 使用jni调用传入的函数签名对应的方法()
Number ret = TTEncryptUtils.callStaticJniMethod(emulator, methodSign, args);
// ret存放返回调用结果存放的地址,获得函数执行后返回值
StringObject str = vm.getObject(ret.intValue() & 0xffffffffL);
return str.getValue();
}
/** * 关闭模拟器 * @throws IOException */
private void destroy() throws IOException {
emulator.close();
System.out.println("emulator destroy...");
}
public static void main(String[] args) throws IOException {
// 1、需要调用的so文件所在路径
String soFilePath = "src/test/resources/myso/libencryptLib.so";
// 2、需要调用函数所在的Java类完整路径,比如a/b/c/d等等,注意需要用/代替.
String classPath = "com/.../EncryptUtils";
// 3、需要调用函数的函数签名,我这里调用EncryptUtils中的getGameKey方法,由于此方法没有参数列表,所以不需要传入
String methodSign = "getGameKey()Ljava/lang/String;";
EncryptUtilsJni encryptUtilsJni = new EncryptUtilsJni(soFilePath, classPath);
// 输出getGameKey方法调用结果
System.err.println(encryptUtilsJni.myJni(methodSign));
encryptUtilsJni.destroy();
}
}

②、参数说明

  EncryptUtilsJni类中最重要的设置为main方法中的soFilePathclassPathmethodSign三个参数,它们的作用在main方法中已经注释过了,这里再次解释一下。

soFilePath,填写你需要调用的so文件路径
classPath,填写你需要调用的函数所在Java类的完整类路径。
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
methodSign,填写你要调用的函数签名,语法为smali。(在jadx中,直接可以看smali代码)

《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
备 注 : \color{red}备注: :如果你要调用的函数还需要传入参数,直接传入myJni方法中即可,myJni方法中省略args参数就是供你传入参数。

③、执行结果

《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》

四、分析so文件的IDA工具

  IDA工具是反汇编so文件的强大工具,由于libencryptLib.so文件比较简单,并且getGameKey函数返回的是一个常量,并没有复杂的处理过程,所以可以直接查看。

  首先用IDA打开libencryptLib.so文件
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
  查看反汇编得到的代码。
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》

五、总结

  unidbg确实很强大,直接在pc端模拟调用so文件,省去了反汇编逆向so文件的麻烦。上面的教程只演示了unidbg项目的导入、封装自己的调用so文件的API,其实这只是入门了,unidbg还支持断点调试so文件,也能导入到IDA中进行动态调试,自己去研究下吧,博主我也比较菜。
   若 是 喜 欢 , 可 以 素 质 三 连 一 下 \color{red}若是喜欢,可以素质三连一下
《逆向工具之unidbg(在pc端模拟执行so文件中的函数)》


推荐阅读
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文是一篇翻译文章,介绍了async/await的用法和特点。async关键字被放置在函数前面,意味着该函数总是返回一个promise。文章还提到了可以显式返回一个promise的方法。该特性使得async/await更易于理解和使用。本文还提到了一些可能的错误,并希望读者能够指正。 ... [详细]
author-avatar
o0沢田纲吉0o
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有