Android 逆向之脱壳实战篇

news2024/9/20 18:54:20

作者:37手游安卓团队

前言

  • 这篇文章比较干,比较偏实战,看之前建议先喝足水,慎入。

  • 在学脱壳之前,我们先来复习一下,什么时候是加固?

    • 加固本质上就是对 dex 文件进行加壳处理,让一些反编译工具反编译到的是 dex 壳,而不是 dex 文件本身。具体的实现方式是,将原 dex 文件进行加密,再合成到 dex 壳中,而系统运行应用的时候,会加载 dex 壳文件,而 dex 壳里面有一个自定义的 ClassLoader 类,它会将原有 dex 文件进行解密,然后再加载到 dex 数组中。
  • 学完了加固,那么什么是脱壳呢?

    • 刚刚讲到了加固的原理,它本质的原理就是加壳,而脱壳就对应着加壳,我们要对这层壳脱掉,漏出它原本的样子,再简单点讲就是破解加固,市面上比较常见的脱壳手段就是《内存 dump》,刚刚我们讲到的,系统会加载壳 dex,壳 dex 才会加载原 dex,那这个时候原 dex 已经被加载到内存中了,我们只需要从内存中把它 dump 出来就可以了,这个原理是不是灰常简单呢?
  • 以下使用 360 加壳过的 apk,拖到 jadx 打开是这样子的,这个就是壳的源码。

了解 frida

  • 说到脱壳,我们先认识一个东西:frida,它能够帮我们从内存 dump 出原 dex 文件,why?什么是 frida,这个问题就由 ChatGPT 替我解答这个问题

  • 简单理解 frida 就是一个跨平台的 hook 框架,那什么是 hook 框架呢?顾名思义,hook 是钩子的意思,在代码中,代表用钩子勾住代码,那么勾住代码有什么用呢?在实际开发中,我们常常在需要代码前后插入一段代码,比较常见的情况是计算方法的耗时,那么这个时候在方法前后各插入代码,常规的写法是直接在某个类的某个方法中写代码,这种做法的好处是代码看起来比较直观,但是一旦需要写的地方比较多的时候,前期开发和后续维护的工作量会呈几何增长,而 hook 框架可以解决这一问题,它可以帮你动态植入这些代码,不需要在每个方法写一遍重复代码,使用了面向切面的思想,类似 AOP,但它又不是 AOP,AOP 和它的区别在于,AOP 是在编译的过程中就会帮你植入代码,而 hook 框架是在运行的过程中植入代码。

  • 这里为了照顾小白朋友,所以说得有点啰嗦了,但是我的文章风格就是这样,高大上不是我的追求,我的追求是每一个看过文章的朋友都能看懂,降低大家的学习成本,如果不能的话,还不如直接看官方文档。

电脑 frida 环境搭建

  • 我们这里用的是 macOs 系统进行演示,windows 步骤也差不多

  • 第一步:输入以下命令安装 frida

pip install frida
  • 如果安装成功则会提示
Installing collected packages: frida
Successfully installed frida-16.0.2
  • 第二步:再输入下面命令安装 frida-tools
pip install frida-tools
  • 如果安装成功则会提示
Successfully installed colorama-0.4.6 frida-tools-12.0.1 prompt-toolkit-3.0.32 pygments-2.13.0 wcwidth-0.2.5
  • 如果安装过程出现警告,提示以下信息的话
WARNING: The script pygmentize is installed in '/Users/xxx/Library/Python/3.8/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
WARNING: The scripts frida, frida-apk, frida-compile, frida-create, frida-discover, frida-join, frida-kill, frida-ls, frida-ls-devices, frida-ps, frida-pull, frida-push, frida-rm and frida-trace are installed in '/Users/xxx/Library/Python/3.8/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  • 在环境变量中加入以下配置即可
export PATH="/Users/xxx/Library/Python/3.8/bin":"$PATH"
  • 第三步:然后测试 frida 是否安装成功,在命令行中输入(下面两个命令行任选一个即可)
frida --v

frida --version
  • 如果有输出 frida 的版本号的话,则证明已经安装成功了
