Android逆向基础入门

2023-05-16

目录

      • 一、基础App数据抓取
        • 1、App常用抓包工具
        • 2、fiddler抓包工具
        • 3、mitmdump抓包工具
        • 4、charles抓包工具
        • 5、uiautomatorviewer / appium自动化工具
        • 6、Airtest自动化工具
      • 二、js逆向与app逆向的区别
      • 三、Android_apk逆向
        • 1、app逆向名词
        • 2、jadx反编译工具
        • 3、JEB反编译工具
          • (1)JEB常用功能介绍
          • (2)JEB动态调试功能
        • 4、Frida之Hook工具
          • (1)真机下载frida-server文件
          • (2)夜神模拟器下载frida-server文件
          • (3)Hook Java层的逻辑
          • (4)Hook Native层的逻辑
        • 5、app的壳与脱壳
          • (1)app的壳特征
          • (2)一代壳frida_dump脱壳
          • (3)一代壳frida_dexdump脱壳
          • (4)二代壳FART脱壳
        • 6、IDAPro反汇编工具
          • (1)静态分析
          • (2)动态调试
      • 未完待学习完善修正中

一、基础App数据抓取

1、App常用抓包工具

  • 常用的拦截抓包工具有fiddler、mitmproxy、charles手机端需和电脑端在同一个网络下,且手机端要配置相应的证书,手机端还要设置手动代理):大部分app使用的数据通信协议基于http/https,可通过抓包查看来模拟url请求。
  • 对于安卓手机抓包建议使用charles,因SSL Pinning(证书锁定)无法对https协议的请求抓包,此时可尝试以下几种方式①使用android 7 以下的系统解除限制,②xposed + JustTrustMe,③ VirtualXposed + JustTrustMe ④ Frida + DroidSSLUnpinning ;只有抓到包我们才知道需要哪个参数
  • 常用的自动化工具有uiautomatorviewer、Appium、Airtest手机与电脑端通过usb数据线连接,同时手机需要打开usb调试功能进入开发者模式):就相当于web端的selenium

2、fiddler抓包工具

  • fiddler安装与使用,不用手动设置代理,打开软件就自动开启了代理

3、mitmdump抓包工具

  • mitmproxy安装与抓包分析, 需要手动设置浏览器局部代理不太方便但还行;强大功能在于mitmdump可以实时抓包,然后给python等处理
  • mitmdump实时抓包使用介绍:分析抓包逻辑编写好python处理脚本 > mitmdump -s py文件 -p 端口号 > 滑动app(设置代理)或者web(设置局部代理)

4、charles抓包工具

  • charles安装与抓包分析,Charles免费使用30分钟,然后需要重启再次使用,貌似设置了SSL Proxying证书,可以抓SSL Pining的包(低于7版本的安卓系统)

5、uiautomatorviewer / appium自动化工具

  • appium相关操作使用,与手机通过usb连接,需要确定要操作的相应的app包名起服务,没有airtest方便;可通过录制功能自动生成python代码
  • appium实战案例1
  • appium实战案例2

6、Airtest自动化工具

  • Airtest相关操作使用,与手机通过usb数据线连接,可以操作多个手机实现群控,可通过录制功能自动生成python代码,功能十分强大

二、js逆向与app逆向的区别

  • app逆向比js逆向繁琐很多,掌握的知识点也要更多,难度根本不在一个层次
  • js逆向:全部在web页,抓包只需chrome浏览器,js逆向分析也只需chrome浏览器,也就是整个分析过程在chrome上就可以完成,一些偶尔使用的辅助工具油猴,fiddler,ast,几乎就没了
  • app逆向:最好有一个手机,https的抓包可能会抓不到,有壳的还要脱壳,需要反编译或者反汇编才能看到java或者C的代码,有时候甚至要看汇编的,需要掌握的知识点根本不是一个量级
  • js逆向与app逆向的区别会进一步完善修改,以下可能会有些许错误
    在这里插入图片描述

三、Android_apk逆向

