当前位置:   article > 正文

[1196]Android逆向工具【反射大师】脱壳实战

反射大师

关于逆向

逆向——包括但不限于通过反编译、Hook 等手段,来解析一些功能的实现过程。

逆向在很多领域都有应用,比如如今爬虫技术已经遍地走,甚至不用写代码都可以爬取数据,导致前端开发的反爬意识也逐步提升。因此 JS、Android 等领域的逆向,已经成为爬虫开发者必备的技能之一。

逆向的准备

这里介绍下关于 Android 的逆向准备:

  • Android 真机或模拟器(最好是真机)
  • 安装 Android 5.0 或 6.0 版本
  • Fiddler、Charles 等抓包工具
  • Jadx、ApkTool 等反编译工具
  • dumpDex、FDex2 等脱壳工具
  • Java、Android 开发基础知识
  • Xposed 框架开发基础知识

逆向步骤

介绍一下本文逆向的步骤:
image.png

当然,用三步概括,看上去像“把大象塞进冰箱分为几步”。逆向作为一项与应用开发者对抗的网络安全技术,其手段花样多端,有时甚至不需要代码也可以完成逆向,所以这个概括仅对应文中的遇到情况。


相信点击进入这篇博客的小伙伴都知道并且搞过App逆向,不过有时候会遇到各种加壳的App,不让你反编译。但是道高一尺,魔高一丈,有正向加密,就有逆向解密。此篇博客博主带大家搭建脱壳环境,并且手动脱一个加了某60的壳的App

Android系统

脱壳需要用到的工具,对Android系统是有要求的:环境需要一个Android系统,需要root权限、版本不能高于Android8.0。这样的真机现在已经很难找到了,还是模拟器方便一些。建议使用虚拟机/模拟器,不然你还要获取root权限,容易搞坏真机。我这里用的是网易模拟器,Android系统的版本为6.0.1.
image.png
image.png

安装Xposed框架

需要root权限,虚拟机直接允许即可,真机要用第三方工具获取,网上有很多教程。

1、下载Xposed Installer

官网地址:https://repo.xposed.info/module/de.robv.android.xposed.installer
image.png

2、安装Xposed Installer

下载完毕后,直接拖入模拟器安装即可。然后打开这个App
image.png
image.png

由于我之前安装过,所以没提示要root权限,第一次安装的时候会提示授权的,授予即可。

安装反射大师

反射大师是一个支持一键脱壳的神器,貌似什么壳都能脱,不过后面更新的壳会不会添加检测机制就说不清了。。。

1、下载反射大师

下载地址:https://www.lanzous.com/i6x1kaf
https://www.duote.com/android/1048782.html

image.png

2、安装ReflectMaster并授权

直接拖入模拟器中进行安装,然后打开。会提示让你激活Xposed。
image.png
image.png
image.png
image.png

然后重启模拟器!

脱壳实战

1、安装待脱壳的软件

首先在模拟器中安装好待脱壳的软件,用MT管理器可以查看软件加的是什么壳。(反射大师不区分壳类型,是壳都可以脱。)
image.png

2、用反射大师打开待脱壳App

先把软件选中,然后打开待脱壳的App。
image.png
image.png
image.png

3、脱壳(核心步骤)

image.png
image.png
image.png
image.png
image.png
image.png

4、用jadx反编译

jadx工具可以将dex反编译成java代码。
image.png


脱壳后分析

安居客app脱壳文件
image.png

经过上一步的脱壳操作,我们获取到了多个dex文件,接下来这些dex文件我们可以直接一个一个拖入jadx进行分析,在jadx中可以直接看到其内部的java代码。但是这样对于我们而言太麻烦了,像上面安居客的例子,我们获得了 16个dex,假如我们一个一个拖进jadx中分析,将会耗费我们大量的精力,因此我们需要对这些dex文件进行二次加工,加工细分为以下两个方向:

1、将多个dex使用jadx合并为单个sources文件,然后使用IDE软件进行查看(java层代码静态分析)
2、将多个dex使用baksmali.jar转为smali代码,结合apktool得到项目文件,替换相关smali文件后可用于动态调试

Dex2Java

准备工作

1、jadx文件

jadx文件我们可以通过直接在github项目中下载,如图下载最新版本的jadx-x.x.x.zip,解压后的bin目录中即可看到
image.png
image.png

2、Dex2Java脚本

该脚本用于将多个dex合并为单个sources文件

自编写如下:

Dex2Java.py

import os, sys

if __name__ == "__main__":
    if len(sys.argv) < 2 :
        print("start error!start need 2 arguments!")
        sys.exit()

print(sys.argv[1])
path = os.path.split(__file__)[0] + '\\'
print(path)
files= os.listdir(path) 
for file in files: 
    if file.find(".dex") > 0: 
        sh = sys.argv[1] + ' -j 1 -r -d ' + path + " " + path + file
        print(sh)
        os.system(sh)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

