苏州龙信信息科技有限公司高级研发工程师
中科院硕士/龙信明星讲师
教学风格轻快活泼,语言幽默,课堂内容扎实
基于Android端逆向思维与基础
零开始/无任何环境机器
简单安卓逆向操作的科普
今天的龙信公开课主要针对“基于Android端逆向思维与基础”主题,和大家一起来探索安卓端逆向的奥秘。
众所周知,android逆向过程,环境是必不可少的,首先介绍android逆向的环境搭建。
JDK下载地址:
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
可以根据自己的需要下载, 如下:

这里注意一下, 安装的时候路径尽量不要有空格, 避免出现未知问题, 这里可以如下安装:

安装完成后手动添加JAVA_HOME环境变量中的系统变量
(变量名: JAVA_HOME, 变量值: D:\JAVA\jdk1.8.0_261),
将D:\JAVA\jdk1.8.0_261\bin添加到系统的PATH变量中,并以分号结束, 输入java -version检查结果。

这个可以使用AndroidStudio自带的, 接着开始下载AndroidStudio, 下载地址:
https://developer.android.google.cn/studio/
安装完成后,将
C:\Users\Administrator\AppData\Local\Android\Sdk\tools与C:\Users\Administrator\AppData\Local\Android\Sdk\platform-tools目录添加到系统的PATH环境变量中,接着输入adb version 检查是否成功运行。

smali插件安装
下载地址
https://bitbucket.org/JesusFreke/smali/downloads/
好了, 接着打开AndroidStudio加载上插件, 操作如下:




接着选择刚刚下载的那个插件, 安装, 安装成功之后如下图:

逆向安卓程序, 合适的工具必不可少。 其中apktool和jadx必然不可少, 与其逐个进行命令式调试, 不如用集成GUI工具, 在这里我推荐使用这款工具Apktool Box

这款工具的集成表现较为优秀,包括查壳, 可以直接代码里面看壳特征。

这两款集成GUI工具, 足够满足上层JAVA程序的逆向需求。
ApkTool下载地址
https://ibotpeaches.github.io/Apktool/
替换Android Killer中的apktool需要, 具体如下:



针对android上层的反编译和调试环境和工具准备完毕, 基于android底层so库的逆向以及环境搭建, 由于相对上层复杂度和,难度以及知识涵盖量都更大,比如:上层的JAVA代码对应的汇编代码是Smali汇编, 底层so库是用C写的, 对应的汇编是arm汇编代码, 基本上加固壳的对抗, 核心协议算法甚至保护, 反调, ollvmp等等都在so层对抗。这部分知识,等大家彻底熟悉之后,我们再进行深入探索。
字符串, 函数, 行为等信息,需要从反向思维来寻找突破点。这需要借助一定的编程知识,不断尝试、 测试,直至突破。
当拿到apk应用时, 每个人的思维过程都不一样, 这里以常见的思维过程来描述,作为参考:
首先进行查壳动作,看看是否存在加固,加固类型;确定app的用途,逆向一套通信协议算法。
这里以近期的工作项目作为示例,为方便起见,本案例中没有加固。
目标:解密QQ邮箱缓存文件名称, 如下图:

使用静态逆向全局观看, 静态分析无法满足。
首先借助cache缓存。一般cache缓存都是使用第三方库来生成的, 可以直接走这类库入手或者寻找调用库的地方, 一步一步逆向回溯, 不过这样来回溯, 虽然最终还是能逆向到关键点, 但是我们可以完全选择更快的突破办法, 如下表:

这张表中,有比较明显的敏感的信息:字符串。当然这个字符串不是后面密文的,那是加密出来的, 这里的字符串是前缀, 开始逆向, 将apk扔进Android killer中。
首先要将apk变为可调试状态, 这里apk并未做资源加密混淆, 因此可以正常回编译, 那么直接在AndroidManifest.xml增加一行代码即可。
而当apk做了防止回编译和资源混淆时, 就需要开启上帝模式了, 这里需要使用增加调试属性代码的模式, 在应用这里增加调试属性为true

这个文件的位置如下:

Android killer反编译完之后的工程目录下, 接着我们将这个工程拷贝到一个新文件夹中, 如下:

接着打开androidStudio, 进行导入工程, 如下:

选择刚刚拷贝的工程,一直next, 最后如下:

自此,工程就导入完毕了, 接着如下:

启动apk等待调试, adb shell am start -D -n 包名/入口名


我们用Apktool Box运行:

或者不在启动处进行调试, 直接进行附加:

开始全局搜索DIRTY, 这里可以用notepad++, 也可以使用

这里使用AndroidStudio自带的搜索框,全局搜索下断, 最终回溯到源头, 如下:


函数内部采用的是MD5的算法, 函数返回如下:


刚好对应的是该文件加密之后的文件名, 自此, 入口和出口都找到了(逆向寻找某些功能,其中一方面必然定位入口和出口),继续回溯, 就能轻松获取参与加密的明文参数。
本示例中的代码都是逆向smali汇编代码,虽然可以查看伪代码JAVA,但大多都会转换失败,依旧需要手动还原Smali为JAVA代码。因此查看smali的精度要比JAVA代码更准确。
本示例从环境搭建, 工具使用, 思维方式, 以及如何切入到关键点进行动态调试。
动态调试是一种方法, 还有很多方法可以实现逆向目的,比如:静态分析, 插装法, 日志法, HOOK大法, 反射定位法等等。
逆向过程需要一定基础,熟练运用工具,并且掌握正常和逆向语言,比如JAVA和对应的smali, C对应的arm。逆向过程中,最核心的部分是思维和扩散,这二者往往能快速找到切入点。

在对于某个特定应用的逆向分析, 比如为客户提供线索,步骤也基本与上述案例相似,只是往往更多选择静态分析, 反编译过程和上述案例的过程一样。
在分析方面的最大的区别在于:
在针对apk某个功能逆向, 逆向寻找的是应用本身实现以及行为;
针对寻找线索,逆向的是它与哪些平台或者合作商等存在藕断丝连的关系,甚至自己留下的一些信息等等, 至于技术方面与上述例子相差不大。
本期关于安卓逆向基础方面和思维方面运用以及实际操作就讲解到这来, 感谢大家细心观看,我们下期见。
苏州龙信不忘初心,以专业的技术为各级行政执法部门打击违法犯罪活动提供更快速全面的技术解决方案。
如有需要请联系我们或您所在地我们的合作伙伴。


