Search

Search IconIcon to open search

正己 - 安卓逆向这档事

Last updated Jun 15, 2023

# 一、模拟器环境安装

src 《安卓逆向这档事》一、模拟器环境搭建

# 三个文件

  • 雷电模拟器9
  • Magisk
  • LSPosed 本地文件在d/52

# 安装雷电模拟器

在雷电多开器里新建一个并启动, 小磁盘模式可开

# 模拟器的准备

  • 给模拟器root, 重启 ->模拟器软件设置-其他设置
  • 打开共享文件夹, 把网盘里的 LSPosed 压缩包放进去 ->模拟器右侧更多-共享文件夹
  • 如果是最新版本雷电, 要打开磁盘写入 ->模拟器软件设置-性能设置

# 安装 Magisk Delta

  • 把文件拖进模拟器界面, 安装完打开
  • 永久允许root
  • 安装-请求访问存储-允许, 然后什么都不要做, 后台关掉软件
  • 重新打开-安装
  • 下一步-安装到磁盘(这个是模拟器的特殊选项)
  • 显示 all done 就算安装成功, 重启模拟器

# 设置 Magisk

设置里打开 Zygisk

# 安装 LS Posed 模块

这是一个 hook 框架, 后面会讲

  • Magisk-模块-从本地安装, 找到共享文件夹的压缩包
  • 重启模拟器, 在 Magisk 模块里看到 Zygisk-LSPosed 就是成功了

# 二、初识APK, 双开, APK汉化, Android Manifest

src 二、初识APK文件结构、双开、汉化、基础修改 video https://www.bilibili.com/video/BV18G411j7gV/?spm_id_from=333.788&vd_source=92451653bea4ed324c9bfc0287256aa5

# 使用的工具

  • MT管理器
  • NP管理器
  • 开发者助手 MT要会员的可以用NP, 两者都是反编译工具

# APK文件结构

00:56

7zip可以查看apk 文件说明

文件 注释
assets目录 存放APK的静态资源文件,比如视频,音频,图片等
lib 目录 armeabi-v7a基本通用所有android设备,arm64-v8a只适用于64位的android设备,x86常见用于android模拟器,其目录下的.so文件是c或c++编译的动态链接库文件
META-INF目录 保存应用的签名信息,签名信息可以验证APK文件的完整性,相当于APK的身份证(验证文件是否又被修改)
res目录 res目录存放资源文件,包括图片,字符串等等,APK的脸蛋由他的layout文件设计
AndroidMainfest.xml文件 APK的应用清单信息,它描述了应用的名字,版本,权限,引用的库文件等等信息
classes.dex文件 classes.dex是java源码编译后生成的java字节码文件,APK运行的主要逻辑
resources.arsc文件 resources.arsc是编译后的二进制资源文件,它是一个映射表,映射着资源和id,通过R文件中的id就可以找到对应的资源

# 双开及原理

05:11 双开就是让手机系统认为是两个不同的程序, 生成两个数据存储路径

NP双开 09:29

1 提取安装包(MT左菜单栏) 2 选中 apk, 功能, apk 共存

修改包名会修改签名, 如果原软件做了签名校验, 就会导致闪退

还有其他方法如

  • 修改 framework
  • 虚拟化技术
  • 以插件机制运行

# 汉化

11:09

Pasted image 20221011230219.png 还有更偏的.so汉化

# 第一关

13:49

  • 选中 apk 查看
  • 运用MT右上角的高级搜索替换已知文字, 直接反编译修改
    • MT搜 NP改
  • 开发者助手复制不会输入的文字
  • arsc翻译模式 default, 一键翻译要vip装插件(视频里用的Yandex)
  • dex编辑器++里可搜索

如果提示签名不一致, 卸载就行, 后面会讲别的方法

MT提供签名信息, 也就是说 MT改1.apk 和 MT改2.apk 的签名是一样的, 不需要重新装

# Android Manifest

23:29 应用的信息描述文件

属性 定义
versionCode 版本号,主要用来更新,例如:12
versionName 版本名,给用户看的,例如:1.2
uses-permission android:name="" 应用权限,例如:android.permission.INTERNET 代表网络权限
android:label="@string/app_name" 应用名称
android:icon="@mipmap/ic_launcher" 应用图标路径
android:debuggable=“true” 应用是否开启debug权限

bilibili 有一个 so 层的签名校验

# 修改 demo 名字和图标

  • 28:22
  • NP
  • 包-功能-通用编辑

# 三、初识 smali

课件帖 视频

# 使用的工具

  • jadx-gui
  • MT管理器
  • 开发者助手
  • 核心破解
  • 模拟器

# JVM, Dalvik 和 Art

JVM, Dalvik, Art

# jadx-gui

反编译工具, 加载 apk 文件. 但不能改, 改还是要在 MT.

MT 反编译成 java 要会员, 所以用 jadx 来看.

# 核心破解 app

安装时会提示未激活, 点击(在LSPosed里)激活模块并勾选系统框架

# Smali 语法

Smali

smali 是 Dalvik 的寄存器语言, 由 .dex 反编译而来

# 简单破解方法

  1. 定位
    • 搜索关键字
    • 抓取按钮id(开发者工具)
    • 反编译可能把字符串转成 unicode, 那么就搜索对应的 unicode
    • 记住方法名, 方法名前后会有一点混淆, 如 m457onCreate$lambda2 在 smali 里是 onCreate$lambda-2, 在 java 代码里其实也能找到反混淆前的名字
  2. 用 MT 修改 dex
    • 修改寄存器的值
    • 强制跳转
    • 修改判断
