Windows虚拟机环境配置
版本windows10 20H2
地址D:\Linux\ISO\cn_windows_10_consumer_editions_version_20h2_updated_feb_2021_x64_dvd_8ddab99d.iso
参考vmware虚拟机windows10系统安装_windows10虚拟机-CSDN博客
jdk、jadx、gda、jeb
AndroidStudio配置
地址https://developer.android.google.cn/studio/





不导入配置文件

Dont send


SDK路径

next-finish
SDK配置
SDK 版本29

Build-Tools 版本30.0.3

编辑注册表:'win+r'->regedit->修改安卓默认配置路径为D:\Android\.android

创建模拟器
AndroidStudio配置–>AVD Manager–>Google Pixel 1 代–>Android 10.0
-
创建新虚拟设备
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 171. 点击 "Create Virtual Device" 2. 选择硬件: - Category: Phone - 选择 "Pixel"(5.0英寸)或 "Pixel XL"(5.5英寸) - 点击 "Next" 3. 选择系统镜像: - 选择 "Pie" API Level 29 - 在 "Recommended" 标签页选择: Google APIs Intel x86 Atom_64 System Image - 点击 "Next" 4. 配置 AVD: - AVD Name: Pixel_API_29(建议命名) - Startup orientation: Portrait(竖屏) - Performance: * Graphics: Hardware - GLES 2.0(性能最好) * Device frame: 可选 - 点击 "Show Advanced Settings" -
高级配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17# 在 Advanced Settings 中设置: Camera: - Front: None - Back: None Network: - Speed: Full - Latency: None Memory and Storage: - RAM: 2048 MB(如果主机内存充足,可设4096) - VM Heap: 256 MB - Internal Storage: 2048 MB - SD Card: 512 MB(可选) Emulated Performance: - Graphics: Hardware - GLES 2.0 - Boot option: Cold boot(默认) Device Frame: - 可选,为节省资源可不勾选 -
完成创建
1 2 31. 点击 "Finish" 2. 在 AVD Manager 列表中会看到新设备 3. 点击 "Play" 按钮启动测试
模拟器网络连接
|
|
根据输出结果
radio0 是当前分配了 IP 地址(10.0.2.15)的接口,但状态是 DOWN
|
|
应该看到 state UP 而不是 state DOWN
|
|
输出应该包含:default via 10.0.2.2 dev radio0
|
|
问题确认了! 模拟器启动后 radio0 接口仍然是 DOWN 状态,而且没有 eth0 接口。这表明模拟器的网络初始化完全失败
最终方案
现在需要从主机端修复这个问题,因为模拟器内部的网络栈已经损坏
完全关闭当前模拟器
|
|
修复模拟器网络配置
|
|
验证修复
模拟器启动后,在主机命令提示符中执行:
|
|
adb:在电脑端操控手机端
真机配置
线刷包组成
adb常用命令
ADB 是 Android 调试桥 的命令行工具,它是 Android SDK 的一部分。它允许你的电脑与 Android 设备(真实手机或模拟器)进行通信
| 语法 | 功能 |
|---|---|
| adb/adb help/adb –help | |
| adb version | 显示adb版本和路径 |
| adb start-server | 启动server |
| adb kill-server | 停止server |
| adb devices | 显示连接的设备列表 |
| adb install xxx.apk | 通过adb安装app |
| adb install -r xxx.apk | 覆盖安装 |
| adb uninstall 包名 | 通过adb卸载app |
| adb push xxx xxx | 推送电脑的文件到手机 |
| adb pull xxx xxx | 拉取手机的文件到电脑 |
| adb pull xxx | |
| adb shell | 进入到手机的Linux控制台 |
| adb -s 设备名 shell | 多设备时,指定设备 |
logcat的使用
Logcat 是 Android 系统的日志记录工具,它会捕获系统和应用的运行日志。你可以通过 ADB 来访问这些日志:
adb logcat
-
logcat常用选项
adb logcat -help 查看帮助
adb logcat 常规显示
adb logcat -c 清除日志
adb logcat -g 显示缓冲区大小
adb logcat -G 256M 修改缓冲区大小
adb logcat -v time 设置不同的显示格式
adb logcat -v color 带颜色的显示
ctrl+c 强制中断程序的执行
-
根据tag过滤日志
adb logcat -s xiaojianbang
-
根据pid过滤日志
ps -A |grep com.xiaojianbang.app 先获取进程pid
adb logcat |findstr 5568
-
在AndroidStudio的logcat中查看,更加方便
日志级别(从低到高):
- V - Verbose(详细)- 所有信息
- D - Debug(调试)- 调试信息
- I - Info(信息)- 一般信息
- W - Warning(警告)- 警告信息
- E - Error(错误)- 错误信息
- F - Fatal(致命)- 严重错误
安卓系统
apk基本结构
APK(Android Package Kit)是 Android 应用程序的安装包文件,本质上是一个 ZIP 格式的压缩包。以下是 APK 的基本结构和各部分的详细说明
|
|
Linux常用命令
| 命令 | 功能 | 常用选项 |
|---|---|---|
| ls | 列出文件 | -l, -a, -h |
| cd | 切换目录 | .., ~, - |
| pwd | 显示当前目录 | |
| cp | 复制文件 | -r, -v |
| mv | 移动/重命名 | |
| rm | 删除文件 | -r, -f |
| cat | 显示文件内容 | |
| grep | 搜索文本 | -r, -i, -n |
| find | 查找文件 | -name, -type |
| chmod | 修改权限 | 755, u+x |
| ps | 查看进程 | aux, -ef |
| top | 动态查看进程 | |
| kill | 结束进程 | -9 |
| df | 磁盘使用 | -h |
| du | 文件大小 | -sh |
| tar | 压缩解压 | -xzvf, -czvf |
| ssh | 远程连接 | user@host |
| scp | 远程复制 | -r |
| wget | 下载文件 | -c, -O |
| curl | 网络请求 | -O, -L |
| history | 命令历史 | |
| man | 查看手册 | |
| sudo | 提权执行 | |
| file | 查看文件类型 | |
| touch/mkdir | 创建 | -p |
| rmdir/rm | 删除 | -f, -rf |
| echo | 输出 |
Android常用目录
| 目录 | 用途 | 是否需要 root |
|---|---|---|
/sdcard/ |
内部存储 | 否 |
/data/data/<包名>/ |
应用私有数据 | 是 |
/data/local/tmp/ |
临时文件 | 否(adb) |
/system/app/ |
系统应用 | 是 |
/proc/ |
系统信息 | 部分需要 |
/sys/ |
设备信息 | 部分需要 |
/data/anr/ |
ANR 日志 | 是 |
/data/tombstones/ |
Native 崩溃 | 是 |
/data/misc/wifi/ |
WiFi 配置 | 是 |
/data/system/packages.xml |
包管理信息 | 是 |
-
data/data目录 存放用户apk数据的目录,每个apk都有自己的目录,以包名命名 就是在data/data/目录下,会产生一个跟Package一样的目录 这是一个私有目录,app只能访问各自的目录,除非root权限
-
data/app目录用户安装的app存放在这个目录下
-
data/local/tmp临时目录,权限比较大
-
system/app目录存放系统自带的app
-
system/lib目录、system/lib64存放app用到so文件
-
system/bin目录存放shell命令
-
system/framework目录Android系统所用到框架,如一些jar文件,XposedBridge.jar
-
sd卡目录 不管手机有没有存储卡都会有这个目录,app操作sd卡目录需要申请权限
/sdcard -> /storage/self/primary
/mnt/sdcard
/storage/emulated/0
Linux权限
| 权限值 | 字符表示 | 适用场景 |
|---|---|---|
| 777 | rwxrwxrwx | 测试、临时文件(不安全) |
| 755 | rwxr-xr-x | 可执行文件、脚本、目录 |
| 750 | rwxr-x— | 程序文件(组内共享) |
| 644 | rw-r–r– | 配置文件、网页、文档 |
| 640 | rw-r—– | 配置文件(组可读) |
| 600 | rw——- | 私密文件(SSH密钥、密码) |
| 400 | r——– | 只读配置文件 |
| 1777 | rwxrwxrwt | 公共临时目录(/tmp) |
| 2755 | rwxr-sr-x | 共享目录(SGID) |
| 4755 | rwsr-xr-x | 特权程序(SUID) |
安卓逆向入门
-
创建Native C++工程
-
AndroidStudio界面介绍
-
Project Structure
-
app的编译
Build -> Make Project
Make Module ‘HashMapTest.app’
Build -> Build Bundle -> Build APK
Clean Project
Rebuild Project
Run app
| AndroidStudio工程目录 | 作用 |
|---|---|
| gradle->wrapper->gradle-wrapper.properties | 配置项目gradle版本 |
| build.gradle | 描述工程整体的编译规则 |
| gradle.properties | gradle配置文件,一般无须改动 |
| local.properties | 本机环境配置,SDK、NDK路径等,一般无须改动 |
| settings.gradle | 配置哪些模块在一起编译 include ‘:app’ 只编译app |
| app -> build.gradle | 描述当前模块的编译规则 |
| app -> build -> outputs -> apk -> debug/release | 生成的apk的存放位置 |
| app -> build -> intermediates -> cmake -> debug/release -> obj | 生成的so存放位置 |
| libs | 模块中使用了第三方jar的时候,会放这里 |
| src -> main -> cpp | C/C++代码 |
| src -> main -> java | Java代码 |
| src -> proguard-rules.pro | Java代码混淆规则 |
| res -> drawable | 用来放图片 |
| res -> layout | 用来放布局文件 |
| res -> mipmap-hdpi | 用来放应用图片,不同屏幕的适配图标 |
| res -> values | strings.xml、public.xml |
| AndroidManifest.xml | 清单文件,app的icon图标、四大组件的注册、权限申请、指明程序入口 |
环境变量
| 目录 | 变量名 | 变量值 |
|---|---|---|
| Android配置文件 | ANDROID_SDK_HOME | D:\Android |
| Gradle | GRADLE_USER_HOME | D:\Android.gradle |
配置文件
build.gradle
|
|
清单文件
|
|
文件结构
|
|
程序的执行入口
一句话总结:
安卓程序有两个入口:后台的 Application.onCreate() 和前台的 MainActivity.onCreate()。
📋 详细说明:
1. 后台入口(先执行)
- 位置:
Application类的onCreate()方法 - 作用:整个应用启动时最早执行的代码
- 用途:全局初始化(如数据库、网络库、统计分析等)
2. 前台入口(后执行)
- 位置:
MainActivity类的onCreate()方法 - 作用:用户看到的第一个界面的初始化
- 标志:清单文件中配置了
MAIN和LAUNCHER
🔄 启动流程:
|
|
💡 简单比喻:
Application.onCreate()= 公司后台准备(用户看不到)MainActivity.onCreate()= 门店开门营业(用户看得到)
✅ 记住:
应用启动时,先执行后台初始化,再显示第一个界面
|
|
如果.myapplication类(自定义Application类)不存在,系统会:
- 使用默认的
android.app.Application类 - 不会崩溃,但你的自定义初始化代码不会执行
类加载时机
静态代码块在类加载时执行,不一定是应用启动时:
- Application 类:应用启动时立即加载
- Activity 类:启动该 Activity 时才加载
在Application类中创建的变量为全局变量
Log
Log(日志)是 Android 开发中的调试工具,就像程序的"日记本",用来记录程序运行过程中的各种信息。
主要用途:
- 调试程序:找出代码中的错误
- 跟踪流程:了解程序执行到哪一步
- 监控数据:查看变量的值
- 记录事件:保存用户操作、异常信息等
6种Log级别(从低到高)
|
|
Toast
Toast(吐司)是 Android 中的一个轻量级消息提示组件,就像手机屏幕底部弹出的"小纸条",几秒后自动消失
Toast 的特点
| 特性 | 说明 |
|---|---|
| 显示位置 | 默认屏幕底部(可自定义) |
| 显示时间 | 短时间(2秒)或长时间(3.5秒) |
| 交互性 | 非模态,不打断用户操作 |
| 自动消失 | 无需用户关闭 |
| 使用场景 | 提示、确认、轻量反馈 |
基本使用方法
1. 最简单的 Toast
|
|
2. 两种显示时长
|
|
3. 完整示例
|
|
基本控件
1.Button

