对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击。使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码、数据,修改其代码逻辑和机制等操作。这篇文章主要介绍一些基本的应用逆向和分析方法,演示Android应用的代码机密性和完整性是如何被破坏,进而被应用攻击者所用的。

一、Dalvik层源码逆向

在dalvik层代码的分析中,(一般情况下,对于未进行防护的应用)在Dalvik层,我们只关心classes.dex的逆向分析。

classes.dex是APK运行时的代码,是由源代码编译成的可以在dalvik上运行的代码。Dalvik虚拟机类似java虚拟机,所以可以用类似java的class文件的反编译方法,反编译classes.dex为java代码。对于未被保护的应用,可以用此方法还原出大部分代码。

整个过程中,涉及的代码形式如下:

· 1.dex文件,APK的可执行文件。

· 2.smali文件,Dalvik VM内部执行的代码。

· 3.jar文件和java文件,根据dex文件转换成的java代码文件.。

用到的工具介绍:

· 1.smali/baksmali :dex可执行文件向smali字节码文件互相转换的工具,转换的过程不丢失信息。

· 2.dex2jar:dex文件转化成java的jar文件的工具。因为Dalvik虚拟机和Java虚拟机的差异,转换无法做到一一对应,会有信息丢失和代码的错误。(该工具是整个源码逆向中非常有意义的一步 )。

· 3.jd/jd-gui:java的jar文件反编译工具。

· 4.APK改之理(ApkIDE):Windows平台下一个集成了上述工具的有GUI的平台。

最终生成的java源码形式如图。此时Dalvik层源码的逆向已经完成,可以对应用进行进一步的准源码级别的分析。

二、Dalvik层代码篡改

Dalvik层的代码篡改主要发生在smali文件上。反编译出的java代码虽然易读,但已经丢失了部分信息,同时可能存在若干错误,基本上没办法再编译回可执行文件。同时dex二进制文件不具备可读性。所以一般情况下,只能在smali中的代码上进行修改,重新打包生成APK。

代码层的篡改,可以修改应用的逻辑流程,插入恶意代码、绕过关键的安全流程(注册、验证、付款),打印敏感数据等。篡改代码、重打包技术一般应用在破解软件的注册验证机制(AD block破解注册,海卓破广告VIP,MIUI收费主题破解),修改游戏的规则(微信飞机大战破解),应用的敏感API调用的监控(APIMonitor,通过Android重打包加固APK拦截软件行为)。

Dalvik层代码篡改的使用的一个比较著名的例子是:APIMonitor。

APIMonitor的工作原理是,反编译apk文件,遍历smali代码,搜索配置文件中配置的需要监控的Api,如果找到一个Api的调用,则分析其参数,然后调用droidbox包空间下对应的类的静态函数。这些静态函数实现都是解析参数,打印输出log信息。处理完毕后,重新编译生成apk。

三、Dalvik层代码的Hook

samli代码的篡改需要重新打包,新的包的签名和文件校验都和原有的包不同,可以被应用内的完整性检查模块识别,进而限制进一步的操作。解决这个问题的一个方法是,可以通过把自定义代码注入到应用的进程空间,实时的代码hook,不修改代码,实现对应用的代码逻辑的修改。

可以实现上述功能的的框架工具是xposed,和cyida substrate。xposed应用相对广泛。xposed的原理可以参考之前分享的文档《Xposed原理及实现》。

Xposed的应用比较有名的两个例子分别是

1.Zjdroid,通过hook系统挂载dex文件的函数,自动化脱掉大部分android的加密壳。

2.Xprivicy,通过hook大部分隐私函数的调用,监控或者阻断应用对隐私API的调用。

Dalvik层代码的hook会在第三篇文章中详细介绍。

四、本地.so文件的分析

本地.so文件一般提供敏感函数的封装。对于未被保护的.so文件,可以通过IDA进行静态分析和动态挂载调试。so文件的分析会在第四篇文章中详细介绍。

五、浅谈Android应用保护系列文章

浅谈Android应用保护(零):出发点和背景


作者:纳池@阿里移动安全,更多安全类技术文章,请点击阿里聚安全博客

