Apk脱壳圣战之—如何脱掉“梆梆加固”的保护壳

2023-11-04

一、前言

现如今Android用户的安全意识不是很强,又有一些恶意开发者利用应用的名字吸引眼球,包装一个恶意锁机收费的应用,在用户被骗的安装应用之后,立马手机锁机,需要付费方可解锁。这样的恶意软件是非常让人痛恨的。所以本文就用一个案例来分析如何破解这类应用,获取解锁密码,让被骗的用户可以找回爽快!


二、分析软件锁机原理

本文用的是一款叫做:安卓性能激活.apk,关于样本apk文件后面会给出下载地址,从名字可以看到它肯定不会是一个恶意软件,但是当我们安装的时候,并且激活它的权限之后就完了。下面不多说了,直接用Jadx工具打开它:


从包名可以看到是梆梆加固的,咋们也看不到他的代码了,所以第一步咋们得先脱壳了,在这之前我们再看看他的清单文件:


这里可以看到,他利用了设备管理器权限,来强制修改了系统密码来做的,我们通过打开软件也可以确定这点:


看到了,他申请了设备管理器权限,而这个权限用过的同学都知道,当获取到这个权限之后可以控制这个设备了,包括修改系统密码。而这个软件也是利用这个权限来做到锁机的。

注意:对于这个权限还有一个重要作用,就是可以防止应用被卸载,现在很多应用为了防止自己被用户无情的卸载了,就用这个权限,可以看到这个应用申请了这个权限之后,卸载页面:


是不可以卸载的。从Android系统来说这个也是合乎情理的,因为这个应用具备了设备管理器权限如果能被卸载那是不可能的。所以有一些应用就利用这个功能来防止被卸载。


三、脱壳工具DexExtractor原理分析

上面分析完了这个应用的锁机原理,下面就需要破解它获取到锁机密码即可,但是从上面代码可以看到他用到了梆梆加固,所以如果想破解它得先把壳给脱了,关于脱壳文章在前面两篇文章中介绍了两篇关于脱壳文章:Apk脱壳圣战之---脱掉“爱加密”的壳 和 Apk脱壳圣战之---脱掉“360加固”的壳,本文就要先来介绍如何脱掉梆梆的壳,因为如果这个壳不脱掉,没法分析他的恶意锁机的解锁密码。

前面的这两篇文章介绍脱壳主要是通过IDA动态调试下断点dump出内存的dex数据,但是本文不这么玩了,而是借助一个脱壳工具DexExtractor,这个工具是开源的:https://github.com/bunnyblue/DexExtractor,这里给出了修改源代码。其实他的原理也很简单,就是修改系统的DexFile.cpp源码,在解析dex的函数开头处加上自己的dumpdex逻辑:


这里的DexHacker就是他自己定义的,这里的dexFileParse就是系统解析dex函数,从参数可以看到,有dex文件数据,大小等信息。所以就可以把这个文件dex文件弄出来了。然后修改完了这个系统DexFile文件之后,需要将其编译到system.img镜像中,然后刷到手机中即可。


这里大神给出了一个修改之后的system.img下载地址:https://pan.baidu.com/s/1jG3WQMU,但是需要注意的是,这个文件是Android4.4系统的,如果想在其他系统版本中操作,需要自己找到系统对应的版本找到DexFile源码,添加上面的代码,在编译获取到system.img文件即可。


所以从上面的原理可以了解到,他其实和我们之前用IDA动态调试的原理非常类似,脱壳就是一点:不管之前怎么对dex加密,最终都是需要解密加载到内存中的。所以只要找到加载dex这个点即可那么这种方式和之前调试的方式有什么区别呢?

  • 动态调试方便,无需其他条件限制,但是遇到反调试就会很难受了。得先解决反调试才可进行下一步脱壳。
  • 刷入system.img这种方式可以不用关心反调试,但是条件太苛刻,使用成本较高。对于不同系统版本还得准备不同版本的system.img文件,然后将其刷到设备中。

1、可以选择刷入system.img文件

针对于上面的这种条件限制,我们有一种好的方式可以解决,就是借助于模拟器,这样就不需要繁琐的将system.img刷到设备中了,可以将编译之后的system.img文件替换对应系统版本的模拟器镜像文件即可。然后启动模拟器。

