• [免费专栏] Android安全之利用ADT获取内存中的敏感信息



    也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大

    少走了弯路,也就错过了风景,无论如何,感谢经历


    转移发布平台通知:将不再在CSDN博客发布新文章,敬请移步知识星球

    感谢大家一直以来对我CSDN博客的关注和支持,但是我决定不再在这里发布新文章了。为了给大家提供更好的服务和更深入的交流,我开设了一个知识星球,内部将会提供更深入、更实用的技术文章,这些文章将更有价值,并且能够帮助你更好地解决实际问题。期待你加入我的知识星球,让我们一起成长和进步


    Android安全付费专栏长期更新,本篇最新内容请前往:

    想了解更多APK内存敏感信息泄露挖掘技巧,请前往:

    0x01 利用ADT 获取内存中的敏感信息

    对于基本的内存分析,我们可以使用 Android Studio 的内置工具。它们在 Android 监视器选项卡上。如果需要转储内存,请选择需要分析的设备和应用,单击“转储 Java 堆”。这将在 capture 目录中创建一个 hprof 文件,该目录位于应用程序的项目路径上

    :我们可以通过使用ADT对客户端内存的访问,来进行查看各种内存中未加密的敏感信息

    ADT(Android Development Tools)在Eclipse编译IDE环境中,需安装ADT(Android Developer Tools)Plug-in,这是Android在Eclipse上的开发工具。 目前Android开发所用的开发工具主要有Android Studio 、intellij idea、Eclipse,在Eclipse编译IDE环境中

    Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试

    Android开发工具(ADT,Android studio),下载地址:https://developer.android.com/studio/index.html

    通过Android Studio工具中的Android Device Monitor 工具的“Heap dump”功能访问“堆内存”的使用情况和内存数据的变化,并检查是否内存中存在“用户名”和“密码”的” “cvv” 或 “key” 等重要信息是否泄露

    :Android Studio 3.0开始弃用Android Device Monitor,虽然说被“弃用”,但是不代表不支持,我们还是可以通过其他方式来使用Android Device Monitor,就是DDMS,大家之前看过博主同学文章的,应该知道,不太清除的可以翻看的之前的文章,此处不过多讲解

    使用Heap Dump,获取我们当前正在运行的容易收到攻击的应用程序的“快照”,然后“导出”文件扩展名为“HPROF”的“二进制”格式文件,其格式为“HPROF”。“Dalvik格式”,但我们需要将其转换为“J2se HPROF”格式,以便“Java”可读

    • Memory Monitor是什么

    在Android Studio(以下简称AS)中Android Monitor是一个主窗口,它包含了Logcat,、Memory Monitor、CPU Monitor、 GPU Monitor和Network Monitor。其中Memory Monitor可以轻松地监视应用程序的性能和内存使用情况,以便于找到被分配的对象,定位内存泄漏,并跟踪连接设备中正在使用的内存数量。Memory Monitor可以报告出你的应用程序的内存分配情况, 更形象的呈现出应用程序使用的内存。它的作用如下:

    • 实时显示可用的和分配的Java内存的图表
    • 实时显示垃圾收集(GC)事件
    • 启动垃圾收集事件
    • 快速测试应用程序的缓慢是否与过度的垃圾收集事件有关
    • 快速测试应用程序崩溃是否与内存耗尽有关

    使用Memory Monitor之前要确保手机开启了开发者模式和USB调试。
    使用的步骤为:

    • 运行需要监控的应用程序

    • 点击AS面板下面的Android图标,并选择Monitors选项

    • Heap Dump是什么

    Heap Dump的主要功能就是查看不同的数据类型在内存中的使用情况。它可以帮助你找到大对象,也可以通过数据的变化发现内存泄

    运行Android Device Monitor,并打开InsecureBankv2 应用程序

    在这里插入图片描述

    打开InsecureBankv2 应用程序后,会发现“Android Device Monitor”的“Device”中出现InsecureBankv2 应用程序

    在这里插入图片描述

    单击“Update HEAP”按钮

    在这里插入图片描述

    在APP中的登录界面输入账号密码登录的操作,然后点击“Dump HPROF file”导出包含刚刚操作的堆内存信息的文件,文件名默认为当前应用程序名.hprof文件名命名:“com.android.insecurebankv2.hprof”

    在这里插入图片描述

    在这里插入图片描述

    要对内存转储进行更高级的分析,需要使用Eclipse Memory Analyzer Tool (MAT)。它可作为 Eclipse 插件或独立应用程序使用。要分析 MAT 中的转储,可使用 Android SDK 自带的 hprof-conv平台工具

    ./hprof-conv memory.hprof memory-mat.hprof
    
    • 1

    MAT 提供了多种用于分析内存转储的工具。例如,直方图提供了从给定类型中捕获的对象数量的估计值,线程概览显示了进程的线程和堆栈帧。支配树提供有关对象之间保持活动依赖关系的信息,以及可以使用正则表达式来过滤数据的结果

    使用 MemoryAnalyzer(MAT)程序来检查内存,MAT有两种安装方式

    • 一种安装方式是将MAT当做eclipse的插件进行安装:启动Eclipse --> Help --> Eclipse Marketplace,然后搜索Memory Analyzer,安装,重启eclipse即可
    • 另外一种安装方式是将MAT作为一个独立的软件进行安装:https://www.eclipse.org/mat/

    在这里插入图片描述

    Android Studio ProfileLeak Canary dump 出来的内存快照无法直接在MAT当中打开,需要使用hprof-conv来转换操作一下,这里我们使用“Appie”命令从“Android Device Monitor”获取的“hprof”格式,格式转换如下:

    hprof-conv  com.android.insecurebankv2.hprof  test.hprof
    
    • 1

    在这里插入图片描述

    在这里插入图片描述

    打开程序“MemoryAnalyzer.exe”并“导入”我们已转换格式的文件“test.hprof”,如下:

    在这里插入图片描述
    在这里插入图片描述

    点击“Open Dominator Tree for entire hap”按钮

    在这里插入图片描述

    然后,在窗口中检查“dominator_tree”,发现有一个与我们刚刚操作的应用程序相关的命名

    在这里插入图片描述

    在这里插入图片描述

    不出意外我们在转账页面找到了账号和密码,如下:

    在这里插入图片描述

    如果查看“Convert ByteCode”之后的“Source code”,“Class Dotransfer”的“Properties”类似:

    public class DoTransfer
    extends Activity
    {
        public static final String MYPREFS2 = "mySharedPreferences";
        String acc1;
        String acc2;
        EditText amount;
        Button button1;
        EditText from;
        Button getAccounts;
        InputStream in ;
        JSONObject jsonObject;
        String number = "5554";
        String passNormalized;
        EditText phoneNumber;
        String protocol = "http://";
        BufferedReader reader;
        HttpResponse responseBody;
        String result;
        SharedPreferences serverDetails;
        String serverip = "";
        String serverport = "";
        EditText to;
        Button transfer;
        String usernameBase64ByteString;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    或使用OQL查询语句来快速查询内存中的关键字,因为MAT 支持一种类似于 SQL 的查询语言 OQL(Object Query Language)。OQL 使用类 SQL 语法,可以在堆中进行对象的查找和筛选,比如如下:

    在这里插入图片描述

    • Object Query Language studio是一个 MAT 特性,它允许使用类似 SQL 的语言从内存转储中查询对象。MAT允许我们通过在简单对象上调用 Java 方法来转换它们,并且它提供了一个用于在 MAT之上构建复杂工具的 API
    SELECT * FROM java.lang.String
    
    • 1

    String在上面的示例中,内存转储中的所有字符串对象都将被选中。结果将包括对象的类、内存地址、值和保留计数。要过滤这些信息并只查看每个字符串的值,如下查询语句:

    SELECT toString(object) FROM java.lang.String object
    或者
    SELECT object.toString() FROM java.lang.String object
    
    • 1
    • 2
    • 3

    MAT SQL 语法也支持原始数据类型,所以可访问所有 char 数组的内容:

    SELECT toString(arr) FROM char[] arr
    
    • 1

    如果我们得到的结果与之前的结果相似,因为 String 和其它 Java 数据类型只是原始数据类型的包装器。现在让我们过滤结果,下面的示例SQL语句将选择包含 RSA 密钥的ASN.1 OID的所有字节数组,但给不表示我们给定的字节数组是包含 RSA(相同的字节序列可能是其它东西的一部分)这也是有可能的:

    SELECT * FROM byte[] b WHERE toString(b).matches(".*1\.2\.840\.113549\.1\.1\.1.*")
    
    • 1

    如果我们觉得比较麻烦不想择整个对象,可以使用一个 SQL 语句来做查询,比如我们只想找到内存中所有存在"password"字段的对象,如下:

    SELECT password FROM ".*" WHERE (null != password)
    
    • 1

    MAT进行分析内存,可以尝试的分析技巧:

    • 通过一些关键字来快速查询,比如“password”、“pass”、“pin”、“secret”、“private”等
    • 字符串、字符数组、字节数组等中的加密模式(如RSA、md5等加密)
    • 已知的密码,比如已知道某个后端的密钥Key的关键字,然后通过关键字去内存中搜索
    • … …

    在分析内存是否泄露信息的时候,我们可能第一次查看内存并不一定会有什么发现,只需要更加耐心重复的多看几次说不定就有发现了,另外观察特定内存段(例如,字节数组)的变化方式说不定会发现一些隐藏的比较深且不容易发现的敏感数据

    参考链接

    https://orangey.blog.csdn.net/article/details/126600829


    你以为你有很多路可以选择,其实你只有一条路可以走


  • 相关阅读:
    MacOS - Sonoma更新了啥
    链表Oj练习题 纯C语言
    视觉检测系统可以检测太阳能电池片哪些方面的缺陷?
    一文读懂Plato Farm的ePLATO,以及其高溢价缘由
    Spring MVC 入门指南
    k8s KubeSphere流水线部署SpringBoot后端项目 详细教程
    对接艾睿电子Arrow EDI项目案例
    常见的屏幕接口
    深度学习:从理论到应用的全面解析
    Java 多线程 —— 内存合并
  • 原文地址:https://blog.csdn.net/Ananas_Orangey/article/details/126602548