1、app逆向名词

  • .apk:每个android app都有对应的安装包,以.apk为后缀 ,.apk文件类似压缩包,将后缀名改成.zip可以进行解压,里面的.dex文件可以用反编译工具进行反编译获得源码;所以一般app都会加壳,将真正的源码隐藏起来
  • Java层:Java代码
  • Native层:C/C++代码,也称为so层,保存在.so文件下
  • 反编译工具:jadx、JEB、Apktool:因SSL Pinning导致无法正常抓包时,或则是抓包后要分析某个参数的生成逻辑时,需要反编译apk文件,还原成可读性高的java代码进一步分析
  • Hook工具:Xposed、Frida:可以通过hook拦截和改写逻辑,获取关键加密数据,hook或模拟Java层Native层(即so层由C/C++等实现)的代码;其中Xposed只能Hook Java层逻辑,且Xposed整个模块逻辑需要使用Java语言实现;因此Frida更强大、方便、灵活
  • 反汇编工具:IDA Pro工具:逆向分析、调试、模拟Native层(so层由C/C++`等实现)的代码实现逻辑
  • Java调C的接口:JNI(Java Native Interface):即Java的本地接口,是Java调用Native即C/C++编写的代码,C/C++编写的代码会被编译到.so后缀的文件里,还原so需要反汇编,增加了逆向难度
  • 混淆工具:OLLVM(Obfuscator-LLVM):在Native层实现混淆,即针对LLVM(编译器和工具链的集合,把C/C++转化成目标机器执行的代码)的代码混淆工具;
  • 当有如上OLLVM混淆时,要分析其内部调用逻辑,十分困难,一个方法是硬刚逆向so文件和通过动态调试进行分析;另一个方法就是利用RPC、unidbg等模拟执行so文件的逻辑
  • 模拟执行so层逻辑:Frida-RPC、AndServer-RPC、unidbg:模拟执行so文件的逻辑,不关心so文件的内部逻辑,直接调用so文件,传入对应的参数,得到执行结果;如果被风控检测到执行环境不正常,会拒绝返回数据或者是返回假数据

2、jadx反编译工具

  • jdk1.8_java环境安装(目录3)
    在这里插入图片描述

  • adb安装(目录2)

  • jadx工具:jadx-gui反编译图形界面工具,jadx下载 , 解压后运行exe文件,然后打开加载apk文件即可

  • 常用功能:文本搜索(导航),右击代码查找方法声明,右击代码查找用例,反混淆(工具),日志查看器(帮助),设置选项里面也有很多功能
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

3、JEB反编译工具

(1)JEB常用功能介绍
  • JEB反编译器使用详细介绍

  • JEB下载安装,windows运行.bat文件,然后加载apk文件,即可看到右侧Smali代码,通过编译也可以转到java代码看
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 常用功能1:ctr+f图一进行文本字符串搜索定位,并勾选环绕搜索,或者图二ctr+f搜索
    在这里插入图片描述

在这里插入图片描述

  • 常用功能2:右击代码编译可以转到java代码声明处,或者再次右击相应代码字符串会回到Smali代码用例
    在这里插入图片描述
    在这里插入图片描述
(2)JEB动态调试功能
  • 常用功能3:使用JEB动态调试功能验证,在猜测的代码位置添加断点,然后app滑动加载数据,然后看断点位置是否停止运行

  • ① 首先手机与电脑通过usb数据线连接 > 然后手机端要打开USB调试功能,进入开发者模式 > 然后将电脑端的.apk文件放到手机存储中>然后手机点击apk文件即可安装

  • ② 然后cmd运行如下命令(该命令让手机端的app以调试的模式启动) ,之后手机会显示wating for debugger, -D指定App以调试模式启动-n指定启动入口
    在这里插入图片描述

    adb shell am start -D -n com.goldze.mvvmhabit/.ui.MainActivity
    
  • ③ 然后JEB界面 `在目标代码行ctr+b下断点 > 点击Debug按钮 > 然后调试,滑动app,然后就会断在断点处,多出的右侧界面也可以看字段值变化
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • ④ 发现加密点,进入encrypt函数内部继续调试,亦可右击代码编译直接看java代码,然后逻辑找到要么python还原,要么写个java爬虫都可以
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

4、Frida之Hook工具

  • Hook工具Frida详细介绍,是一个基于Python和JavaScript的Hook与调试框架,可以Hook Java层或者Native层,通过python注入js脚本操作手机上的java代码
  • Frida安装:按如下命令进行安装
    pip install frida -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
    pip install frida-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/
    
    在这里插入图片描述
(1)真机下载frida-server文件
  • 准备一部已经root的手机

  • 手机下载frida-server文件,通过数据线usb与电脑连接,在cmd窗口输入以下命令查看cpu类型,如这里需要下载的包对应arm64 ,然后下载frida服务端frida-server(注意这里的版本和Frida的版本是一致的15.1.14)

    adb shell 
    getprop ro.product.cpu.abi
    

    在这里插入图片描述
    在这里插入图片描述

  • 将解压后的文件夹通过adb push将frida-server发送到android设备/data/local/tmp目录中,进入了adb shell操作窗口,并修改可执行权限

    ######## 1、将解压后的文件夹通过adb push将frida-server发送到android设备/data/local/tmp目录中
    adb push "D:\Package\frida-server-15.1.14-android-arm64" /data/local/tmp
    
    ######## 2、进入了adb shell操作窗口,修改可执行权限
    adb shell
    cd /data/local/tmp
    ls
    chmod 777 frida-server-15.1.14-android-arm64
    

    在这里插入图片描述

  • 手机运行frida服务 ./frida-server-15.1.14-android-arm64 &,起好服务后未报错,则保持当前cmd窗口不要关闭

    ######## 3、手机端后台运行frida服务
    su
    ./frida-server-15.1.14-android-arm64
    
  • 如上frida服务起好后,新开一个cmd窗口,执行如下命令

    ######## 4、在cmd新的窗口下执行如下命令
    adb forward tcp:27042 tcp:27042 
    adb forward tcp:27043 tcp:27043
    frida-ps -U
    

    在这里插入图片描述

(2)夜神模拟器下载frida-server文件
  • 准备下载夜神模拟器

  • 下载,自定义安装路径,直接下一步即可安装,可以将安装路径D:\Program Files\Nox\bin添加到环境变量;默认打开是平板模式,打开设置>性能设置>分辨率改为手机模版;
    在这里插入图片描述

  • 连接夜神模拟器设备:打开cmd命令行,进入夜神安装的bin目录,执行如下命令,出现黄色区域内容即连接成功:

    nox_adb.exe connect 127.0.0.1:62001
    adb devices
    

    在这里插入图片描述
    在这里插入图片描述

  • 模拟器下载frida-server文件,cmd输入以下命令查看cpu类型,如这里需要下载的包对应是x86 ,然后下载frida服务端frida-server(注意这里的版本和Frida的版本是一致的15.1.14)

    adb shell 
    getprop ro.product.cpu.abi
    

    在这里插入图片描述
    在这里插入图片描述

  • 将解压后的文件夹通过adb push将frida-server发送到android设备/data/local/tmp目录中,进入了adb shell操作窗口,并修改可执行权限

    ######## 1、将解压后的文件夹通过adb push将frida-server发送到android设备/data/local/tmp目录中
    adb push "D:\Package\frida-server-15.1.14-android-x86" /data/local/tmp
    
    ######## 2、进入了adb shell操作窗口,修改可执行权限
    adb shell
    cd /data/local/tmp
    ls
    chmod 777 frida-server-15.1.14-android-x86
    
  • 模拟器运行frida服务, ./frida-server-15.1.14-android-x86,起好服务后未报错,则保持当前cmd窗口不要关闭

    ######## 3、模拟器运行frida服务,并保持当前adb shell窗口一直开着,不能关,否则服务也关了
    ./frida-server-15.1.14-android-x86
    
  • 如上frida服务起好后,新开一个cmd窗口,执行如下命令,控制台输出如下图片内容,则证明已连接成功

    ######## 4、新开一个cmd窗口,执行如下命令
    adb forward tcp:27042 tcp:27042 
    adb forward tcp:27043 tcp:27043
    frida-ps -U
    

    在这里插入图片描述

(3)Hook Java层的逻辑
  • ① 以夜神模拟器为例子,打开已下载的app
    在这里插入图片描述

  • ② cmd窗口起frida服务,如图,然后编写hook逻辑的js文件以及相应的python文件

    adb shell
    su
    cd /data/local/tmp
    ./frida-server-15.1.14-android-x86
    

    在这里插入图片描述

  • ③ 了解编写hook java 的js代码逻辑, 以及python固定脚本,固定代码结构如下,需要填充的就三处:待连接的app进程名,待hook的文件类名,待hook的函数方法js逻辑代码
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    js_text = """
        Java.perform(function() {
            var MainActivity = Java.use('文件类名,可以直接右键复制文件类名');  
            // 待编写该类下面的函数的hook逻辑
        })
    """
    
    
    # python固定代码,其中js_text是待编写的hook逻辑
    def on_message(message, data):
        print(message)
    
    
    # 2、获取当前设备连接并调用设备的attach方法挂载对应的进程, 并往进程中注入Hook脚本
    process = frida.get_usb_device().attach('app进程名称,需通过frida-ps -U查看获得')
    script = process.create_script(js_text)
    # 3、监听message事件, 回调方法是on_message, js代码中任何通过send方法发送的数据,on_message方法都会接收到对应的内容
    script.on('message', on_message)
    script.load()
    sys.stdin.read()
    
  • ④ 按如上要写的代码结构编写python与js脚本,然后运行python脚本,然后再操作app相关步骤触发,进而hook到;
    在这里插入图片描述

  • 打印调用堆栈

    Java.perform(function(){
        // 打印调用堆栈
        function printStackTrace(){
    		console.log(Java.use("android.util.Log") .getStackTraceString(Java.use("java.lang.Exception") .$new()));
    	}
    })
    
(4)Hook Native层的逻辑
  • ① 下载相关.apk文件安装到模拟器或者手机,本案例以模拟器为例
  • ② cmd窗口起frida服务,如下,然后编写hook逻辑的js文件以及相应的python文件,并打开相应的app
    adb shell
    su
    cd /data/local/tmp
    ./frida-server-15.1.14-android-x86
    
  • ③ 编写hook native 的js代码逻辑, 以及python脚本,然后运行python脚本,然后再操作app相关步骤,进而hook到;与hook java层不同的地点在于js代码的编写,python部分完全一样且固定
    在这里插入图片描述

5、app的壳与脱壳

(1)app的壳特征
  • 如果一个.apk,可以直接通过jadx等直接反编译获得源码是比较危险的,所以为了保护源码,基本上apk都会加壳,目前有三代壳
  • 一代壳:对原有的dex文件整体加密生成一个新的壳dex文件;反编译后只能看到继承Application类的壳代码,android的四大组件被隐藏;壳的种类:诸如免费加固服务:360加固、腾讯加固、阿里加固、爱加密;查壳工具有:PKID;脱壳工具有:frida_dump、FRIDA-DEXDump等
  • 二代壳:将dex文件中的某些方法置空,只有在被调用时才会解密加载;反编译后Java代码的方法实现是空的, Smali代码有很多nop指令;脱壳工具有FART
  • 三代壳:有VMP壳和dex2C壳,将java层的方法Native化;反编译后方法被Native化了;没有成熟的脱壳工具
(2)一代壳frida_dump脱壳
  • 利用frida_dump脱壳: 下载frida_dump,并解压有如下文件,其原理是通过文件头的内容搜索dex文件并dump下来
    在这里插入图片描述

  • 起好frida服务,手机上安装好app,然后执行frida -U -f com.goldze.mvvmhabit -l dump_dex.js --no-pause

    # cmd窗口执行
    adb shell
    su
    cd /data/local/tmp
    ./frida-server-15.1.14-android-arm64
    # 然后另开一个cmd窗口
    frida -U -f com.goldze.mvvmhabit -l dump_dex.js --no-pause
    

    在这里插入图片描述

  • 脱壳完毕后结果在/data/data/com.goldze.mvvmhabit/files/dump_dex_com.goldze.mvvmhabit文件夹下,有8个dex文件,把它拉取到电脑上
    在这里插入图片描述

  • adb pull 可能会出现Permission denied错误,此时将该目录下的dex文件cp -r 路径 目标路径复制到/scard下:然后在adb pull 路径 目标路径拉取到电脑上 ,然后选择较大的dex文件用jadx反编译打开即可看到源码了
    在这里插入图片描述

    adb shell
    su
    cp -r /data/data/com.goldze.mvvmhabit/files/dump_dex_com.goldze.mvvmhabit /sdcard 
    # 新开一个cmd窗口直接执行
    adb pull /sdcard/dump_dex_com.goldze.mvvmhabit E:\AppPrj\app_apk\app7_tuoke
    

    在这里插入图片描述

(3)一代壳frida_dexdump脱壳
  • 利用frida_dexdump脱壳:frida-DEXDump,通过pip3 install frida-dexdump安装,其原理是根据一些暴力内存搜索的原理实现脱壳,对于完整的dex文件,搜索dex035找壳,或者匹配特征如DexHeader的长度信息、索引指向找壳
    在这里插入图片描述

  • 起好frida服务,手机上安装好app,然后执行frida-dexdump -U -f 包名

    # cmd窗口执行
    adb shell
    su
    cd /data/local/tmp
    ./frida-server-15.1.14-android-arm64
    # 然后另开一个cmd窗口
    frida-dexdump -U -f com.iCitySuzhou.suzhou001
    
  • 如图,加了壳的反编译目录
    在这里插入图片描述

  • 脱壳完毕后会在当前目录下生成文件夹存储dex文件,然后选择较大的dex文件,用jadx反编译即可看到相应的源码了尝试搜索搜索
    在这里插入图片描述
    在这里插入图片描述

  • 然后我们搜索,在classes02.dex文件里面找到了目标字符串,同时对代码进行了反混淆
    在这里插入图片描述
    在这里插入图片描述

(4)二代壳FART脱壳
  • 利用FART脱壳:FART

6、IDAPro反汇编工具

(1)静态分析
  • IDAPro下载安装查看
  • 查看手机是哪种处理器:adb shell getprop ro.product.cpu.abi,则选择对应文件夹下的.so文件
    在这里插入图片描述
    在这里插入图片描述
  • 右击选择对应的.so文件打开
    在这里插入图片描述
    在这里插入图片描述
  • 然后到了如下界面,左侧是so文件中的一些方法声明,右侧是对应的反汇编结果
    在这里插入图片描述
  • 然后将汇编代码还原成C/C++,如图操作即可
    在这里插入图片描述
    在这里插入图片描述
(2)动态调试
  • ida动态调试,需要起个服务android_server64,如图
    在这里插入图片描述

    adb push android_server64 /data/local/tmp
    adb shell
    su
    cd /data/local/tmp
    chmod 777 android_server64
    ./android_server64
    # 新开一个cmd窗口
    adb forward tcp:23946 tcp:23946
    

    在这里插入图片描述
    在这里插入图片描述

  • 然后打开ida,选择Go
    在这里插入图片描述

  • 然后在Debugger选项卡上选择如下选项
    在这里插入图片描述
    在这里插入图片描述

  • 然后选择对应app的包名,之后稍等片刻,ida pro会自动停下来
    在这里插入图片描述

  • 然后在右侧的Modules面板选择对应的.so文件,并双击进入
    在这里插入图片描述

  • 然后选择目标定义的方法,左侧会出现对应的汇编代码
    在这里插入图片描述

  • 然后下断点,运行,然后滑动手机,然后单步调试
    在这里插入图片描述

未完待学习完善修正中

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android逆向基础入门 的相关文章

随机推荐