16.0.2
  • 补充:如果需要安装 frida 指定版本,则需要修改安装命令行为下面这样即可
pip install frida==12.8.0
pip install frida-tools==5.3.0
  • frida 和 frida-tools 版本之间的对应关系可以从 Github 发布的 relese assets看到

Frida 手机环境搭建

  • 前提条件:需要准备一台已经 root 的手机

  • 第一步:输入 adb 命令来获取手机 CPU 处理器架构

adb shell getprop ro.product.cpu.abi

arm64-v8a
  • 第二步:到 Github 发布的 releases assets中下载对应 CPU 处理架构的 frida-server,然后进行解压,这里下载的是 frida-server-16.0.2-android-arm64.xz,注意 frida-server 需要和之前电脑安装版本一致才可以

  • 第三步:将下载好的 so 库通过 adb 命令复制到手机 /data/local/tmp 目录上面

adb push /Users/xxx/Downloads/frida-server-16.0.2-android-arm64 /data/local/tmp
  • 如果想修改复制到的 frida-server 文件名称,则将上面的命令行换成下面的即可
adb push /Users/xxx/Downloads/frida-server-16.0.2-android-arm64 /data/local/tmp/frida-server-16.0.2` 
  • 第四步:使用 adb 切换到 /data/local/tmp 目录下

su
cd data/local/tmp
  • 第五步:给刚刚复制到手机上面的 frida-server 加执行权限(默认只有读写权限)
// 表示可读可写可执行
chmod 777 frida-server-16.0.2

运行 Frida

  • 第一步:先使用 adb 切换到 /data/local/tmp 目录下
adb shell

su

cd data/local/tmp
  • 第二步:在上面命令行的基础上输入运行手机上面的 frida-server 的命令,执行后会阻塞当前命令窗口,这个是正常的,如果是阻塞了一会儿就重启,证明是不正常的,可以换个手机试一下
./frida-server-16.0.2
  • 第三步:验证是否成功, 重新创建一个命令行窗口,输入以下命令来查看当前手机进程列表
frida-ps -U
  • 如果出现以下错误提示,则需要将手机数据线拔下来重新插一次,然后重新运行一遍上面的命令即可
Failed to enumerate processes: unable to handle 64-bit processes due to build configuration
  • 如果出现以下错误提示,证明端口被占用了,可以重启一下手机
Unable to start: Could not listen on address 127.0.0.1, port 27042: Error binding to address 127.0.0.1:27042: Address already in use
  • 如果出现以下信息,则表示 Frida 已经安装成功
  PID  Name
-----  -----------------------------
 3374   Google
12041   Magisk
10795   QQ
12776   企业微信
 3720   当前界面
 8697   微信
 9401   相册
............
  • 第四步:最后再进行端口映射
adb forward tcp:27042 tcp:27042

使用 Frida-Apk-Unpack 进行脱壳

  • 第一步:下载或者克隆 Frida-Apk-Unpack 工程
cd /Users/xxx/Desktop/FridaProject/App\ 脱壳/Frida-Apk-Unpack
  • 第二步:执行脱壳指令
// xxx.xxx.xxx 是应用的包名
// dexDump.js 是工程目录下的文件
frida -U -f xxx.xxx.xxx -l dexDump.js  --no-pause
  • 如果失败了,并提示以下信息
usage: frida [options] target
frida: error: unrecognized arguments: --no-pause
  • 则换成下面这个命名再执行
`frida -U -f xxx.xxx.xxx -l dexDump.js
  • 如果失败了,并提示以下信息
frida -U -f xxx.xxx.xxx -l dexDump.js
  • 解决这个问题也很简单,只需要关闭 MagiskHide 功能
Magisk 管理器 -> 设置 -> Magisk 选项 -> MagiskHide(关闭即可)
  • 又或者执行以下命令行来关闭
adb shell "su -c magiskhide disable"
  • 完事之后可以执行以下命令行来开启
adb shell "su -c magiskhide enable"

最终效果展示

