安卓逆向过程-(以某班为例)

  • 安卓应用逆向过程
  • 搭建手机虚拟环境
  • 软件查壳
  • 脱壳(本教程适合腾讯御安全的加壳)
  • 软件抓包(与主题关系不太大)
  • 常规方式进行反编译
  • 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模块
# 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】【安卓逆向工程】