ps:该python脚本执行时需要传入jadx文件的绝对路径

具体使用

1、我们使用反射大师获取了多个dex文件,我们将Dex2Java.py放入这些dex文件的同一个文件夹中
image.png

2、该目录下执行Dex2Java.py并传入jadx的绝对路径,我这里为C:\Users\admin\Desktop\jadx\bin\jadx

Dex2Java.py C:\Users\admin\Desktop\jadx\bin\jadx

image.png

3、执行完毕后,相同目录下将会得到一个sources文件夹,该文件夹能直接用IDE工具打开查看其java代码
image.png
image.png

Dex2Smali

准备工作

1、apktool
apktool用于将apk文件反编译为项目文件,下载地址:https://www.pcsoft.com.cn/soft/57847.html

2、baksmali.jar文件
basksmali.jar文件用于将dex文件转为smali代码,下载地址:https://bitbucket.org/JesusFreke/smali/downloads/

3、Dex2Smali脚本

该脚本用于将dex文件转为smali代码

自编写如下:

Dex2Smali.py

import os, sys

if __name__ == "__main__":
    if len(sys.argv) < 2 :
        print("start error!start need 2 arguments!")
        sys.exit()

path = os.path.split(__file__)[0] + '\\'
files= os.listdir(path) 
for file in files: 
    if file.find(".dex") > 0: 
        prefix = file.split('.')[0]
        print(prefix)
        sh = 'java -jar ' + sys.argv[1] + ' disassemble -o smali_' + ('' if 'classes'==prefix else prefix) + ' ' + file
        print(sh)
        os.system(sh)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

ps:该python脚本执行时需要传入baksmali.jar文件的绝对路径

具体使用

1、我们使用反射大师获取了多个dex文件,我们将Dex2Smali.py放入这些dex文件的同一个文件夹中
image.png

2、该目录下执行Dex2Smali.py并传入baksmali.jar的绝对路径,我这里为E:\mobileAppCrawler\dump\安居客dump\dump\baksmali.jar

Dex2Smali.py E:\mobileAppCrawler\dump\安居客dump\dump\baksmali.jar
image.png

3、执行完毕后得到多个classes文件
image.png

4、使用apktool反编译目标apk,得到apk同名项目文件夹
将apk拖入apktool脚本所在文件夹,cmd执行以下命令apktool -r d anjuke.apk -only-main-classes

image.png
image.png
image.png

总结与体会

脱壳只是第一步,后面还有修改、调试、回编译,工作量都很大,以上就是脱壳环境搭建与脱某60壳实战的主要内容。壳确实脱了,但是没有修复步骤,比如修改Apk中的xml、程序入口等操作。这主要是由于不同的壳,修复步骤不同。

分析代码这个步骤,完全是考验你的 Java 基本功 + 耐心,二者缺一不可。

不过不要退缩,我们只要遵循一些技巧,就可以大幅减少工作量。由于分析过程比较繁琐,这里就不结合具体代码了,只做一些理论总结:

1、从目标 API 开始入手,跟踪执行流程: 比如我们刚才已经搜索到关键词代码,那就从那一行开始,通过 IDEA 查看方法功能,可以一路向下点击。

2、只分析涉及代码块,缩小分析范围: 请求过程通常会构建 Request 对象,那参数加密一定就在构建对象之前,我们只要找到构建 Request 对象的代码,然后查看加密参数被传入之前都经过了怎样的处理,其他代码全部无视。

3、将部分代码块复制出来进行执行: 虽然反编译的项目代码无法被整体执行,但对于冗长难懂的方法代码,我们可以连同相关代码一起复制到一个新项目中,进行编译执行,方便我们调试。

4、尝试搜索一些关键词: 代码并不会所有都被混淆,可以尝试全局搜索一些关键词。比如 Java 常用的加密算法,我们可以搜索 RSA、AES、MD5、Encrypt、public_*key 这些关键词和正则匹配,能搜到再好不过了。

当你找到了加密方法,那么可以复制出来独立执行,然后自己构建参数传入加密,通过模拟请求,看接口是否正常返回。

需要注意,如果不能正常请求,并不一定是你找错了地方,也有可能代码本身有误,反编译的代码是有几率会出现这种情况的,导致你执行的和 APK 执行的结果不同。遇到这种情况,只能通过其他手段来修正代码,如阅读 Smali 代码、通过 Hook 等手段,这种情况比较复杂。

参考:https://blog.csdn.net/qq_41855420/article/details/106276824
https://blog.csdn.net/dannyxycheung9665/article/details/130254095
App 爬虫必备技能:三步完成 Android 逆向:https://zhuanlan.zhihu.com/p/80733843
http://www.newxtc.com/article.php?id=227

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/90634
推荐阅读
相关标签
  

闽ICP备14008679号