简介:

调试手机是Android 6.0的32位的手机。样本是自己写的一个demo小程序。加固时间为今年的12月中旬左右。

Java层分析

壳的入口是MyWrapperProxyApplication,继承了父类 WrapperProxyApplication,并且实现了父类中的方法 initProxyApplication。

我们找到父类WrapperProxyApplication,首先找到最先执行的 attachBaseContext 方法。

可以看到首先获得了 basContext,这个 baseContext 变量会在后面 so 层中获取,进行 attach 新的 DelegateApplication。然后是给     shellApp 赋值,在调用 initProxyApplication,就是上面图中 MyWrapperProxyApplication 中实现的 initProxyApplication,可以看到

是为了获取 libshell-super.2019 的 so 文件路径进行 System.load 加载。到这里,我们Java层的分析就差不多了,下面进入SO层分析。

2.SO层分析

2.1 总叙

一般的话是先分析.init_array节区,再分析JNI_OnLoad。在这里我们先分析.init_array节区里的函数,如图所示:

从中我们可以看到有很多函数,那么我们就要考虑这些函数都做了什么事了。

同时我们可以看一下字符串有没有被处理,如果被处理的话,那么此部分极可能是做一些初始化工作和解密一些东西。

字符串窗口如图所示:

可以看出有一部分字符串是解密状态的,在这里我们可以用一下elf-dump-fix 工具来dump出字符串被解密的so,然后分析。

此工具来自

接下来我们开始分析JNI_OnLoad,按F5查看函数的伪代码,把函数参数改为JavaVM *,在这里我们可以看一下它的Graph窗口,如下图:

从中可以看出,函数被混淆的比较厉害。分支较多,在这里因为混淆难度不是很高,即混淆是比较死的,不是很灵活,那么是什么意思呢,

它的路径只有一条,所以直接IDA动态调试就可以的,咱们这里就不展开讲如何处理混淆了。直接开始重点函数分析。

首先是 sub_1CA8C 函数,在这个函数里面对壳运行环境数据的初始化和获取,以及最重要的是找到被抽取的 Dex 文件压缩后的数据,

并释放到内存中。

还有一个是sub_CC9C 函数,它做了很多事情,完成了对系统函数的 hook,如mmap、fopen等,加载了Dex文件,并进行了对 ProxyApplication

到 DelegateApplication 的替换。

2.2  sub_1CA8C函数

下面开始说sub_1CA8C函数,

那么如何定位到sub_1CA8C函数呢,我这里说一下。

咱们在这里定位v44变量,即JavaVM *,如图:

在这里可以看到,sub_1CA8C函数传进去了JavaVM *,那么此函数就需要分析一下了。

我们点进去之后可以看到此函数做了很多事,如下图:

在这里,初始化了一些环境信息,比如系统SDK版本、虚拟机类型、壳的一些信息等等,并且把他们都存放到此函数的第三个函数里,

那么它的类型应该是一个结构体。当然它的类型可以在IDA中不做修改。

可以对比一下它的原so,即字符串未解密时,如图:

可以看到,字符串都是被加密了,信息获取不到。那么我们从内存中把so给dump下来,对我们的静态分析提供了很大的帮助。

当然,也仅仅是静态分析,动态调试时,这些字符串都解密了。

接下里,我们接着看这个函数,

随后,打开了o0oooOO0ooOo.dat文件,

需要一提的是*(v5 + 151)存的是虚拟机的类型,即 1==dalvik  2==art。

后面就会根据这个走对应的分支,如下图:

此图为dalivik分支

此为art分支

在sub_1BF80中就会找到被抽取加密的dex文件,并对它进行解密,即下面这个文件,

在此函数中有一下三个关键点,如图:

打开文件,然后映射,sub_1BF20函数解密。

IDA动态调试视角如下:

到此为止,sub_1CA8C函数的分析到此结束。

2.3  sub_CC9C函数

下面进行sub_CC9C函数的分析。

咱们先看此函数的第一个重点,如图:

同样是先判断虚拟机类型,咱们直接看art的。

紧接着判断sdk版本,我这里走的是sub_AD24分支。接着看这个函数干了什么事。

此函数里面同样会调用sub_5110函数,此函数完成了非常重要的工作,调用 Java 层的的 installDexes 方法装载 Dex 文件。

最后进行hook了几个方法,即mmap、open等,同样我们会发现导出函数窗口里有mmap函数。如下图:

Hook mmap函数的目的就是在系统调用ClassLoader加载dex文件的时候,在mmap函数里返回映射后已经解密的被抽取的dex文件地址。

如下图窗口:

到这里sub_AD24函数分析完了,咱们接着分析sub_CC9C函数。

接下来,到了重要的分支,如下图:

根据*(v3+152)的值判断走哪个分支,执行的逻辑区别并不是很大,都是要把抽取的函数指令给还原到原始dex中。

但是sub_17FFC中没有混淆,逻辑比较清晰,而sub_10B8C中存在混淆,当然混淆程度也不是很高。

在sub_10B8C函数中,会解压被加密的函数指令数据,然后进行填充到dex中。

sub_288F4函数为解压函数,需要解压两部分数据,即indexdata和bytecode。

sub_FB64函数实现指令填充,如图:

v4即为dex起始地址,当此函数执行完之后,从此地址处可以dump出完整的dex文件。

接下来就是完成 ProxyApplication 到 DelegateApplication 的替换过程。如下图:

紧接着调用WrapperProxyApplication类中的onCreate方法,如图:

onCreate方法中调用了一个动态注册的方法,如图:

我们在SO中找到其地址,在这里直接来到.data节区,找到其函数地址,如下图:

函数sub_472C,如下图所示:

那么它完成了API层所有的Application引用替换和ContentProviders替换。

最后回到用户的Application。

到此为止,对于此壳的分析全部完成了。

3.混淆处理

在此so中出现了大量的混淆,可以这样说,但凡是比较重要的函数都被混淆了。那么我们该怎样去处理呢,即如何提高逆向分析的效率?

我们可以采用这两种方式,IDA调试记录指令和模拟执行记录指令,其目的都是记录指令,然后用脚本进行patch修复。

在这里分享一些大佬反arm混淆的帖子:

4.闲谈

相信大家应该注意到本文没有提到反调试,是的,在分析过程中我并没有碰到反调试。或许会有断点陷阱、时间反调试等,但我并没有走到

那里。当然还有必备的签名校验。那么我觉得最大的难点就在于混淆,其他的还好。

通过分析,收获良多。希望看完此贴的伙伴们也能有所收获!!

最后于 2020-12-23 17:20

被[軍]编辑

,原因:

上传的附件:

lg.rar

(1.99MB,53次下载)

android安全分析师,乐固分析-Android安全-看雪论坛-安全社区|安全招聘|bbs.pediy.com...相关推荐

  1. android逆向快手,[原创] 快手签名-Android安全-看雪论坛-安全社区|安全招聘|bbs.pediy.com...

    整理了下,发现还有个和达达类似套路的,一起看看吧. 抓包 发送短信验证码POST /rest/n/user/requestMobileCode?app=0&lon=146.3516&d ...

  2. android 乐固加固,android - 上应用宝之前,使用乐固 进行加固。 (只能在windows 下)...

    android - 上应用宝之前,使用乐固 进行加固. (只能在windows 下) 2019-05-27 15:04 访问量: 1249 分类: 技术 跟360的加固一样,应用宝的加固是3个步骤: ...

  3. android 休眠唤醒驱动流程分析,Android 电源管理——gotosleep和userActivity关注

    一.Android power management应用层分析 Android提供了android.os.PowerManager类,该类用于控制设备的电源状态的切换. 该类对外有三个接口函数: 1. ...

  4. android tombstone发生过程,如何调试分析Android中发生的tombstone

    如何调试分析Android中发生的tombstone Android中较容易出现以下三类问题:Force close / ANR / Tombstone 前两者主要是查看当前的进程或者系统框架层的状态 ...

  5. 看雪论坛 『Android安全』版优秀和精华帖分类索引

    逆向技术基础 < 对某APK的一次分析 > JayL的这篇分析中介绍的工具对初学者依然值得参考. < android一个crackme分析和破解 > zhaokang的Crac ...

  6. android启动白屏的分析,Android 启动白屏,跳转黑屏以及冷启动优化

    一,白屏 现象:启动app,白屏一段时间后才出现欢迎页android 解决:shell 1,添加styleapp true 或者ide @mipmap/welcome 其中@mipmap/welcom ...

  7. android hook 实例,代码实例分析android中inline hook

    以下内容通过1.实现目标注入程序,2.实现主程序,3.实现注入函数,4.thumb指令集实现等4个方面详细分析了android中inline hook的用法,以下是全部内容: 最近终于沉下心来对着书把 ...

  8. android和ios比例,91分析Android与IOS游戏及软件下载比例数据

    作为最受欢迎的两个手机系统,iOS与Android向来竞争激烈,今天对这两个系统近期的市场份额和用户比例做了如下详细分析: 一.IOS与android市场份额对比 近几年很多手机厂商依靠Android ...

  9. android刮刮乐游戏布局,Android studio实现刮刮乐的方法

    本文实例为大家分享了android studio实现刮刮乐的具体代码,供大家参考,具体内容如下 mainactivity public class mainactivity extends appco ...

最新文章

  1. [摘]终于找到一个有助理解left/right/full outer join的例子
  2. 鹅厂2020暑期实习第二次一面
  3. 基于特征点匹配的自适应目标跟踪算法
  4. Linq to SQL 中实现模糊查询
  5. 腐蚀rust研究台抽奖_延迟焦化装置的腐蚀风险分析
  6. Unix下的crontab简介
  7. 在ASP.NET MVC中使用DropDownList
  8. 微信电脑客户端登陆_电脑端的微信只能开一个?简单操作就能随意开
  9. Linux shell重复执行某命令n次
  10. 查询无序列表中第K小元素
  11. SQL:select case when(转)
  12. 345. Reverse Vowels of a String - LeetCode
  13. 面试题——股票利益最大化
  14. leetcode—26.求前k大值与前k小值
  15. oracle临时表空间占用率过高,ORACLE 临时表空间使用率过高的原因及解决方案
  16. xp系统进不去2008服务器共享,xp系统设置访问Server 2008R2的共享不输入密码的方法...
  17. 长图PDF如何分页打印?
  18. CSS学习21:fixed(固定定位)
  19. python列表的“增删改查”(python基础讲解第四天)
  20. 感应加热计算机仿真软件,一种新型感应加热电源调功方式的研究与计算机仿真...

热门文章

  1. idea超实用的设置——修改注释颜色、分割线
  2. iOS+Android+APP+IAP
  3. 信息化时代,你为什么还在坚持读纸质书
  4. 2021河南长垣高考成绩查询,长垣中考成绩查询2021
  5. 权限修饰符:public private 缺省 protected
  6. MCU-51:51单片机实现简单计算器功能
  7. MAF: Synchronized Data Change Envent
  8. 【BZOJ 2733】 [HNOI2012]永无乡|Splay启发式合并
  9. 2021年R1快开门式压力容器操作找解析及R1快开门式压力容器操作考试试题
  10. 笔记本耳机声音正常,外放声音出现颤音