2、可以选择替换系统libdvm.so文件

当然我们不刷机也是可以的,大神给出了编译之后的libdvm.so文件,其实上面编译的system.img有点动作太大了,因为我们就修改了DexFile这个文件,其实只要编译修改后的libdvm.so文件,然后替换设备的system/lib目录下libdvm.so文件即可,不过设备需要root,这种方式比上面的刷机system.img方便。


四、DexExtractor工具使用条件

上面讲解了DexExtractor工具的原理,下面就来详细介绍他的用法吧,其实他的用法也很简单,把他的源码下载下来之后,他还有一个解密工程DexReverse,这个是一个Java工程,为了解密dump出的dex文件的。那为什么要解密呢?还有这个工具dump出的dex文件在哪?下面就来详细介绍:


看到DexHacker这个文件中,会将dex文件保存到sd卡中,而每个应用启动的时候都是在一个进程中创建一个虚拟机,所以这里如果想让这个工具可以dump出应用的dex文件,需要给这个应用添加一个写sd卡的权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

这个比较简单,咋们可以利用apktool反编译应用,在AndroidManifest.xml中添加这个权限,在回编译即可。


那么dump出dex文件之后为何还要解密呢?这个主要是为了对抗加固策略:

现在一些加固平台,比如梆梆加固,会对dex的内存dump脱壳进行检测,具体的就是hook修改当前进程的read、write读写相关的函数,一旦检测到read,write读写相关的函数的操作中有对dex文件的dump行为会有对抗的处理,防止dex的内存dump,因此呢,DexExtractor脱壳工具的作者为了过掉这种内存dump的对抗,需要先将原始的dex文件数据进行base64加密然后进行写文件到sdcard中进行输出,当pull导出拿到base64加密的dex文件时还需要进行base64的解密才能获取到原始的dex文件。这个解密工具也在工具目录下Decode.jar,用法:java -jar Decode.jar dexdir;这里需要注意的是,dexdir是我们pull出dex之后的目录,记住是目录,不是对应的dex文件哦!


五、DexExtractor工具使用步骤

到这里我们就分析完了DexExtractor工具的原理,使用条件,使用步骤了,下面咋们就来实践一下,把我们在前面说到的那个应用脱个壳。这里为了简单,直接启动一个4.4版本的模拟器,然后替换他的system.img文件。下面的步骤很简单了:

第一步:替换system.img文件

用上面修改之后的system.img文件替换4.4的system.img文件,文件目录:AndroidSDK目录\system-images\android-19\default\armeabi-v7a\system.img


最好把之前的system.img文件进行改名备份。然后启动模拟器即可。


第二步:添加写SD卡权限

上面说到了,因为这个工具需要将dump出的dex文件写到SD卡中,所以我们需要检查脱壳应用是否具备写SD卡权限,我们用Jadx工具打开这个应用,发现没有,所以我们需要用apktool工具反编译,然后在AndroidManifest.xml中添加<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>,然后在回编译重签名即可。


第三步:安装应用观察日志

安装应用到模拟器,因为是模拟器,可能操作比较麻烦,所以这里需要借助两个命令可以完美的安装启动应用即可,一个是adb install xxx.apk,安装成功之后。

在启动应用:adb shell am start -n tx.qq898507339.bzy9/tx.qq898507339.bzy9.MainActivity


其中应用的包名和启动activity的名称都可以通过AndroidManifest.xml中查看:


无需任何界面操作即可完成启动应用,然后查看这个包名对应的日志信息,日志tag是dalvikvm:

在这些日志中可以看到脱壳之后的dex文件放在sd中,咋们把这个文件pull出来即可:

adb pull /sdcard/tx.qq898507339.bzy9_classes_927104.dex D:\DexExtractor\

这时候我们离成功就不远了,得到了脱壳后的dex文件了,但是我们还需要进行解密。

注意:这里记得观察"create file end" 字段内容,有的应用可能内部本身有加载dex的逻辑,所以这里会发现有多个dex文件的产生,不过没关系,可以把所有的dex文件都导出本地,然后分析即可。