2.TextView

3.EditText

布局文件
(activity_main.xml)
|
|
Activity中的绑定
(MainActivity.java)
|
|
例:
|
|
res->layout->activity_main.xml中查看控件
strings.xml
在代码中按住Ctrl,鼠标点击字符串跟踪R$string 类的字段定义
R.string.app_name, xml文件中用@string/xiao引用
res->values->string.xml

public.xml
Resources->values->public.xml
Ctrl+F搜索值


抓包
Charles
下载 https://www.charlesproxy.com/download/ 注册 https://www.zzzmode.com/mytools/charles
代码main.go生成注册码

注册Register

需关闭防火墙,Windows Proxy可关闭(接下来抓取手机上的流量)
代理端口设置Proxy -> Proxy Settings

socksdroid
抓取手机上的流量
安装adb install socksdroid-1.0.3.apk
设置主机ip以及charles设置的代理port,右上角打开VPN

验证抓取http流量(https已加密)
配置证书
https的抓包,ssl代理设置Proxy -> SSL Proxying Settings

save证书

推送证书adb push 刚刚保存的证书名.pem /sdcard
手机端安装证书
设置->安全->加密与凭据->从SD卡安装


安装成功,验证https流量(未加密)

安卓7以后系统只信任系统证书,需要把用户证书移动到系统证书目录
系统证书路径
/etc/security/cacerts用户证书路径
/data/misc/user/0/cacerts-added利用Magisk的**
Move Certificates模块**,来移动证书magisk装不上啊!本虚拟机x86架构
于是使用 mount --bind 命令,
它用 /data/local/cacerts 目录替换了原来的 /system/etc/security/cacerts 系统目录
现在系统看到的证书目录实际上是你新创建的目录
查看原来的系统证书
|
|
创建包含所有证书的新目录
|
|
bind mount包含所有证书的目录
|
|
移动新的用户证书到系统目录
可以直接在
/data/local/full_cacerts目录中添加证书文件。因为使用了mount --bind,对这个目录的任何修改都会实时反映到/system/etc/security/cacerts/
|
|
恢复原来的系统证书
|
|
HttpCanary
安装apk,下载证书,配置证书到系统目录即可
r0capture
安卓应用层抓包通杀脚本
抓包原理
https通信:对称加密aes+rsa