浅谈Android应用保护(一):Android应用逆向的基本方法的更多相关文章

  1. 浅谈分词算法(5)基于字的分词方法(bi-LSTM)

    目录 前言 目录 循环神经网络 基于LSTM的分词 Embedding 数据预处理 模型 如何添加用户词典 前言 很早便规划的浅谈分词算法,总共分为了五个部分,想聊聊自己在各种场景中使用到的分词方法做 ...

  2. 浅谈分词算法(4)基于字的分词方法(CRF)

    目录 前言 目录 条件随机场(conditional random field CRF) 核心点 线性链条件随机场 简化形式 CRF分词 CRF VS HMM 代码实现 训练代码 实验结果 参考文献 ...

  3. 浅谈分词算法(3)基于字的分词方法(HMM)

    目录 前言 目录 隐马尔可夫模型(Hidden Markov Model,HMM) HMM分词 两个假设 Viterbi算法 代码实现 实现效果 完整代码 参考文献 前言 在浅谈分词算法(1)分词中的 ...

  4. 浅谈Windows下SVN在Android Studio中的配置、基本使用及解除关联

    看到网上很多关于svn环境配置和关联Android-Studio的很多博文,发现很零散,想集大家所长整理一下: 在AndroidStudio中开发版本控制中,除了Git就是SVN,和Eclipse不同 ...

  5. 浅谈利用SQLite存储离散瓦片的思路和实现方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在多个项目中涉及到互联网地图的内网显示,通过自制工具完成了互联 ...

  6. [转]浅谈利用SQLite存储离散瓦片的思路和实现方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在多个项目中涉及到互联网地图的内网显示,通过自制工具完成了互联 ...

  7. 浅谈PHP的Public、Protected、Private三种方法的区别

    public:权限是最大的,可以内部调用,实例调用等.protected: 受保护类型,用于本类和继承类调用.private: 私有类型,只有在本类中使用. <?php error_report ...

  8. Oracle索引梳理系列(九)- 浅谈聚簇因子对索引使用的影响及优化方法

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  9. 浅谈C#中一种类插件系统编写的简单方法(插件间、插件宿主间本身不需要通信)

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 三年多前还在上研时,用C#+反射机制写过插件系统,后来又用M ...

  10. 源码浅谈(二):java中的 Integer.parseInt(String str)方法

    这个方法是将字符串转换为整型 一.parseInt方法 ,可以看到默认又调用了parseInt(s,10) ,  第二个参数为基数,默认10 ,当然也可以自己设置  public static int ...

随机推荐

  1. tensorflow中的lstm的state

        考虑 state_is_tuple     Output, new_state = cell(input, state)     state其实是两个 一个 c state,一个m(对应下图的 ...

  2. 【leetcode】Add Two Numbers

    题目描述: You are given two linked lists representing two non-negative numbers. The digits are stored in ...

  3. Power BI入门教程

    题记:这篇文章不仅是Power BI的入门教程,同时相对于Qlik Sense进行了简单比较. 最近把一个Qlik Sense的示例应用手动转成了Power BI的应用,把相关步骤和遇到的问题记录如下 ...

  4. maven权威指南学习笔记(四)—— maven生命周期(lifecycle)

    定义: 生命周期是包含在一个项目构建中的一系列有序的阶段 举个例子来说就是maven 对一个工程进行: 验证(validate) -- 编译源码(compile) -- 编译测试源码(test-com ...

  5. Spring MVC类型转换

    类型转换器引入 为什么页面上输入"12",可以赋值给Handler方法对应的参数?这是因为框架内部帮我们做了类型转换的工作.将String转换成int 但默认类型转换器并不是可以将 ...

  6. 金融计算器app的下载情况

    下图就是一个多月来的下载量情况~话不多说,直接上图哈. 数据来源:百度开发者平台

  7. centos添加和删除用户及 xxx is not in the sudoers file.This incident will be reported.的解决方法

    修改主机名:vim /etc/sysconfig/network 1.添加用户,首先用adduser命令添加一个普通用户,命令如下: #adduser tommy //添加一个名为tommy的用户 # ...

  8. Nginx - Windows下作为服务启动

    Nginx官方没有提供作为服务启动nginx的方案.以服务启动nginx依赖于winsw,当前最新版是1.19. 参考:https://segmentfault.com/a/1190000006807 ...

  9. BZOJ 1047 二维单调队列

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 题意:见中文题面 思路:该题是求二维的子矩阵的最大值与最小值的差值尽量小.所以可以考 ...

  10. Linux查看系统运行情况

    http://elinux.org/Runtime_Memory_Measurement