第三步:解密脱壳后的dex文件

前面说过了,为了应对现在加固平台的检测,DexExtractor工具将dex进行加密了,可以利用Decode.jar工具进行解密:java -jar Decode.jar D:\DexEctractor\


注意,这里的是目录,不是dex文件哦。然后去目录查看解密之后的dex文件即可,然后我们用jadx打开这个dex文件,可惜的是打开失败,所以就用dex2jar工具将其变成jar文件进行查看:


转化的时候报错了,说这个dex是odex文件。关于odex格式文件不多解释了,可自行搜索哈。jadx现在还不能识别odex文件的,这里好奇用IDA打开一下,发现竟然可以成功,所以IDA还真强大哈!


第四步:odex文件转化成dex文件

但是咋们用jadx用惯了,所以还是想用jadx打开它,其实我们只需要将odex转化成dex即可,这里借助了smali.jar工具了,我们先用baksmali.jar将odex文件反编译成smali文件,然后在用smali.jar将smali文件编译成dex文件即可。这两个工具用法比较简单:

把c:\classes.dex反编译为smali,输出到c:\classout目录

java -jar baksmali-2.0.3.jar -o c:\classout/ c:\classes.dex 

把c:\classout目录下的smali文件编译为c:\classes.dex
java -jar smali-2.0.3.jar c:\classout/ -o c:\classes.dex

就用上面这两个工具可以把odex文件变成dex文件,然后在用jadx工具打开即可:


在前面查看AndroidManifest.mxl文件中可以找到设备管理器声明的类jh,这里直接查看源码,果然是当获取到设备管理器权限之后,立马将锁屏密码设置成:>>>qq 898507339 bzy>>> ,然后立即锁屏。锁屏之后,你不能通过重启来解决,因为这种恶意软件肯定监听到了开机广播:


所以这时候,受害者只能通过提示来进行付费解锁了。或者自己刷机操作了。付费的逻辑比较简单,通过加qq,然后恶意者会让你付费,给完钱之后他会用电话号码:18258614534,给你发送一条短信,代码中监听到有这条短信就自动解锁,也就是将锁屏密码清空即可:



六、脱壳流程

看到了这里我们就把这个软件给脱壳破解了,下面来总结一下脱壳的流程和现在恶意锁屏软件原理:

第一、DexExtractor脱壳原理

通过修改系统DexFile.cpp源码,添加dump出dex的逻辑,然后将其编译到system.img和libdvm.so中,对于我们可以使用模拟器将system.img进行替换,或者用真机替换system/lib目录下的libdvm.so文件,从而让每个应用启动的时候使用到DexFile类功能都会执行我们dump出dex的逻辑。

关于这个工具使用的步骤也非常简单:

第一步:启动模拟器选择修改后代码的system.img文件。

第二步:检查脱壳程序是否具备写SD卡权限。

第三步:查看脱壳程序对应的日志,tag是dalvikvm。发现create file end等信息段。找到脱壳之后的dex文件路径。

第四步:将sd卡中脱壳之后的dex文件导出到本地,在使用Decode.jar工具进行解密即可。

第五步:解密之后的dex格式odex,所以为了使用jadx方便查看代码逻辑,可以使用smali.jar工具将其转化成dex文件。


第二、锁机原理

通过本文的案例可以看到,现在一些恶意的收费锁机软件,故意利用软件名称吸引用户安装,安装之后就引导用户授权然后进行锁机,当用户被锁机之后只能通过给钱解决,当然也可以自行刷机了。本文中的这个软件的案例就利用了系统的设备管理器来设置系统的锁机密码。关于设备管理器这个权限,其实有很多用途,比如可以擦除设备数据,防止被卸载的功能,感兴趣的同学可以自行搜索。


本文资料下载地址:http://download.csdn.net/detail/jiangwei0910410003/9748357

注意:system.img文件是Android4.4版本的,切不可替换错误!


七、总结

