安卓逆向过程-(以某班为例)
- 安卓应用逆向过程
- 搭建手机虚拟环境
- 软件查壳
- 脱壳(本教程适合腾讯御安全的加壳)
- 软件抓包(与主题关系不太大)
- 常规方式进行反编译
- class.dex文件反编译
- androidManifest.xml提取程序入口
- jd-gui
- .so文件反编译以及遇到的坑
- python的ctypes库
- ida_pro
安卓应用逆向过程
本篇文章仅作以记录我的一次安卓应用逆向过程,供学习使用,请勿用做任何非法违规事物,违规者法律必将严惩。
搭建手机虚拟环境
- 作者在这里采用的是
Vmos_pro
+xpose
作为手机虚拟环境。 Vmos_pro
推荐设置root
且允许xposed
,建议选择极客模式
+安卓7x/安卓5x
。
软件查壳
在直接进行反编译的过程中直接用androidkiller
或者apktool
进行反编译可能会遇到许多无效的反编译结果或者反编译失败的问题,这个结果中可能是因为软件被进行了加壳。所以建议首先进行软件查壳,pkid
的查壳效果还是挺不错的。因此此处以pkid
为例进行介绍。
- 作者使用
PKid
进行查壳,资源包位置资源包中除了查壳工具以外还含有多种脱壳工具。 - 操作流程还是比较简单的,打开软件输入链接或者直接将安装包拖入
PKid
之中。 - 运行后结果图片参考,本次遇到的应用加壳为腾讯御安全加固方式。
如果应用未被加固的话可以跳到后面的常规方式进行反编译。
脱壳(本教程适合腾讯御安全的加壳)
- 安装好环境之后打开虚拟机,安装
mt管理器
和反射大师
资源包地址并在xposed
中激活反射大师
模块并重启虚拟机。 - 使用反射大师并选中目标应用,清除后台目标应用的活动。
- 再次点击目标应用选择打开。
- 打开目标应用之后等待屏幕上出现的
红色六芒星
,点击红色六芒星。 - 选中
当前Activity
然后点击导出dex
,关闭应用与反射大师。 - 打开
mt管理器
并为其授权超级用户
,选中导出的classes.dex
文件,本过程中我选择的是使用其dex模块
并将dex转化为jar
,除了本方式外也可以采用下方操作将dex文件转化为jar方便后续打开。 - 也可以参考吾爱破解大佬的文章 实战腾讯御安全脱壳与修复,多图详细解说进行更具体d\的操作。
- 【安卓逆向】腾讯御加固脱壳修复,实战逆向同声翻译超级版,全网最详细!等视频教程
软件抓包(与主题关系不太大)
- 在本地安装
httpcanary
,在虚拟机内安装justTrustMe
,资源包位置,在xposed
中激活justTrustMe
模块后重启Vmos
。 - 因为在虚拟机内无法进行网络代理操作,因此选择将抓包工具安装在本地。
- 打开
httpcanary->目标应用->com.vmos.pro
。 - 点击
httpcanary
右下角开始抓包。 - 在
Vmos
内打开目标应用,正常打开,一定记得安装justTrustMe
并打开xposed
中的模块,在打开xposed
后一定要重启Vmos
防止抓包错误情况。
常规方式进行反编译
class.dex文件反编译
- 在这一步之前首先需要你的电脑已经配置好
java
环境,如果没配置可以参考【Java安装教程】 - 下载
dex2jar
并解压,资源地址。 - 将需要反编译的
classes.dex
文件复制到dex2jar
文件夹内。 - 在地址栏输入
cmd
并回车,打开dos
界面。
d2j-dex2jar classes.dex
- 文件输出为jar文件
androidManifest.xml提取程序入口
- 直接打开apk文件中的
androidManifest.xml
可能会输出乱码字符串 - 因此我们使用
apktool
进行逆向apk获得其完整的androidManifest.xml
文件,apktool文件资源在此。
java -jar apktool.jar d **.apk # **为apk安装包名称
- 将输出的文件夹之中的
androidManifest.xml
打开即为所需的文件。 - 在这一步能够获得程序入口,后续也方便对一些文件进行更改。
-
xml
文件格式通常如下,对照xml
格式的字段即可找到程序入口为MainActivity
.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.it123cp.logintest"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<!-- 设置MainActivity包中的MainActivity类为Activity(src\MainActivity\MainActivity.java) -->
<activity android:name="MainActivity$MainActivity">
<intent-filter>
<!-- 设置MainActivity为应用程序的入口点 -->
<action android:name="android.intent.action.MAIN" />
<!-- 设置应用程序图标显示在手机主界面上(可以打开应用程序) -->
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
jd-gui
- 在这一步对以上步骤过程中拿到的.jar文件进行打开。
- 通过androidManifest.xml提取的程序入口开始按照函数逐步打开每个函数。
- 本次逆向过程中主要是为了获取密码的加密字段
- 因此对login函数进行定位。
- 获取到加密函数以及加密方式,我们期望能够获得其加密的Key值。
- 我们继续进行溯源获得最末端位置,直到最后还是没有找到加密的key值。
- 但是我们获得了如下信息,他动态的加载了
**
共享库 - 我们在apk文件中找到了
lib**.so
并对其进行处理。
.so文件反编译以及遇到的坑
python的ctypes库
- 可以考虑使用
ctypes
库的cdll函数
读取lib**.so
文件。 - 代码如下
from ctypes import cdll
cur=cdll.LoadLibrary('lib**.so')
print(cur.xxx)#lib**.so 的xxx模块
- 更多操作见python调用c++模块.so库, 互相回传数据(ctypes、pybind11)、ctypes python中文开发手册等文章
- 但是在本次操作过程中很不幸遇到了多次错误。
# windows
OSError: %1 不是win32应用程序。
# linux
OSError: ./lib**.so:wrong ELF class: ELFclass32.
- 因此我采用
ida_pro
打开我的lib**.so
文件。
ida_pro
- 下载
ida_pro
工具包,资源地址,打开并解压。 - 点击
ida.exe->ok->Go->file->open
打开目标.so
文件点击ok->yes
。 - 我们使用
ida.exe
而不是ida64.exe
作为工具打开lib**.so
文件.,请注意区别,防止后续步骤出错。 - 以下为我的步骤,与读者需求可能有所不同,推荐使用大佬的思路进行逆向Android逆向之旅—破解某应用加密算法(动态调试so和frida hook so代码)
- 根据前面所获得的信息,我们打开了如下函数获取公钥。
- 直接打开后是这样
- 这样不利于我们获取
Key
,当然也有大佬是直接翻伪汇编语言的。我们则选取捷径,按下f5
即可跳转到c代码页面(捷径的缺点在于ida无法识别的函数字段可能会省略跳过,请自行斟酌) - 如上图所示区域即为所求
Key
值。
参考资料:
【安卓逆向教程】【安卓逆向工具】【腾讯应用加固的脱壳分析和修复】【从安卓运行时出发进行脱壳处理】【怎样反编译 Android APK】【安卓逆向工程】