Android 逆向分析大全

本文详细介绍了Android逆向分析的过程,包括通用步骤、分析工具、常见文件格式、Java层与Linux层的调试方法,以及联合调试、Hook技术和GDB调试技巧。通过实例分析了360手机卫士卸载后的弹窗机制,提供了丰富的调试工具和方法,旨在帮助读者深入理解Android程序的逆向分析。
摘要由CSDN通过智能技术生成

转载:Android 逆向分析大全:https://www.jianshu.com/p/a12d04fc748f

1. 概述

1.1 分析步骤

通用逆向分析步骤

  • 1. 了解该模块正向编程相关方法
  • 2. 使用apktool解密apk,得到资源、jni模块等文件
  • 3. 从apk提取出dex文件,使用dex2jar转换成jar文件,再用java逆向工具得到java源码 dex->jar->java
  • 4. 根据特征(字符串、常量、包名类名方法名、manifest文件、布局文件等方式)或调试手段定位到关键代码
  • 5. 分析变量含义类型、函数逻辑、模块流程
  • 6. 对变量、函数、类进行标注、恢复成高级语言 ->c

Android程序的特点相比在于使用混淆方式打包,将包名、类名、函数名改成不易看懂的字母,从而使生成的apk小很多(android studio提供了release编译方式,使用proguard混淆),因此反编译apk最多的工作在于重构这些名称,这一点和pc上一致,对于android native程序(jni)则和pc上基本一致,不同之处在于常见的是arm汇编。

安卓上APK调试步骤:

  • 1.Apk(debuggable)或系统(ro.debuggable=1)设置为可调试
  • 2.在虚拟机中启动服务端(adbd/android_server)
  • 3.在主机端连接客户端调试器(IDA/jdb/adt),设置断点

安卓上linux程序调试步骤:

  • 1.在虚拟机中启动服务端(gdb_server/linux_server)
  • 2.在主机端连接客户端调试器(IDA/gdb_for_windows),设置断点

对于apk的反编译,由于资源和xml都进行了编码,因此反编译时必然要解析相应的resource.arsc/AndroidManifest.xml等文件,对于做过保护处理的apk通常会在这里做手脚干扰Apktool、dex2jar等反编译工具因此很有必要掌握编译、调试这些工具源码的方法(见“如何编译、调试apktool和dex2jar”)