本文脱壳其实是借助了DexExtractor工具进行的,但是原理都是一致的,就是不管之前dex怎么加密,最终都是需要解密加载到内存中的,所以在这个时刻,进行操作dump出dex即可。对于之前介绍的方式使用IDA动态调试下断点来dump出dex这个最大的问题就在于如何解决反调试问题,而这个工具操作就可以无需关心反调试了。但是这种方式操作也是比较麻烦的,因为操作的前提条件比较多。好了到这里就介绍完了本文的内容,看完的同学记得多多分享扩散哦,如果有打赏那就最好了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apk脱壳圣战之—如何脱掉“梆梆加固”的保护壳 的相关文章

  • RFID银行钱箱资产管理系统

    概述 随着经济的发展 金融领域的业务越来越广泛 金融物流安全的问题 显得越来越重要 银行金库每日出入库及配送的物流量越来越大 特别是现金款箱 如果不能保证及时准确的入库 库存控制和出库 将会给银行带来巨大风险 严重加大了银行管理难度 提高了
  • Java之封装、继承和多态(超详细)

    一 封装 封装就是隐藏对象内部的复杂性 只对外公开简单的接口 封装的思想是你只需要知道如何调用接口就行了 不需要去了解内部实现 1 封装的体现 属性的封装 方法的封装 构造函数的封装 单例模式 将类的某些信息隐藏在类的内部 不让外部程序直接
  • Jenkins通过Nexus artifact uploader 上传制品失败排查

    使用Jenkins 插件Nexus artifact uploader 上传 jar zip gzip tar等制品 Jenkins 使用自由风格配置构建时 配置如下 Credentials 为上传Nexus服务器的用户认证信息 需要在Je
  • 计算机网络系统的雷电防护,有关计算机网络系统雷电防护的探讨

    摘要 本文探索与分析了计算机网络系统雷电灾害发生的原因和途径 为雷电灾 害的防护工作提供重要的依据与保障 为减少雷电灾害对计算机网络系统的危害做好理论储备和实施指导 随着现代科学技术的不断发展 计算机网络广泛且迅速延 伸至通信 交通 能源
  • vue3+ts

    安装ts 全局安装typescript npm install g typescript 查看typescript版本 tsc V 1 新建一个ts文件 里面写上 gt function sayHi str return 你好啊 str l
  • 51单片机学习笔记(十一) - LCD1602

    文章目录 一 LCD1602简介 二 LCD1602接口原理图及引脚说明 1 原理图 2 引脚说明 三 LCD1602低层时序 四 LCD1602高层时序 五 一些宏定义 总结 一 LCD1602简介 LCD1602 16x2 显示器显示2
  • Unsafe初探

    Unsafe Unsafe 是sun misc Unsafe下的一个包 通过这个类可以直接使用底层native方法来获取和操作底层的数据 例如获取一个字段在内存中的偏移量 利用偏移量直接获取或修改一个字段的数据等等 当然这个类正如他的名字一
  • C++之string的compare用法

    compare用于比较两个字符串是否相等 用法 str1 compare str2 如果相等则输出为0 不等则输出为 1 例子如下 1 int main 2 string str1 abc 3 if str1 compare abc 0 4
  • 查验身份证(C语言和Java语言)

    7 2 查验身份证 输入格式 输出格式 输入样例 输出样例 输入样例 输出样例 代码展示 C语言 Java 输出结果 注意点 一个合法的身份证号码由17位地区 日期编号和顺序编号加1位校验码组成 校验码的计算规则如下 首先对前17位数字加权
  • ctfshow 网络迷踪做题记录(2)

    ctfshow 网络迷踪做题记录 2 致我超吧 题目描述 ctfshow 主角ID vs 对手id 全小写 下载附件为 gif 图片展示某个游戏的战斗 咱也不知道是啥游戏 百度识图搜索到了这个场景的图片 打开图片网页可以看到文字 InnoV
  • Vue对数据的增删改

    Vue对数据的增删改
  • SPGAN:Image-Image Domain Adaptation with Preserved Self-Similarity and Domain-Dissimilarity ReID阅读笔记

    Image Image Domain Adaptation with Preserved Self Similarity and Domain Dissimilarity for Person Re identification 作者 We
  • 数据挖掘:概念与技术 第一章

    文章目录 第一章 引论 1 1 为什么进行数据挖掘 1 2 什么是数据挖掘 1 3 可以挖掘什么 类型的数据 1 3 1 数据库和数据仓库的区别 1 3 2 事务数据 1 4 可以挖掘什么 类型的模式 1 4 1 类 概念描述 特征化与区分
  • 区间预测

    区间预测 MATLAB实现基于QRCNN GRU卷积门控循环单元多变量时间序列区间预测 目录 区间预测 MATLAB实现基于QRCNN GRU卷积门控循环单元多变量时间序列区间预测 效果一览 基本介绍 模型描述 程序设计 参考资料 效果一览
  • 中文文本纠错_论文Spelling Error Correction with Soft-Masked BERT(ACL_2020)学习笔记与模型复现

    中文文本纠错 论文Spelling Error Correction with Soft Masked BERT ACL 2020 学习笔记与模型复现 最近在ACL 2020上看到一篇论文 Spelling Error Correction
  • HTML单选框-多选框-按钮

  • 软件测试基础知识点--白盒测试(从题目中总结)期末复习总结三

    3 在白盒测试用例设计中 有语句覆盖 分支覆盖 条件覆盖 路径覆盖等 其中具有最强的覆盖准则的是 A 语句覆盖 B 条件覆盖 C 判定覆盖 D 条件组合覆盖 4 下面不属于白盒测试能保证的是 A 模块中所有独立途径至少测试一次 B 测试所有
  • MacBook上设置Java开发环境

    要在MacBook上设置Java开发环境 可以按照以下步骤进行操作 安装Java Development Kit JDK 访问Oracle官方网站或AdoptOpenJDK网站下载适合您的操作系统版本的JDK安装程序 双击安装程序 按照提示
  • Word2013中设置显示修改痕迹 便于知道错因

    在大学毕业答辩前 毕业论文指导老师通常会将学生的论文收集起来 进行检查 有些错误位置就需要修改 但是也不能直接改了 不然学生都不知道是哪里错了 我们往往只重视结果 而忽视了过程 让学生知道错因显然比让他知道正确答案要更加有益 下面 我就介绍
  • matlab学习日记Re0 (三)

    matlab学习日记Re0 三 Machine Learning Onramp 2 2 Import Data 使用readtable指令可以读出xls txt等格式的文件 并以table形式储存在matlab种 例如输入data read