代理抓包:客户端和服务端中间通过抓包工具内置代理服务端,代理服务器伪造证书(用根证书签发),客户端识别证书
检验证书:证书路径/证书链,判断根证书是否在系统证书目录
APP端和服务端都是同一团队开发的,APP端可以识别真实服务端
数字证书:使用者、颁发者、有效期、公钥、指纹、签名信息
数字签名:用自己的私钥加密明文得到密文和明文,用本身的公钥校验

app界面控件查看
使用
uiautomatorviewer.bat查看Android SDK根目录\tools\bin
我的sdk没有上述工具
使用Androidstudio自带tools->Layout Inspector,选择当前正在前台运行、想要分析的应用程序的进程

app算法分析流程
-
抓包分析是否有需要逆向的加密字段
-
查壳分析是否有加固
-
查看界面元素,看是否是原生开发的app,因为不同形式app分析方法不一样
-
传统关键代码定位方法
通过控件绑定的事件代码,来一步步定位控件id、setOnClickListener
人肉手工搜索字符串
搜索链接 搜索加密的参数名:当有多个可疑关键处,如何确定是哪一个?动态调试、Hook 搜索同一个数据包中,没有加密的参数名
-
关键代码快速定位
跑一下自吐算法插件 Hook常用系统函数,如果app有调用就打印函数栈 在自制的沙盒中运行,打印app运行过程中的指令、函数调用关系等
-
逆向分析不是完全静态分析明白了才去hook,实际上是边分析边hook、不断怀疑、不断验证、不断推翻、不断找新关键函数的过程
Fridahook
frida的安装
pip install frida
pip install frida-tools(装frida-tools时会自动安装frida)
frida-server的版本与frida的版本要匹配
Hook可以用来做什么
可以用来判断app执行某个操作的时候,是否经过我们的怀疑的这个函数
可以用来修改被hook函数的运行逻辑
可以用来在运行过程中,获取被hook的函数传入的具体的参数和返回值
可以用来主动调用app中的某些函数
辅助算法分析
-
找到一些疑似关键函数,可以通过hook来确认app执行某个操作的时候,是否调用了它们
-
如果没有触发这些函数,考虑以下问题
a) app在执行这个操作的时候,真的没有调用这个函数,换一个其他的关键函数
b) 代码写错了,导致hook函数没执行
c) 一般可以通过主动调用上层函数,来触发这些hook函数
-
如果触发了这些函数,可以通过hook来打印执行过程中传入函数的参数和返回值
-
frida -U -F -l HookDemo.js
-U 代表远程USB设备
-F 代表附加到最前的这个app
-l 后面指明需要加载的JS脚本
-
写好的js脚本要注入手机端,并不是在Node.js中使用,所以只能用v8和fridaAPI支持的代码
代码的编写
|
|
主动调用的作用
可以用来测试Hook代码的正确性
调用加密函数观察算法输出结果特征
调用加密函数测试算法复现正确性
比较复杂的算法,需要借助主动调用实现算法转发
算法复现
node.js环境配置
官网下载node.js镜像安装,vscode下载插件code runner、ESLint、Prettier等