[PH 1::xxx.xxx.xx ]-> [16:54:09:927] magic : dex
035
[16:54:09:927] dex_size :1107632
[16:54:09:933] dump dex success, saved path: /data/data/xxx.xxx.xxx/1107632.dex

[16:54:10:167] magic : dex
035
[16:54:10:167] dex_size :3568668
[16:54:10:177] dump dex success, saved path: /data/data/xxx.xxx.xxx/3568668.dex

[16:54:10:181] magic : dex
035
[16:54:10:181] dex_size :284
[16:54:10:181] dump dex success, saved path: /data/data/xxx.xxx.xxx/284.dex

[16:54:10:278] magic : dex
035
[16:54:10:278] dex_size :284
[16:54:10:278] dump dex success, saved path: /data/data/xxx.xxx.xxx/284.dex
  • 其中 /data/data/xxx.xxx.xxx/1107632.dex/data/data/xxx.xxx.xxx/3568668.dex/data/data/xxx.xxx.xxx/284.dex 这几个就是脱壳之后得到真实的 dex 文件存放路径了,我们再使用 jadx 随机打开一个 dex 看看

  • 是不是灰常简单呢?

最后

像Smali指令、加壳和脱壳、Xposed框架、Frida、抓包、加密与解密算法等等,这些都是Android逆向安全开发工程师必须掌握的知识点。

至于学习笔记也是有的,我根据上述中所提到的知识点进行整理了,这样大家学习起来也比较方便,大家可以综合起来一起学习。参考方式:https://qr18.cn/CQ5TcL

Android 逆向安全学习笔记

Android 逆向模拟器环境搭建(详解)
Smali指令详解

加壳和脱壳入门

NDK与逆向

Xposed框架

Frida-逆向开发的屠龙刀

安卓逆向之常用加密算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/660102.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信号三大阶段之储存信号

目录 一、 信号三大阶段 二、信号储存相关概念 三、 理解概念 四、信号储存原理 五、信号集操作函数 一、 信号三大阶段 二、信号储存相关概念 实际执行信号的过程被称为信号递达(Delivery)。信号从产生到递达之间的状态被称为信号未决(…

【Linux】初步认识Linux系统

Linux 操作系统 主要作用是管理好硬件设备,并为用户和应用程序提供一个简单的接口,以便于使用。 作为中间人,连接硬件和软件 常见操作系统 桌面操作系统 WindowsmacOsLinux 服务器操作系统 LinuxWindows Server 嵌入式操作系统 Linux …

从零搭建一台基于ROS的自动驾驶车-----1.整体介绍

系列文章目录 北科天绘 16线3维激光雷达开发教程 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图 Nvidia Jetson Nano学习笔记–串口通信 Nvidia Jetson Nano学习笔记–使用C语言实现GPIO 输入输出 Autolabor ROS机器人教程 文章目录 系列文章目录前言一、小车底盘二、激…

Redis入门(三)

第5章 Redis的相关配置(redis.conf) 1)计量单位说明,大小写不敏感 # 1k > 1000 bytes # 1kb > 1024 bytes # 1m > 1000000 bytes # 1mb > 1024*1024 bytes # 1g > 1000000000 bytes # 1gb > 1024*1024*1024 bytes # # units are case insensiti…

如何安装Apache服务

目录 什么是Apache 第一步 关闭防火墙和安全机制 第二步 系​统​上​定​义 SELinux 最​高​级​别 第三步 导入对应的依赖包并解包 第四步 安装依赖环境 第五步 移动相关文件 第六步 编译安装 第七步 编译 第八步 备份配置文件 第九步 优化执行路径 第十步 添加…

S32K324芯片学习笔记-实时控制系统-eMIOS

文章目录 Enhanced Modular IO Subsystem (eMIOS)eMISO配置通道类型通道配置BCTU Interface 简介功能框图Unified channels (UC)Buffered modesUC control and datapath diagramUC modesGPIO模式SAIC (Single Action Input Capture)模式Single Action Output Capture (SAOC) mo…

AI自动写代码:GitHub copilot插件在Idea的安装和使用教程

