浅谈Android应用保护(一):Android应用逆向的基本方法

JeanNava 8年前
   <p> </p>    <p>对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击。使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码、数据,修改其代码逻辑和机制等操作。这篇文章主要介绍一些基本的应用逆向和分析方法,演示Android应用的代码机密性和完整性是如何被破坏,进而被应用攻击者所用的。</p>    <h2><strong>一、Dalvik层源码逆向</strong></h2>    <p>在dalvik层代码的分析中,(一般情况下,对于未进行防护的应用)在Dalvik层,我们只关心classes.dex的逆向分析。</p>    <p>classes.dex是APK运行时的代码,是由源代码编译成的可以在dalvik上运行的代码。Dalvik虚拟机类似java虚拟机,所以可以用类似java的class文件的反编译方法,反编译classes.dex为java代码。对于未被保护的应用,可以用此方法还原出大部分代码。</p>    <p>整个过程中,涉及的代码形式如下:</p>    <p>· 1.dex文件,APK的可执行文件。</p>    <p>· 2.smali文件,Dalvik VM内部执行的代码。</p>    <p>· 3.jar文件和java文件,根据dex文件转换成的java代码文件.。</p>    <p><img src="https://simg.open-open.com/show/bb88b8c187c8c4ac0061003cccf2daaf.jpg"></p>    <p>用到的工具介绍:</p>    <p>· 1.smali/baksmali :dex可执行文件向smali字节码文件互相转换的工具,转换的过程不丢失信息。</p>    <p>· 2.dex2jar:dex文件转化成java的jar文件的工具。因为Dalvik虚拟机和Java虚拟机的差异,转换无法做到一一对应,会有信息丢失和代码的错误。(该工具是整个源码逆向中非常有意义的一步 )。</p>    <p>· 3.jd/jd-gui:java的jar文件反编译工具。</p>    <p>· 4.APK改之理(ApkIDE):Windows平台下一个集成了上述工具的有GUI的平台。</p>    <p>最终生成的java源码形式如图。此时Dalvik层源码的逆向已经完成,可以对应用进行进一步的准源码级别的分析。</p>    <p><img src="https://simg.open-open.com/show/6c4abfbf35456e4b260cc1a9a310d73b.jpg"></p>    <h2><strong>二、Dalvik层代码篡改</strong></h2>    <p>Dalvik层的代码篡改主要发生在smali文件上。反编译出的java代码虽然易读,但已经丢失了部分信息,同时可能存在若干错误,基本上没办法再编译回可执行文件。同时dex二进制文件不具备可读性。所以一般情况下,只能在smali中的代码上进行修改,重新打包生成APK。</p>    <p>代码层的篡改,可以修改应用的逻辑流程,插入恶意代码、绕过关键的安全流程(注册、验证、付款),打印敏感数据等。篡改代码、重打包技术一般应用在破解软件的注册验证机制(AD block破解注册,海卓破广告VIP,MIUI收费主题破解),修改游戏的规则(微信飞机大战破解),应用的敏感API调用的监控(APIMonitor,通过Android重打包加固APK拦截软件行为)。</p>    <p>Dalvik层代码篡改的使用的一个比较著名的例子是:APIMonitor。</p>    <p>APIMonitor的工作原理是,反编译apk文件,遍历smali代码,搜索配置文件中配置的需要监控的Api,如果找到一个Api的调用,则分析其参数,然后调用droidbox包空间下对应的类的静态函数。这些静态函数实现都是解析参数,打印输出log信息。处理完毕后,重新编译生成apk。</p>    <h2><strong>三、Dalvik层代码的Hook</strong></h2>    <p>samli代码的篡改需要重新打包,新的包的签名和文件校验都和原有的包不同,可以被应用内的完整性检查模块识别,进而限制进一步的操作。解决这个问题的一个方法是,可以通过把自定义代码注入到应用的进程空间,实时的代码hook,不修改代码,实现对应用的代码逻辑的修改。</p>    <p>可以实现上述功能的的框架工具是xposed,和cyida substrate。xposed应用相对广泛。xposed的原理可以参考之前分享的文档《Xposed原理及实现》。</p>    <p>Xposed的应用比较有名的两个例子分别是</p>    <p>1.Zjdroid,通过hook系统挂载dex文件的函数,自动化脱掉大部分android的加密壳。</p>    <p>2.Xprivicy,通过hook大部分隐私函数的调用,监控或者阻断应用对隐私API的调用。</p>    <p>Dalvik层代码的hook会在第三篇文章中详细介绍。</p>    <h2><strong>四、本地.so文件的分析</strong></h2>    <p>本地.so文件一般提供敏感函数的封装。对于未被保护的.so文件,可以通过IDA进行静态分析和动态挂载调试。so文件的分析会在第四篇文章中详细介绍。</p>    <h2><strong>五、浅谈Android应用保护系列文章</strong></h2>    <h2><a href="http://www.open-open.com/lib/view/open1460718090719.html" rel="nofollow,noindex">浅谈Android应用保护(零):出发点和背景</a></h2>    <p>作者:纳池@阿里移动安全</p>    <p>来自: <a href="/misc/goto?guid=4959670811008056678" rel="nofollow">http://jaq.alibaba.com/community/art/show?articleid=257</a></p>