协议复现
Python为例:
|
|
模拟发包服务器返回404,模拟器本身环境小程序抓包也是
关键代码快速定位
|
|
加密库相关的hook(自吐算法)
SSL相关的hook
socket相关的hook
SocketOutputStream
SocketInputStream
读写文件相关的 java.io.File
证书双向验证 Keystore.load 通常有证书和密码
安卓退出进程的方式
//快速定位协议头加密okhttp3的addHeader方法
var okhttp_Builder = Java.use(‘okhttp3.Request$Builder’);
okhttp_Builder.addHeader.implementation = function (a, b) { showStacks(); return this.addHeader(a, b); }
安卓系统沙盒
Frida API
|
|
jadx动态调试(了解)
混淆函数的hook方法
1.用dexlib2修改dex混淆函数名(用base64编码)
2.hook代码中用base64解码函数名得到
frida.exe的使用
-
frida.exe的选项介绍 frida attach 包名、pid、前端进程注入 frida spawn frida.exe的的选项介绍 -U 连接远程USB设备(-U和-H只能选一个) -H 通过ip和端口连接,可以连接多台设备(netstat -nltp查看端口) -F 附加到最前的这个app -l 后面指明需要加载的JS脚本 -o 把信息输出到指定文件中
-
frida-server的选项介绍 -l 可以修改监听的地址端口,与frida.exe的-H选项配合使用 电脑和手机的ip需要互通
objection
1.objection的安装
a) objection对frida做了进一步的封装,通过输入一系列的命令即可完成hook。忘记命令时还可以按空格弹出对应提示信息,大大降低了hook框架的使用门槛
b) 安装objection之前,先安装frida和frida-tools
c) 为了有更好的兼容性,objection的版本,最好选择当前frida版本之后更新 objection更新时间查看地址 https://pypi.org/project/objection/1.1.3/#history frida更新时间查看地址
d) 教程使用的各版本号 pip install frida==14.2.18 pip install frida-tools==9.2.5 pip install objection==1.11.0
常见报错: pkg_resources.ContextualVersionConflict: (Pygments 2.11.2 (d:\soft\python386\lib\site-packages), Requirement.parse(‘Pygments<=2.11.1,>=1.6’), {’litecli’}) 降级Pygments库到2.11.1即可
2.objection的使用
注入进程,如果objection没有找到进程,会以spwan方式启动进程 objection –help objection -g <进程名> explore objetion log 文件位置 C:\Users\Administrator.objection
3.内存漫游
|
|
4.Wallbreaker
|
|
脱离pc使用Frida
- 脱离PC使用Frida的几种方式 a) 在手机上使用Termux终端 b) frida-inject c) frida-gadget.so 优点:可以免root使用frida、frida-gadget比较稳定 缺点:需要重打包app,局限性较大。但是我们可以通过魔改系统,让系统帮我们注入so,免去重打包的繁琐
- frida-inject的配置、选项和使用 -f、-p、-n、-s、-e
- 脱离pc后,如何判断hook是否生效 a) 写文件,然后查看文件内容 b) 主动调用Log的方法输出信息,然后使用logcat查看 c) 修改某些方法逻辑
免root使用Frida
|
|
免root+脱离pc使用Frida
|
|
Frida自吐算法演示
|
|
H5的app逆向
|
|
so入门
-
so中通常会接触到的东西 jni调用 系统库函数 加密算法 魔改算法 系统调用 自定义算法
-
so加固、so混淆 so的dump so的修复 so的文件结构 自定义linker
NDK
|
|
第一个NDK工程
|
|
so中常用的Log输出
|
|
NDK多线程
|
|
JNI_OnLoad
|
|
JavaVM
|
|
JNIEnv
|
|
so相关的几个概念
|
|
so函数注册
|
|
so路径的动态获取
|
|
so之间的相互调用
|
|
JNI
通过jni创建Java对象
|
|
通过jni访问Java属性
|
|
通过jni访问Java数组
|
|
通过jni访问Java方法
|
|
通过jni访问Java父类方法
|
|
内存管理
|
|
子线程中获取Java类
|
|
init与initarray
|
|