# 第二关

很简单啦 在 AK 反编译失败无法查看 Java 源码的情况下, 可以使用 jadx-gui 有时候还会编译失败, 那就用 MT管理器改

控制流混淆

# 四、广告弹窗

# 前言

# 工具

  • 算法助手
  • 开发助手

# 广告类型

  • 启动广告
  • 弹窗广告/更新广告
  • 横幅广告

# 安卓四大组件

Activity 界面
Service 后台操作
Broadcast Receiver 广播信息
Content Provider 与APP之间共享数据的唯一途径, 调用系统 API

# 启动广告

# 流程

启动Activity -> 广告 Activity -> 主页Activity

# 修改

  1. 修改广告时间
  2. Activity 切换定位法, 修改 Intent 的 Activity类名(跳过Activity)

# Activity 切换定位法

3:37

  1. MT 侧边菜单 - Activity 记录, 启动服务
  2. 会出现一个小浮窗, 在APP运行时记录下 Activity名称
  3. 复制广告活动名, 用 NP 在dex里搜索, 可以转为 Java 看, 在 smali 里改

# XML 改类名

XML里看到的第一个 activity 对象通常就是启动界面

在xml改类名需要用 MT, NP有bug

这种方法比较容易使应用崩溃

# 改代码法

搜索定位到的 Activity 名, 找哪里被调用的

直接修改 Intent 的参数

# Activity 生命周期

这些方法都是回调方法, 不可调用, 只能重写

名称 描述 用途
onCreate() Activity 启动后第一个被调用的函数 初始化操作, 如创建View, 绑定数据, 注册监听, 加载参数
onStart() Activity 在前台时调用, 此时不能交互
onResume() 在 onStart() 之后调用, 即准备好交互时. 此时该 Activity 一定位于 Activity 栈顶, 处于运行状态
onPause() 在系统准备去启动或恢复另一个 Activity 时调用, 通常在这个方法中执行一些释放资源的方法, 以及保存一些关键数据
onStop() 在 Activity 完全不可见的时候调用, 此时为 stop 状态
onDestroy() 在销毁之前调用, 之后 Activity 的状态为销毁状态
onRestart() 从 stop 状态恢复到 start 时调用

# 更新弹窗

方法

  1. 修改 xml 的 versioncode
  2. Hook 弹窗
  3. dex 改弹窗代码
  4. 抓包修改响应体

# 修改 versioncode

xml

# Hook 弹窗

  • 算法助手
  • 在系统返回键被劫持时可用

算法助手安装后启动模块, 并勾选实验对象app(系统不用). 然后在算法助手应用里打开总开关和弹窗定位(也可以直接开屏蔽关键词弹窗)

# 修改 dex

在算法助手里查看日志, 用时间找到弹窗, 分析堆栈就可以看到弹窗是由哪个方法调用的

# 横幅广告

  • 开发助手(布局查看功能)

开发助手放大镜功能, 定位到 View id, 用 MT xml 搜索(去掉0x)

改法1: 高度或宽度改为0dp

改法2: 隐藏布局

1
android:visibility="gone"

# 五、动态调试和插桩

# 工具

  • jeb: 静态分析和动态调试的反编译工具
  • XappDebug: 动态调试

# 动态调试

# 修改 debug 权限

# 方法一: Manifest.xml 修改

用 MT, application 添加

1
android:debuggable="true" 
# 方法二: XappDebug

XappDebug模块hook对应的app

安装 apk, 在 LSPosed 里激活

# 方法三: Magisk 命令(重启失效)
1
2
3
4
5
6
7
1.  adb shell #adb进入命令行模式

2.  su #切换至超级用户

3.  magisk resetprop ro.debuggable 1

4.  stop;start; #一定要通过该方式重启
# 方法四: 刷入MagiskHide Props Config模块(永久有效, 但有的手机不支持)

Android修改ro.debuggable 的四种方法_Amarao的博客-CSDN博客

# 端口转发以及开启adb权限

开启 usb 调试

jeb 在代码窗点右键-分析即转为 Java 代码

夜神模拟器:adb connect 127.0.0.1:62001

# 下断点

smali 下 ctrl+b

# debug 模式启动

1
adb shell am start -D -n com.zj.wuaipojie/.ui.MainActivity
  • 安装包的包名/去包名的启动类名
  • adb shell am start -D -n
  • adb shell am start -D -n 包名/类名
  • am start -n 表示启动一个activity
  • am start -D 表示将应用设置为可调试模式

如果 device:offline 可以再试一次

# jeb 附加进程调试

(第一次记得重启 jeb) 抓一下用来对比的 base64 码

  • 附加进程
  • F8 运行
  • ctrl+f6 进入方法
  • F6 跳过
  • F7 跳出
  • ctrl+R 运行到光标位置

这里 v0 的值在虚拟机中读不到, 需要进入方法看返回值. 但在真机里是可以直接看 v0 的

# Log 查桩

定义:Log插桩指的是反编译APK文件时,在对应的smali文件里,添加相应的代码输出实时状态.

和调试的时候用 print 是一样的

步骤

  • 把给定 dex 塞进安装包 并改名
  • 调用命令(dex+编译器)
1
invoke-static {对应寄存器}, Lcom/mtools/LogUtils;->v(Ljava/lang/Object;)V
  • 算法助手, 打开对应 app 的 Log 捕获, 右上角三角 应用配置
  • (可能要重启算法助手) 在算法助手里查看 Log

查看日志里看到的 qtfreet 的繁华大神的名字(写log dex), 用这个来过滤的. 参数2 的值是我们需要的

对了 第四课的作业没做