1.2 分析工具

  • 集成IDE:APK改之理、JD-GUI、JEB(1.4破解 2.0)、jadx
  • 解压(apk, jar):WinRar
  • 解析资源:apktool
  • 反编译引擎(jar, class):dex2jar工具集、jd-core(JD-GUI,JD-Eclipse反编译核心)、fernflower(Android Studio反编 、procyon
  • 回编译:aapt、dex2jar工具集
  • 调试器:IDA、jdb、adt等
  • 辅助工具:DDMS 如果是虚拟机可以看到所有进程

APK 改之理

  • 整合&提供了全套解压、反编译代码和资源、回编译、签名功能,强大的正则搜索,修改smali字节码等功能
  • 集成ApkTool、Dex2jar、JD-GUI工具
  • 可视化操作,全自动的反编译、回编译、签名Apk
  • 正则表达式搜索资源及源码

JD-GUI

轻量级反编译,反编译jar/class等java字节码文件(能力一般),提供简单的搜索能力

JEB

  • 反编译apk/jar工具(能力较强)
  • 强大的正向、反向索引,一定程度重命名能力,一定搜索能力
  • 支持注释、插件
  • 交互式可视化操作,全自动的反编译
  • 支持重命名

Dex2jar 工具集

dex2jar是一个工具包,反编译dex和jar,还提供了一些其它的功能,每个功能使用一个bat批处理或 sh 脚本来包装,只需在Windows 系统中调用 bat文件、在Linux 系统中调用 sh 脚本即可。在bat中调用相应的jar主类完成特定功能,例如d2j-dex2jar.bat中的内容是:@"%~dp0d2j_invoke.bat" com.googlecode.dex2jar.tools.Dex2jarCmd %*。常用的有dex2jar jar2dex dex2smali smali2dex

  • d2j-apk-sign用来为apk 文件签名。命令格式:d2j-apk-sign xxx.apk 。
  • d2j-asm-verify 用来验证jar 文件。命令格式:d2j-asm-verify -d xxx.jar。
  • d2j-dex2jar 用来将dex 文件转换成jar 文件。命令格式:d2j-dex2jar xxx.apk
  • d2j-dex-asmifier 用来验证dex 文件。命令格式:d2j-dex-asmifier xxx.dex。
  • d2j-dex-dump 用来转存dex 文件的信息。命令格式:d2j-dex-dump xxx.apk out.jar 。
  • d2j-init-deobf 用来生成反混淆jar 文件时的初始化配置文件。
  • d2j-jar2dex 用来将jar 文件转换成 dex 文件。命令格式:d2j-jar2dex xxx.apk。
  • d2j-jar2jasmin 用来将jar 文件转换成jasmin 格式的文件。命令格式:d2j-jar2jasmin xxx.jar
  • d2j-jar-access 用来修改jar 文件中的类、方法以及字段的访问权限。
  • d2j-jar-remap 用来重命名jar 文件中的包、类、方法以及字段的名称。
  • d2j-jasmin2jar 用来将jasmin 格式的文件转换成 jar 文件。命令格式:d2j-jasmin2jar dir dex2jar为d2j-dex2jar 的副本。
  • dex-dump为d2j-dex-dump 的副本

Apktool反编译&打包工具

  • 反编译apk:apktool d file.apk –o path
  • 回编译apk:apktool b path –o file.apk

1.3 常见文件格式

Apk

Android package,android安装程序文件,本质上是压缩包,解压得到classes.dex、resources.arsc、AndroidManifest.xml、so文件以及资源文件

  • Resources.arsc资源描述文件
  • Classes.dex所有代码编译过得darvik字节码文件,可能会有多个
  • AndroidManifest.xml 编译过的AndroidManifest.xml文件

使用 aapt 解析 xml

aapt d xmltree 1.apk AndroidManifest.xml
N: android=http://schemas.android.com/apk/res/android
  E: manifest (line=2)
    A: android:versionCode(0x0101021b)=(type 0x10)0x1
    A: android:versionName(0x0101021c)="1.0" (Raw: "1.0")
    A: package="com.ibotpeaches.issue767" (Raw: "com.ibotpeaches.issue767")
    A: platformBuildVersionCode=(type 0x10)0x17 (Raw: "23")
    A: platformBuildVersionName="6.0-2438415" (Raw: "6.0-2438415")
    E: uses-sdk (line=0)
      A: android:minSdkVersion(0x0101020c)=(type 0x10)0x16
      A: android:targetSdkVersion(0x01010270)=(type 0x10)0x17
    E: application (line=3)
      A: android:theme(0x01010000)=@0x7f090083
      A: android:label(0x01010001)=@0x7f060015
      A: android:icon(0x01010002)=@0x7f030000
      A: android:debuggable(0x0101000f)=(type 0x12)0xffffffff
      A: android:allowBackup(0x01010280)=(type 0x12)0xffffffff
      A: android:supportsRtl(0x010103af)=(type 0x12)0xffffffff
      E: activity (line=4)
        A: android:theme(0x01010000)=@0x7f090030
        A: android:label(0x01010001)=@0x7f060015
        A: android:name(0x01010003)="com.ibotpeaches.issue767.MainActivity" (Raw
: "com.ibotpeaches.issue767.MainActivity")
        E: intent-filter (line=5)
          E: action (line=6)
            A: android:name(0x01010003)="android.intent.action.MAIN" (Raw: "andr
oid.intent.action.MAIN")
          E: category (line=7)
            A: android:name(0x01010003)="android.intent.category.LAUNCHER" (Raw:
 "android.intent.category.LAUNCHER")
      E: meta-data (line=10)
        A: android:name(0x01010003)="large.int.value" (Raw: "large.int.value")
        A: android:value(0x01010024)="9999999999999999999999" (Raw: "99999999999
99999999999")

查看xml => aapt d xmltree 1.apk AndroidManifest.xml
查看resource => aapt d resources 1.apk (resource.arsc)

Dex

Dalvik Executable,Dalvik可执行文件,从java class文件转换而来的字节码,Classes.Dex通过dex2jar转换成java字节码(有损),或者dex2smali转换成darvik汇编(无损)——smali字节码,其形式如下

Jar

Java Archive,java归档文件,可以直接解压得到class文件

Odex

dex 转 odex:/system/bin/dexopt
dexopt-wrapper 1.apk 1.odex

Aar

Android 归档文件,压缩包格式,包含

  • /AndroidManifest.xml (强制) 未编译的

  • /classes.jar (强制)

  • /res/ (强制)

  • /R.txt (强制)

  • /assets/ (可选)

  • /libs/*.jar (可选)

  • /jni/

    <abi>/*.so (可选)</abi>

  • /proguard.txt (可选)

  • /lint.jar (可选)

So

Linux 动态链接库文件,包含arm64 arm mips mips64 x86 x86-64几个平台

工具转换图

Android 设备上重要目录

  • /system/app/1.apk 系统应用
  • /data/app/1.apk 用户应用
  • /data/data/[pkgname] 应用数据(so,database,…)
  • /data/dalvik-cache 存放dex

2. Java 层 

2.1 常用工具

adb

设备通信、调试工具,常用法:

adb devices 列出当前设备
adb –s d24eb3ab [命令]      指定设备执行命令
adb push 源 目标            非root机器可以设置路径为/data/local/tmp
adb pull 源 目标
adb shell                   执行终端
adb logcat                  查看日志(/system/logcat为服务器)
adb jdwp                    查看远程jdwp进程
adb forward tcp:主机端口     tcp:远程端口       把主机端口消息转发手机端口(端口对应进程)   用于ida调试
adb forward tcp:主机端口     jdwp:远程进程ID    把主机端口消息转发手机jdwp进程   用于jdb调试 
adb install [apkpath]       安装apk
adb uninstall [packagename] 卸载apk 注意会彻底清理,删除/data/app下的备份apk
adb remount                 将/system重新映射为读写,以便进行系统区文件操作
adb root                    使adb以root方式启动,便于push/pull/remount

aapt

APK资源管理工具,用于增删查改APK中的文件、资源等,对于分析编译后的Resource.arsc, AndroidManifest.xml格式较有价值,通常也可以用winrar对apk/jar进行解压

打印xml树 aapt d xmltree 1.apk AndroidManifest.xml
打印资源    aapt d resources 1.apk
添加文件    aapt a 1.apk AndroidManifest.xml
删除文件    aapt r 1.apk AndroidManifest.xml

am & pm

Android 远程命令,am 执行调试、运行功能,pm 执行安装、卸载功能

  • 启动应用:am start -D -n "b.myapp/b.myapp.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
  • 启动服务:am startservice -n com.android.music/com.android.music.MediaPlaybackService
  • 强制停止包:am force-stop com.example.administrator.myapplication
  • 强制结束包进程:am kill com.example.administrator.myapplication am kill all
  • 发送广播:adb shell
  • 1
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值