随机推荐

  • atoi()函数详解

    atoi 函数详解 atoi s 函数用于把一个字符串转换成一个整型数据 该函数定义在stdlib h中 例 假如你输入的是123456 那么它先被读入到字符串s中 用atoi 函数就可以把它转化成一个整数 如果转化成功 则返回转化后的整数
  • Apollo配置中心教程、详解

    目录 配置的基本概念 配置中心 Apollo Apollo快速启动 Apollo工作原理 使用Apollo需要的核心概念 使用Apollo客户端 Springboot集成Apollo 配置的基本概念 应用程序在启动和运行的时候往往需要读取一
  • spring系统学习7-Spring JDBC框架

    七 Spring JDBC框架 使用普通的JDBC数据库时 要写很多与业务无关的代码来处理异常 打开和关闭数据库连接等 Spring JDBC框架负责所有的低层细节 从开始打开连接 准备和执行SQL语句 处理异常 处理事务 到最后关闭连接
  • 学习笔记-迪杰斯特拉算法求最短路径

    求最短路径问题 迪杰斯特拉算法 迪杰斯特拉 Dijkstra 算法是典型最短路径算法 用于计算一个结点到其他结点的最短路径 它的主要特点是以起始点为中心向外层层扩展 广度优先搜索思想 直到扩展到终点为止 设置出发顶点为 v 顶点集合 V v
  • JavaScript实现 -- 二分搜索

    二分搜索 二分搜索 binary search 也称折半搜索 对数搜索 是一种在有序数组中查找某一特定元素的搜索算法 原理 二分搜索算法的原理和猜数字游戏类似 就是有人让你从1 100之间选一个数字让他猜 他告诉你猜测的数字 你回复他猜测的
  • Windows SSH 配置和SCP的使用

    使用用户界面安装 ssh 功能 要在 Windows 10 11 上启用 SSH 服务器 请按照以下步骤操作 按 Windows 键 I 打开 设置 菜单 然后选择 应用程序 在左侧菜单栏中选择 应用和功能 从列表中选择 可选功能 点击 添
  • MapReduce实现线性回归

    1 软件版本号 Hadoop2 6 0 IDEA中源代码编译使用CDH5 7 3 相应Hadoop2 6 0 集群使用原生Hadoop2 6 4 JDK1 8 Intellij IDEA 14 源代码能够在https github com
  • Safari安装使用JsonView插件

    google的jsonView插件可以使接口数据json化 方便查看 下载地址 https github com rfletcher safari json formatter downloads 下载后直接点击打开安装 默认是自动开启的
  • Junit单元测试报错java.lang.Exception: No tests found matching

    在Java代码的开发过程中 我们经常会需要写单元测试 但是由于有些项目在构建的过程中 时间比较紧张 导致我们并不去重视或者没有时间去写单元测试 今天因为需要做一个接口加密的问题 需要用到单元测试 结果写完单元测试 发现运行测试就报错 jav
  • oracle查询第三个字母是A的员工,oracle_day2 限制查询

    限制查询 一 逻辑比较操作符 gt lt 不等于 三个都表示不等于的意思 经常用的是 lt gt 1 查看员工工资小于1000的员工id和名字 select id first name last name all name from s e
  • 数字电路设计之ARM m0进度(1)

    这个例子是用于测试我写的ARM这个内核 测试例子是一个求最大公约数和最小公倍数的程序 2014 10 21 1 已解决问题 LDR1这条指令的 10 i datain lt LDR1 5 b0000 1 gr0 gr2 LDR0 5 b01
  • Buildroot系列开发(五)bootloader简述

    参考 百问网 文章目录 1 什么是Boot loader 2 有哪些bootloader 哪些支持linux 3 Bootloader支持的Flash设备 4 Bootloader支持的文件系统类型 4 Bootloader支持的CPU架构
  • 【深度学习与计算机视觉】12、迁移学习

    文章目录 一 迁移学习简介 二 为什么要使用迁移学习 三 迁移学习的实现 四 迁移学习系统介绍 一 原始数据有标签 目标数据有标签 1 模型微调 model fine tune 也叫再优化 1 保守训练 Conservative Train
  • Nginx系列(十九):URI转义机制(部分转载)

    一 URI和特殊字符 源文档 https www cnblogs com upyun p 8267334 html 1 URI URI 全称是 Uniform Resource Identifiers 即统一资源标识符 用于在互联网上标识一
  • 【51单片机】LED模块和独立按键的使用

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 原理介绍
  • MIMO 从入门到精通 -科普篇 1 - 5G Massive MIMO

    参考 Our Technology Planet lt lt 5G Massive MIMO Made Simple Learn All About Massive MIMO Beam Forming In 30 minutes gt gt
  • ESP32 Wi-Fi & 蓝牙 Tx Power 调整方法

    此篇博客用来整理 ESP32 Wi Fi BLE 的 Tx Power 调整方法 此博客分为两部分 Wi Fi Tx Power 调整 BLE Tx Power 调整 BR EDR Tx Power 调整 注 当前使用 的 IDF comm
  • Kubeadm 安装 Kubernetes:kubelet 状态失败的解决方案

    Kubeadm 安装 Kubernetes kubelet 状态失败的解决方案 在使用 kubeadm 安装 Kubernetes 集群时 遇到 kubelet 状态失败的问题是比较常见的 这个问题主要出现在 kubelet 无法正常启动或
  • 如何查看微信image/*.dat文件

    背景 起因我是想看看能不能获取的到撤回的图片 于是在 WeChat Files FileStorage Image这个文件下发现了聊天记录储存的文件 却发现文件已被加密 也就有了这篇文章 关于撤回的图片这个问题 结论是获取不到 聊天记录里加
  • Apk脱壳圣战之—如何脱掉“梆梆加固”的保护壳

    一 前言 现如今Android用户的安全意识不是很强 又有一些恶意开发者利用应用的名字吸引眼球 包装一个恶意锁机收费的应用 在用户被骗的安装应用之后 立马手机锁机 需要付费方可解锁 这样的恶意软件是非常让人痛恨的 所以本文就用一个案例来分析