GitHub Copilot 是微软与OpenAI共同推出的一款AI编程工具,基于GitHub及其他网站的源代码,根据上文提示为程序员自动编写下文代码,可以极大地提高编写代码的效率。 先看看ChatGpt是怎么回答Copilot的功能特点: 给大家简单提取一…

【go】新手go module 踩坑入门rc_server

go1.3 后废弃了GOPATH 但是gomodule 要自己设置 :go env -w GO111MODULE=auto Microsoft Windows [版本 10.0.22621.1848] © Microsoft Corporation。保留所有权利。 C:\Users\zhangbin>adb connect 127.0.0.1:7555 connected to 127.0.0.1:7555 C:\Users\zhangbin&…

【计算机通识】未来的计算机

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、未来的计算机 2.1、光子计算机 2.2、生物计算机 2.3、量子计算机 3、总结 1、缘起 自然界中的一切事物都是处…

3d重建+神经渲染

3d重建 基于深度相机(结构光、TOF、双目摄像头)的三维重建基于图像的三维重建:深度学习基于视觉几何的传统三维重建:这种三维重建方法研究时间比较久远,技术相对成熟。主要通过多视角图像对采集数据的相机位置进行估计,再通过图像…

经典同步问题之哲学家就餐

文章目录 一:问题描述方案一:方案二:方案三: 一:问题描述 五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替的进行思考和进餐。…

2023年测试岗前景?为什么要做自动化测试?8年测试总结...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 自动化测试是把以…

Web网页制作期末复习(2)——常用文本标签、列表标签、表格标签、Form表单、块元素与行内元素(内联元素)

目录 常用文本标签 列表标签 有序列表 无序列表 定义列表 表格标签 表格组成与特点 表格标签 表格属性 ​​​合并表格单元格 Form表单 属性说明 表单元素 文本框 密码框 提交按钮 块元素与行内元素(内联元素) 内联元素和块级元素…

3、DuiLib了解xml的使用和布局

文章目录 1、了解 XML 使用和布局2、VerticalLayout和HorizontalLayout3、TabLayout4、TileLayout5、Container6、ChildLayout 1、了解 XML 使用和布局 本节主要介绍 DuiLib 中 XML 关键字的使用和一些特性,通过构建一个简单的带标题栏和简单结构的窗口&#xff0c…

模型分享---登陆注册界面

目录 模型---登陆注册界面 验证码的生成: CheckCodeUtil.java: Servlet: 普通用户登陆: css: jsp: 运行结果: 管理员登陆: 运行结果: 注册: 普通用户: css: jsp: 运行…

FreeRTOS实时操作系统(三)任务挂起与恢复

系列文章目录 FreeRTOS实时操作系统(一)RTOS的基本概念 FreeRTOS实时操作系统(二)任务创建与任务删除(HAL库) 文章目录 系列文章目录前言任务挂起与恢复普通挂起恢复实例中断恢复实例 前言 继续跟着正点…

记录--封装一个通过js调用的全局vue组件

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在使用vue项目编写的时候,不可避免的会碰到需要时js api来调用组件进行显示的情况 例如饿了么element ui 的 Notification 通知、Message 消息提示等组件 虽然已经提供了,…

postman和jmete接口测试的用法与区别

目录 前言 接口测试的目的 接口测试怎么测: 1.创建接口用例集(没区别) 2.步骤的实现(有区别) 3数据用例的实现 4断言的实现 5执行 6其他 总结: 前言 前阶段做了一个小调查,发现软件测…

DETR 系列有了新发现?DETRs with Hybrid Matching 论文阅读笔记

DETR 系列有了新发现?DETRs with Hybrid Matching 论文阅读笔记 一、Abstract二、引言三、相关工作目标检测中的 DETR其它视觉任务中的 DETR标签赋值 四、方法4.1 基础知识通用的 DETR 框架通用的可变形 Deformable-DETR 框架 4.2 混合匹配4.2.1 混合分支计划一对一…

client-go的Indexer三部曲之三:源码阅读

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 《client-go的Indexer三部曲》全部链接 基本功能性能测试源码阅读 本篇概览 本文是《client-go的Indexer三部曲》系列的终篇,主要任务是阅读和…