正己 - 安卓逆向这档事
# 一、模拟器环境安装
# 三个文件
- 雷电模拟器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文件结构
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
- 虚拟化技术
- 以插件机制运行
# 汉化
Pasted image 20221011230219.png 还有更偏的.so汉化
# 第一关
- 选中 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
# jadx-gui
反编译工具, 加载 apk 文件. 但不能改, 改还是要在 MT.
MT 反编译成 java 要会员, 所以用 jadx 来看.
# 核心破解 app
安装时会提示未激活, 点击(在LSPosed里)激活模块并勾选系统框架
# Smali 语法
smali 是 Dalvik 的寄存器语言, 由 .dex 反编译而来
# 简单破解方法
- 定位
- 搜索关键字
- 抓取按钮id(开发者工具)
- 反编译可能把字符串转成 unicode, 那么就搜索对应的 unicode
- 记住方法名, 方法名前后会有一点混淆, 如
m457onCreate$lambda2
在 smali 里是onCreate$lambda-2
, 在 java 代码里其实也能找到反混淆前的名字
- 用 MT 修改 dex
- 修改寄存器的值
- 强制跳转
- 修改判断
# 第二关
很简单啦 在 AK 反编译失败无法查看 Java 源码的情况下, 可以使用 jadx-gui 有时候还会编译失败, 那就用 MT管理器改
# 四、广告弹窗
# 前言
# 工具
- 算法助手
- 开发助手
# 广告类型
- 启动广告
- 弹窗广告/更新广告
- 横幅广告
# 安卓四大组件
Activity | 界面 |
Service | 后台操作 |
Broadcast Receiver | 广播信息 |
Content Provider | 与APP之间共享数据的唯一途径, 调用系统 API |
# 启动广告
# 流程
启动Activity -> 广告 Activity -> 主页Activity
# 修改
- 修改广告时间
- Activity 切换定位法, 修改 Intent 的 Activity类名(跳过Activity)
# Activity 切换定位法
3:37
- MT 侧边菜单 - Activity 记录, 启动服务
- 会出现一个小浮窗, 在APP运行时记录下 Activity名称
- 复制广告活动名, 用 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 时调用 |
# 更新弹窗
方法
- 修改 xml 的 versioncode
- Hook 弹窗
- dex 改弹窗代码
- 抓包修改响应体
# 修改 versioncode
xml
# Hook 弹窗
- 算法助手
- 在系统返回键被劫持时可用
算法助手安装后启动模块, 并勾选实验对象app(系统不用). 然后在算法助手应用里打开总开关和弹窗定位(也可以直接开屏蔽关键词弹窗)
# 修改 dex
在算法助手里查看日志, 用时间找到弹窗, 分析堆栈就可以看到弹窗是由哪个方法调用的
# 横幅广告
- 开发助手(布局查看功能)
开发助手放大镜功能, 定位到 View id, 用 MT xml 搜索(去掉0x)
改法1: 高度或宽度改为0dp
改法2: 隐藏布局
|
|
# 五、动态调试和插桩
# 工具
- jeb: 静态分析和动态调试的反编译工具
- XappDebug: 动态调试
# 动态调试
# 修改 debug 权限
# 方法一: Manifest.xml 修改
用 MT, application 添加
|
|
# 方法二: XappDebug
XappDebug模块hook对应的app
安装 apk, 在 LSPosed 里激活
# 方法三: Magisk 命令(重启失效)
|
|
# 方法四: 刷入MagiskHide Props Config模块(永久有效, 但有的手机不支持)
Android修改ro.debuggable 的四种方法_Amarao的博客-CSDN博客
# 端口转发以及开启adb权限
开启 usb 调试
jeb 在代码窗点右键-分析即转为 Java 代码
夜神模拟器:adb connect 127.0.0.1:62001
# 下断点
smali 下 ctrl+b
# debug 模式启动
|
|
- 安装包的包名/去包名的启动类名
- 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+编译器)
|
|
- 算法助手, 打开对应 app 的 Log 捕获, 右上角三角 应用配置
- (可能要重启算法助手) 在算法助手里查看 Log
查看日志里看到的 qtfreet
的繁华大神的名字(写log dex), 用这个来过滤的. 参数2 的值是我们需要的
对了 第四课的作业没做