• 100天精通Andriod逆向——第5天:app逆向流程简介


    一、app 界面控件的查看

    1.1 查看界面控件的作用

    主要作用:分辨 app 是哪种形式、语言、工具开发的、对于不同方式开发的 app 需要采取不同的方式进行 nx。
    原生方式开发的 app,使用 Java 和 C++ 开发,加密用的是 Java 和 C++
    H5 的 app,使用 Webview 控件加载网页,加密用的是 JS
    app 自动化测试,需要知道控件的 id,或者说需要定位到控件

    如何查看呢? 使用 uiautomatorviewer.bat 查看,在 Android SDK 根目录 tools\bin,如下图所示:
    在这里插入图片描述
    双击 uiautomatorviewer.bat 查看某 app 登录控件的 id,如下图所示:

    禁止截屏操作:

    activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
    activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_SECURE);
    
    • 1
    • 2

    二、app 分析的大致流程

    2.1 抓包分析是否有需要逆向的加密字段

    这里以某 app 登录为例,输入账号和密码,点击登录抓包,如下图所示:
    在这里插入图片描述
    观察发现此处是有密文的,所以需要我们逆向分析。

    2.2 查壳分析是否有加固

    使用软件查看即可,将要判断是否有加固的 app 拖入到软件中,如下图所示:
    在这里插入图片描述

    2.3 查看界面元素

    通过查看界面元素,看是否是原生开发的 app,因为不同形式 app 分析方法不一样,在小节 一、app 界面控件的查看 中已经演示过,这里就不再赘述

    2.4 关键代码定位

    2.4.1 传统定位方法

    1. 通过控件绑定的事件代码,来一步步定位 关键:控件 id、setOnClickListener 等
    2. 人肉手工搜索字符串,如 api 接口、加密的参数名(当有多个可疑参数时,需要断点调试、动态调试、 Hook等)
    3. 搜索同一个数据包中,没有加密的参数名,如登录时,需要账号和密码,密码加密,账号没有,此时可尝试搜索账号变量名

    局限性: app 可能被反编译 搜不到关键字,如: HTML5 的 APP、字符串被混淆加密(dex 的字符串加密可以用代码自动实现,需要使用到 dexlib2 这个库)、反射调用的相关类、app 被加固了、动态加载的 dex、热修复

    由此可见,常规手段有着太多的局限性,hook 系统函数来定位关键代码才是最通用的。

    2.4.2 关键代码快速定位

    1. 跑一下自吐算法插件
    2. Hook 常用系统函数,如果 app 有调用就打印函数栈
    3. 在自制的沙盒中运行,打印 app 运行过程中的指令、函数调用关系等

    注意:逆向分析不是说非要一步到位,我们需要边分析、边调试、观察怀疑、不断推翻尝试、不断找新关键函数的过程,要慢慢来,铁杵磨成针。

    2.4.2.1 Hook 可以用来做什么

    1. 可以用来判断 app 执行某个操作的时候,是否经过我们所怀疑的这个函数
    2. 可以用来修改被 hook 函数的运行逻辑
    3. 可以用来在运行过程中,获取被 hook 的函数传入的具体的参数和返回值
    4. 可以用来主动调用 app 中的某些函数

    2.4.2.2 HooK 之 FridaHook 环境搭建

    2.4.2.2.1 Python3.8 64 位的下载和安装

    简单我就不赘述了,下载地址:https://www.python.org/downloads/
    注意:3.8 64位的任意一个版本都行,不用管最后的小版本。

    2.4.2.2.2 frida 的安装

    注意版本匹配:

    frida12.3.6 Android5-6 Python3.7
    frida12.8.0 Android7-8 Python3.8
    frida14+ Android9+ Python3.8
    frida15+ Android12 也可以用,待测....
    
    • 1
    • 2
    • 3
    • 4

    我这里是 Android10,Python3.8,安装命令如下:

    pip install frida==14.2.18
    pip install frida-tools==9.2.5(装frida-tools时会自动安装frida)
    
    • 1
    • 2

    网络不好可能会卡住,安装离线 whl 包,离线安装包百度网盘下载地址:

    链接:https://pan.baidu.com/s/1BIOkna2j5ykixqMu2r-53w 
    提取码:lvks 
    --来自百度网盘超级会员V8的分享
    
    • 1
    • 2
    • 3

    命令:

    pip install frida_tools-9.2.5-py3-none-any.whl
    pip install frida-14.2.18-cp38-cp38-win_amd64.whl
    
    • 1
    • 2

    注意: 先安装指定版本 frida、再安装指定版本frida-tools,安装的 frida 版本要与 frida-tools 版本对应,如何查看呢?点击链接:frida-tools版本的查看frida-tools版本的查看

    判断 frida 是否安装成功:

    1. cmd 中执行 frida --version,能打印出版本号说明 frida-tools没有问题
    2. cmd 中执行 python,进入控制台 import frida,能导包成功,说明 frida 库没有问题,如下图所示:
      在这里插入图片描述

    卸载命令:

    pip uninstall frida==14.2.18
    pip uninstall frida-tools==9.2.5
    
    • 1
    • 2
    2.4.2.2.3 pycharm_nodejs_Frida 代码提示配置

    node.js 安装以及 pycharm 中使用 node.js 运行 js 代码参考文章:https://blog.csdn.net/xw1680/article/details/126070030

    配置完成之后,进入你的项目目录,执行命令:npm i @types/frida-gum(不要全局安装、我全局安装不生效),如下图所示:
    在这里插入图片描述
    执行完毕之后,在 IDE 中写 frida hook 相关代码就会有相关提示了,如下图所示:
    在这里插入图片描述

    2.4.2.2.4 frida-server的配置

    指定版本 frida-server 的获取:https://github.com/frida/frida/releases/tag/14.2.18(换成你自己的版本号)
    frida-server(调试) 的运行平台要选对,frida-server 的版本与 frida 的版本要匹配,如下图所示:
    在这里插入图片描述
    通过usb连接真机不需要转发端口,通过ip连接需要转发,连接模拟器也需要转发,命令如下:

    adb forward tcp:27042 tcp:27042
    
    • 1

    将下载好的 frida-server 包先解压,然后推送到手机,如下图所示:
    在这里插入图片描述
    在这里插入图片描述执行完成之后,会有一个光标在闪动,就说明成功了,上述命令如下:

    C:\Users\AmoXiang>adb push 你frida-server包的位置 /data/local/tmp/fsarm64
    C:\Users\AmoXiang\Desktop\frida-server-14.2.18-a... 0 skipped. 32.9 MB/s (41387312 bytes in 1.201s)
    
    C:\Users\AmoXiang>adb shell
    sailfish:/ $ su
    sailfish:/ # cd /data/lo
    local/        lost+found/
    sailfish:/ # cd /data/local/tmp/
    sailfish:/data/local/tmp # ls
    dalvik-cache fsarm64 uidump.xml
    sailfish:/data/local/tmp # chmod 777 fsarm64
    sailfish:/data/local/tmp # ./fsarm64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    Pycharm 中写 js 代码进行测试,发现是 ok 的,如下图所示:

    2.5 算法复现

    通过观察找到一些疑似关键函数,通过 frida hook 来确认 app 执行某个操作的时候,是否调用了它们
    如果没有触发这些方法,考虑以下问题:

    1. app 在执行这个操作的时候,真的没有调用这个函数,换一个其他的关键函数
    2. 代码写错了,导致 hook 函数没执行
    3. 一般可以通过主动调用上层函数,来触发这些 hook 函数

    如果触发了这些函数,可以通过 hook 来打印执行过程中传入函数的参数和返回值
    frida -U -F -I HookDemo.js:-U 代表远程USB设备、-F 代表附加到最前的这个app、-I 后面指明需要加载的JS脚本(写好的js脚本要注入手机端,并不是在 Node.js 中使用,所以只能用 v8 和 fridaAPI 支持的)

    最后,利用以上得到的信息,来进行算法复现。

    2.6 协议复现

    当需要构造的参数准备完成之后,我们就可以编写脚本去模拟请求,获取相应的数据了。

  • 相关阅读:
    1数据结构的分类,算法效率的度量
    Kotlin filterIsInstance filterNotNull forEach
    数据结构与算法之二分查找
    企业数据的存储形式与方案选择
    PHP些个代码把数据库存储的点播视频和阿里云OSS文件批量下载到本机
    第1部分 实验拓扑、终端服务器
    【一月一本技术书】-【Go语言设计与实现】- 9月
    Mybatis系列之 parameterMap 弃用了
    javase__进阶 day18 多线程02
    Spring 项目的创建和 “使用“
  • 原文地址:https://blog.csdn.net/xw1680/article/details/126276363