0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Android开发的ADT获取内存中的敏感信息

西西 来源:哆啦安全 作者:橙留香Park 2022-09-06 15:22 次阅读

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 应用程序

e6cd4c9c-2d1e-11ed-ba43-dac502259ad0.png

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

e6ed3f98-2d1e-11ed-ba43-dac502259ad0.png

单击“Update HEAP”按钮

e70e57be-2d1e-11ed-ba43-dac502259ad0.png

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

e735f210-2d1e-11ed-ba43-dac502259ad0.png

e746228e-2d1e-11ed-ba43-dac502259ad0.png

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

./hprof-conv memory.hprof memory-mat.hprof

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

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

一种安装方式是将MAT当做eclipse的插件进行安装:启动Eclipse --> Help --> Eclipse Marketplace,然后搜索Memory Analyzer,安装,重启eclipse即可

另外一种安装方式是将MAT作为一个独立的软件进行安装:https://www.eclipse.org/mat/

e7629432-2d1e-11ed-ba43-dac502259ad0.png

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

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

e7752098-2d1e-11ed-ba43-dac502259ad0.png

e797776a-2d1e-11ed-ba43-dac502259ad0.png

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

e7a7e4b0-2d1e-11ed-ba43-dac502259ad0.png

e7cba3b4-2d1e-11ed-ba43-dac502259ad0.png

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

e7ea89dc-2d1e-11ed-ba43-dac502259ad0.png

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

e808c514-2d1e-11ed-ba43-dac502259ad0.png

e8223a1c-2d1e-11ed-ba43-dac502259ad0.png

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

e8498c84-2d1e-11ed-ba43-dac502259ad0.png

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

public class DoTransferextends 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;}

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

e86c46b6-2d1e-11ed-ba43-dac502259ad0.png

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

SELECT * FROM java.lang.String

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

SELECT toString(object) FROM java.lang.String object

或者
SELECT object.toString() FROM java.lang.String object

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

SELECT toString(arr) FROM char[] arr

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

SELECT * FROM byte[] b WHERE toString(b).matches(".*1.2.840.113549.1.1.1.*")

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

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

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

通过一些关键字来快速查询,比如“password”、“pass”、“pin”、“secret”、“private”等

字符串、字符数组、字节数组等中的加密模式(如RSA、md5等加密)

已知的密码,比如已知道某个后端的密钥Key的关键字,然后通过关键字去内存中搜索

... ...

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

编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Android
    +关注

    关注

    12

    文章

    3851

    浏览量

    125637
  • ADT
    ADT
    +关注

    关注

    0

    文章

    11

    浏览量

    9464

原文标题:Android利用ADT获取内存中的敏感信息

文章出处:【微信号:哆啦安全,微信公众号:哆啦安全】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ubuntu下搭建Android开发环境

    /downloads/2)下载ADT Plugin,利用eclipse的help>install software安装。http://developer.android.com/sdk/installing
    发表于 08-22 09:57

    Android SDK开发环境搭建

    ://developer.android.com上的安装步骤进行安装。不过,在Android 2.3,对应的ADT 8.0.0的文件布局发生了 基于SDK进行
    发表于 09-03 14:08

    飞凌嵌入式开发Android应用程序开发-入门级

    ,有利于您对Android系统的学习。所用的系统是Ubuntu 12.04操作系统,开发工具是ADT-Bundle。一 软件实现框架......................飞凌嵌入式开发
    发表于 05-20 14:41

    [资料分享]+Android内核剖析

    内存管理 19210.3 对AmS数据对象的理解 21110.4 ActivityGroup的内部机制 214第11章 从输入设备获取消息 22111.1
    发表于 09-26 10:46

    [分享]4412开发Android教程——Android开发环境搭建

    `分享视频链接:http://pan.baidu.com/s/1o6tgEeQ 下载和安装Android应用的开发环境新建Android虚拟环境 Android IDE简介JDK编译
    发表于 10-21 17:10

    Android安全开发之WebView的地雷

    `Android安全开发之WebView的地雷0X01 About WebView在Android开发
    发表于 09-09 19:35

    ADT7310读取的温度值波动较大

    实验项目,选取 ADT7310 作为温度传感器,MCU利用SSP接口模拟SPI的方式与AD通讯,通讯成功,能够正常读取ADT7310信息和温度值,配置为连续转换,连续读取模式,供电
    发表于 10-24 09:38

    ADT7420读取异常

    目前在一项目中使用ADT7420作为温度传感器获取环境温度,但是在使用中发现读取ADT7420的寄存器的返回值始终为0x0D、0x0E或0x0F,同样一套代码与I2C总线上的其他设备通信则无
    发表于 11-16 09:05

    基于ADT7475热监控器和PWM风扇控制器的ADT7475EBEVB评估板

    ADT7475EBEVB,ADT7475控制器评估板是一款热监控器和多个PWM风扇控制器,适用于需要主动系统冷却的噪声敏感或功耗敏感型应用。 ADT
    发表于 05-10 09:34

    Android环境的搭建

    Java的核心,包括了Java运行环境,Java工具和Java基础的类库。2.目前Android开发所用的开发工具是Eclipse,在Eclipse编译IDE环境,安装
    发表于 07-09 07:21

    Android性能优化之Java内存

    Android开发中,一些不好的编程习惯会导致我们的开发的app存在内存泄露的情况。下面介绍一些在Android
    发表于 04-26 15:38 880次阅读
    <b class='flag-5'>Android</b>性能优化之Java<b class='flag-5'>内存</b>

    Android ADT 23.0.3应用程序免费下载

    Android ADT目前已经更新到23.0.3,有需要的不要错过。它是在WINDOWS系统平台上SDK环境下用来开发安卓软件所必不可少的本地安装插件。
    发表于 07-11 17:48 20次下载

    如何使用Android SDK和ADT插件设置工作环境

    您现在已经准备好环境开发Android应用程序。我们安装了Android SDK,Eclipse和ADT插件。
    的头像 发表于 11-11 09:27 1853次阅读
    如何使用<b class='flag-5'>Android</b> SDK和<b class='flag-5'>ADT</b>插件设置工作环境

    Android开发模式详细介绍

    。在本章中,您将了解Android Studio、如何获取Android开发中使用的独立SDK工具、各种Android模拟器和版本控制系统。
    发表于 03-03 08:00 0次下载
    <b class='flag-5'>Android</b>的<b class='flag-5'>开发</b>模式详细介绍

    SDCardUtils封装类应用:设备信息获取实现方法

    硬件名、SDK版本、android版本 、语言支持、默认语言 六、 获取 SD 卡存储信息 七、 获取手机 RAM、ROM存储信息
    的头像 发表于 11-13 09:40 311次阅读
    SDCardUtils封装类应用:设备<b class='flag-5'>信息</b><b class='flag-5'>获取</b>实现方法