一 数据包抓取

1.1 抓包工具选择

1
2
3
4
5
6
7
# Wireshark:Wireshark 是一个开源的网络抓包工具,可以在多个平台上运行,支持多种协议的抓取和分析。

# Fiddler:Fiddler 是一个跨平台的抓包工具,可以用于捕获和分析 HTTP 和 HTTPS 流量。它提供了强大的调试和排查功能。

# Charles Proxy:Charles Proxy 是一款跨平台的代理服务器工具,可以捕获并分析 HTTP 和 HTTPS 流量。它具有图形化界面和丰富的功能,适用于移动设备和桌面应用程序的抓包。

# Tcpdump:Tcpdump 是一个命令行抓包工具,适用于 Linux 和 Unix 系统。它可以捕获和分析网络流量,并提供灵活的过滤和输出选项

image-20240517143448394

1.2 charles安装和配置

1.2.1 mac安装配置

1
2
3
# 1 下载软件:Charles_4.5.6_xclient.info.dmg
# 2 双击安装
# 3 打开软件,输入sn码破解

1.2.2 win安装配置

1
2
3
# 1 下载软件:charles-proxy-4.5.6-win64.msi
# 2 一路下一步安装
# 3 打开软件,输入sn码破解

1.2.3 sn账号

1
2
3
4
5
6
7
8
Name: Just For Testing
Serial: 230ADA2020DFBD108E

Name: TEAM MESMERiZE
Serial: FC91D362FB19D6E6CF

Name: MSJ
Serial: 1101CAF6A1989C62AC

1.3 使用charles抓取手机http包

image-20240517143530345

1
2
3
# 配置步骤
【电脑】安装并运行抓包工具 charles
【手机】配置手机系统代理

1.3.1 配置模拟器抓包

1
2
3
4
5
6
7
# 1  打开charles,点击:proxy--》proxy Settings---》如下图1
# 2 打开charles,点击:help--》Local ip address-->查看本机地址--》下图2--》
或执行命令查看:
win:ipconfig
mac:ifconfig
# 我的是192.168.1.173
# 3 打开mumu模拟器---》设置--》wlan---》长按---》配置代理

image-20240517143602758

image-20240517143636808

image-20240517143645643

1.3.2 配置真机抓包

1
2
3
4
5
6
7
# 1  打开charles,点击:proxy--》proxy Settings---》如下图1
# 2 打开charles,点击:help--》Local ip address-->查看本机地址--》下图2--》
或执行命令查看:
win:ipconfig
mac:ifconfig
# 我的是192.168.1.173
# 3 打开真机---》设置--》wlan---》长按---》配置代理

image-20240517143703671

1.3.3 抓取http包案例(爱学生app)

1
2
3
4
import requests
data={"code":"","password":"lqz12345","username":"18953675221","uuid":""}
res=requests.post('http://parentsystem.aixuesheng.net/app/v1/patriarchLogin/1',json=data)
print(res.text)

1.4 使用charles抓取手机https包(手机需要root)

1.4.1 模拟器安装charles证书

1
2
3
4
5
6
手机或模拟器只能抓取http请求的数据包,https无法抓取。
想要抓取,就需要在手机上安装charles的证书。

### 注意:
安卓7 以下设备,安装完证书就可以使用,不用移动证书
安卓7以上设备,安装完证书后,为用户证书,必须把用户证书,移动成系统证书,需要借助于magisk刷move cert模块,需要root权限
1
2
3
4
5
6
7
8
9
10
###### 模拟器安装(模拟器版本低于7,不需要做证书迁移) ######
# 1 打开charles--》help---》SSLProxying---》InstallCharles Root Certificate on a Mobile...
# 2 访问网址 chls.pro/ssl
# 3 手机设置完代理,才能访问
# 4 下载安装证书

# 5 就可以抓取http的包了


#https://mumu.163.com/help/20230517/35048_1088553.html

image-20240517143718312

image-20240517143732126

1.4.2 真机安装charles证书

1
2
3
4
5
# 1 真机配置好代理后
# 2 浏览器访问:chls.pro/ssl
# 3 下载后,手机打开:安全---》加密与凭据---》安装证书---》安装完成
# 4 手机打开:安全--》加密与凭据---》信任的凭据
-此时可以看到用户证书和系统证书

image-20240517143745648

image-20240517143755896

image-20240517143807665

image-20240517143819126

image-20240517143830282

1.4.3 用户证书和系统证书解释

1
2
3
4
5
6
7
8
9
10
11
12
在 Android 系统中,有两种类型的证书:用户证书(User Certificates)和系统证书(System Certificates)。

用户证书(User Certificates):用户证书是由特定用户生成或颁发的数字证书。这些证书通常用于用户身份验证和安全通信。用户证书可以用于加密和解密数据,数字签名以及建立安全连接。用户证书通常由用户自己创建,例如,用于加密电子邮件、VPN连接或身份验证。

系统证书(System Certificates):系统证书是由 Android 系统或设备制造商预装的证书。这些证书通常用于系统级别的安全功能,如应用程序签名验证、SSL/TLS 连接等。系统证书通常用于验证应用程序的真实性和完整性,以确保它们没有被篡改或恶意修改。这些证书由 Android 操作系统或设备制造商管理和维护。

系统证书包括以下几种类型:

代码签名证书:用于验证应用程序的签名,以确保应用程序的真实性和完整性。
安全通信证书:用于建立 SSL/TLS 连接,保护设备和服务器之间的通信安全。
根证书:根证书用于验证其他证书的真实性。Android 系统预装了一组根证书,用于验证 SSL/TLS 通信中的服务器证书。
用户证书和系统证书在安全和身份验证方面扮演不同的角色。用户证书由用户自己管理,用于个人身份验证和加密通信。而系统证书由操作系统或设备制造商管理,用于验证应用程序和保护系统级别的通信安全。

1.4.4 把用户证书转成系统证书

1
2
3
4
5
6
7
8
9
10
11
12
# 1 将move cert压缩包传到手机(任意好找的一个目录 `/sdcard/Download/`)
adb push /Users/lqz/soft/movecert-1.9-4.zip /sdcard/Download
# 2 使用面具,刷入
按照下图步骤

# 3 重启手机

# 4 手机打开:安全--》加密与凭据---》信任的凭据
-此时可以看到用户级别证书移动到系统级别了

# 5 此时可以愉快抓https包了

image-20240517143844640

image-20240517143856582

image-20240517143914786

image-20240517143923701

1.4.5 案例:抓取https包(今日南川app)

image-20240517143933861

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import requests

data = {
'appId': '32',
'hashSign': '133bcb5e7330257a8823747b492d28b2',
'imgUrl': '',
'lat': '29.568295',
'lng': '106.559123',
'loginName': '18953645221',
'nickName': '',
'openId': '',
'place': '重庆',
'pwd': '827ccb0eea8a706c4c34a16891f84e7b',
'sessionId': '392032c5-09c8-4c3c-bb17-16a1dc49f7fc',
'token': "",
'type': '',
}
headers = {
'appid': '32',
'sessionid': '392032c5-09c8-4c3c-bb17-16a1dc49f7fc',
'token': '',
't': '1686650472124',
'sign': '90b5afeaed045a4c5ac9b13f693c7023',
'cqlivingappclienttype': '1',
'cqlivingappclientversion': '2029',
'content-type': 'application/x-www-form-urlencoded',
'content-length': '249',
'accept-encoding': 'gzip',
'user-agent': 'okhttp/4.10.0',
}
res = requests.post('https://api.cqliving.com/login.html', data=data, verify=False,headers=headers)
print(res.text)

二 反编译工具

2.1 常见反编译工具

1
2
常见的反编译工具:jadx(推荐)、jeb、GDA
反编译工具依赖于java环境,所以我们按照jdk

2.2 JDK环境安装

1
2
3
4
5
6
# 官方地址:(需要注册-最新java 21)
https://www.oracle.com/java/technologies/downloads/

# 下载地址
链接: https://pan.baidu.com/s/10CuP_snpciwvYkWlVFATXA
提取码: tt88

2.2.1 win平台安装

1
2
# 1 下载jdk-8u371-windows-x64.exe
# 2 双击安装

2.2.2 mac平台安装

1
2
# 1 下载jdk-8u371-macosx-x64.dmg
# 2 双击安装

2.2.3 验证是否安装成功

1
2
3
4
5
java -version  # 看到打印安装成功
'''
java version "1.8.0_371"
Java(TM) SE Runtime Environment (build 1.8.0_371-b11)
'''

2.3 jdax安装

2.3.1 下载地址

1
2
3
4
5
6
7
8
# 1 官网
https://github.com/skylot/jadx/releases

# 2 提供的地址
链接: https://pan.baidu.com/s/10CuP_snpciwvYkWlVFATXA
提取码: tt88

# 最新:1.4.7 推荐:1.2.0,后期都会用

image-20240517143953269

2.3.2 安装

1
2
# 下载直接解压即可(注意不要放在有中文的路径)
# 把apk直接拖入软件即可

image-20240517144002876

image-20240517144010909

三 反编译后代码定位

3.1 抓包

1
2
# 打开app,运行,使用抓包工具抓包,发现密码是加密的
# 这时候咱们需要,反编译后,定位到代码位置

image-20240517144837050

3.2 反编译定位位置

1
2
3
# 通过:URL网址 或 参数关键字  `pwd`   `"pwd"`    put("pwd    等关键字搜索
# https://dealercloudapi.che168.com/tradercloud/sealed/login/login.ashx

image-20240517144854684

image-20240517144045687

image-20240517144054371

image-20240517144954307

image-20240517144102925

1
2
3
4
5
6
7
# 我们发现,定位到代码,但是读不懂什么意思,只能靠猜测和比较
import hashlib
str='1234567'
res=hashlib.md5(str.encode('utf-8')).hexdigest()
print(res)

## 注意:这个过程需要掌握Java和安卓开发。所以后期我们要学习java知识和安卓开发

四 hook框架frida

1
2
3
4
5
6
Hook 框架是一种技术,用于在运行时拦截和修改应用程序的行为。
通过 Hook,你可以劫持应用程序的方法调用、修改参数、篡改返回值等,以达到对应用程序的修改、增强或调试的目的
# 常见的有:
Xposed Framework:Xposed 是一个功能强大的开源 Hook 框架,可以在不修改应用程序源代码的情况下,对应用程序进行各种修改。它允许你编写模块来拦截和修改应用程序的方法调用,修改应用程序的行为和逻辑。

Frida:Frida 是一个跨平台的动态 Hook 框架,支持安卓和其他操作系统。它提供了一个强大的 JavaScript API,可以在运行时对应用程序进行 Hook,包括方法拦截、参数修改、调用注入等。Frida 可以用于安全研究、逆向工程和应用程序调试等方面。

4.1 下载安装

1
# 注意:需要电脑端[电脑端要安装python解释器环境]和手机端同时安装,版本必须对应

4.1.1 电脑端安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 指定版本安装
pip install frida==16.0.1
pip install frida-tools==12.0.1

# 安装最新版
pip install frida # 16.0.9
pip install frida-tools # 12.1.2


# 正常都可以顺利安装,若安装出现错误,下载源码包安装
#### 必须根据 :frida版本 + Python版本 + 操作系统 来选择下载响应的egg或whl文件。
https://pypi.doubanio.com/simple/frida/

pip install frida-16.0.1-cp37-abi3-macosx_10_9_x86_64.whl

image-20240517144123778

4.1.2 手机端安装frida-server

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1 先查看手机架构
adb shell getprop ro.product.cpu.abi
# arm64-v8a

# 2 下载frida-server
https://github.com/frida/frida/releases

# 3 解压,上传到手机 /data/local/tmp/ 目录下
-解压得到文件,把文件上传到手机
adb push ./今日软件/frida-server/frida-server-16.0.19-android-arm64 /data/local/tmp/

# 4 赋予可执行权限
adb shell # 进入手机命令行
su # 切换为超级用户
cd /data/local/tmp/
chmod 755 frida-server-16.0.19-android-arm64 # 加入执行权限
ls -al # 查看权限

# 5

image-20240517145017028

4.2 启动并hook应用

4.2.1 手机端启动frida服务端

1
2
3
4
5
# 切换到手机的/data/local/tmp目录下
adb shell
su
cd /data/local/tmp
./frida-server-16.0.19-android-arm64

报错解决

1
2
方案一:重启手机
方案二:运行adb shell setenforce 0

image-20240517144139557

4.2.2 电脑端配置

4.2.2.1 配置端口转发

1
2
3
4
5
6
7
8
9
# 方式一:命令行中敲
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043

# 方式二:使用python执行
import subprocess

subprocess.getoutput("adb forward tcp:27042 tcp:27042")
subprocess.getoutput("adb forward tcp:27043 tcp:27043")

4.2.2.2 编写python代码,打印手机中的进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 枚举手机上的所有进程 & 前台进程
import frida

# 获取设备信息
rdev = frida.get_remote_device()

# 枚举所有的进程
processes = rdev.enumerate_processes()
for process in processes:
print(process)

# 获取在前台运行的APP
front_app = rdev.get_frontmost_application()
print(front_app)

错误

1
2
3
# 没有配置端口转发
adb forward tcp:27042 tcp:27042
adb forward tcp:27043 tcp:27043

image-20240517144149958

4.3 hook 某智赢的加密算法encodeMD5

1
# 下载地址:https://appdownload.che168.com/usedcar/csy/index.html?pvareaid=106101
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import frida
import sys
# 连接手机设备
rdev = frida.get_remote_device()

# 包名:com.che168.autotradercloud
# 车智赢+
session = rdev.attach("车智赢+")
scr = """
Java.perform(function () {
//找到类 反编译的首行+类名:com.autohome.ahkit.utils下的
var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");

//替换类中的方法
SecurityUtil.encodeMD5.implementation = function(str){
console.log("参数:",str);
var res = this.encodeMD5(str); //调用原来的函数
console.log("返回值:",res);
return str;
}
});
"""

script = session.create_script(scr)

def on_message(message, data):
print(message, data)

script.on("message", on_message)
script.load()
sys.stdin.read()

4.4 Python Hook方式

1
2
3
4
5
6
7
8
9
10
11
12
# Spawn 方式适应场景:Spawn 方式是在目标应用程序启动时直接注入 Frida 的 Agent 代码

需要在应用程序启动的早期阶段进行 Hook。
需要访问和修改应用程序的内部状态,例如应用程序的全局变量、静态变量等。
需要 Hook 应用程序的初始化过程,以实现对应用程序的自定义初始化逻辑。
需要在应用程序的上下文中执行代码,并与其他模块或库进行交互。

# Attach 方式适应场景:Attach 方式是在目标应用程序已经运行的过程中动态地连接并注入 Frida 的 Agent 代码
需要对已经运行的应用程序进行 Hook,即动态地连接到正在运行的进程。
需要在应用程序运行时拦截和修改特定的方法调用。
需要实时监视和修改应用程序的行为,例如参数修改、返回值篡改等。
需要对应用程序进行调试和分析,以查找潜在的问题和漏洞。

4.4.1 attach方式(手动操作)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import frida
import sys
# 连接手机设备
rdev = frida.get_remote_device()

# 包名:com.che168.autotradercloud
# 车智赢+
session = rdev.attach("车智赢+")
scr = """
Java.perform(function () {
//找到类 反编译的首行+类名:com.autohome.ahkit.utils下的
var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");

//替换类中的方法
SecurityUtil.encodeMD5.implementation = function(str){
console.log("参数:",str);
var res = this.encodeMD5(str); //调用原来的函数
console.log("返回值:",res);
return str;
}
});
"""

script = session.create_script(scr)

def on_message(message, data):
print(message, data)

script.on("message", on_message)
script.load()
sys.stdin.read()

4.4.2 spawn方式(自动重启app,适用于在应用程序启动的早期阶段进行)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import frida
import sys

rdev = frida.get_remote_device()
pid = rdev.spawn(["com.che168.autotradercloud"])
session = rdev.attach(pid)

scr = """
Java.perform(function () {
// 包.类
var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
SecurityUtil.encodeMD5.implementation = function(str){
console.log("明文:",str);
var res = this.encodeMD5(str);
console.log("md5加密结果=",res);
return "305eb636-eb15-4e24-a29d-9fd60fbc91bf";
}
});
"""
script = session.create_script(scr)


def on_message(message, data):
print(message, data)


script.on("message", on_message)
script.load()
rdev.resume(pid)
sys.stdin.read()

4.5 js Hook方式javaScript+终端

1
2
3
4
5
6
7
8
9
10
11
# 代码 hook.js
Java.perform(function () {
// 包.类
var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
SecurityUtil.encodeMD5.implementation = function(str){
console.log("明文:",str);
var res = this.encodeMD5(str);
console.log("md5加密结果=",res);
return "305eb636-eb15-4e24-a29d-9fd60fbc91bf";
}
});

4.5.1 attach,先启动app,然后再在终端执行:

1
frida -UF -l hook.js  

4.5.2 spwan,脚本自动重启APP并进行Hook

1
2
3
frida -U -f com.che168.autotradercloud -l hook.js

# 注意:输入q + 再点击回车则退出

五 使用python还原算法

1
2
3
4
5
# 加密分类
1、单向加密 :MD5、sha系列不可逆
2、对称加密:AES、DES
3、非对称加密:RSA、DSA
4、补充算法:base64

5.1 md5

1
2
3
4
import hashlib
m = hashlib.md5()
m.update('helloworld'.encode("utf8"))
print(m.hexdigest())

5.2 sha

1
2
3
4
5
6
import hashlib
sha1 = hashlib.sha1()
data = 'helloword'
sha1.update(data.encode('utf-8'))
sha1_data = sha1.hexdigest()
print(sha1_data)

5.3 DES加密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# pip3 install pycryptodomex -i https://pypi.douban.com/simple
# DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。它的密钥长度是56位(因为每个第8 位都用作奇偶校验),密钥可以是任意的56位的数,而且可以任意时候改变。

from Cryptodome.Cipher import DES
key = b'88888888'
data = "hello world"
count = 8 - (len(data) % 8)
plaintext = data + count * "="
des = DES.new(key, DES.MODE_ECB)
ciphertext = des.encrypt(plaintext.encode())
print(ciphertext)

plaintext = des.decrypt(ciphertext)
plaintext = plaintext[:(len(plaintext)-count)]
print(plaintext)

5.4 非对称加密算法-RSA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 安装模块
pip3 install rsa -i https://pypi.douban.com/simple

import rsa
# 返回 公钥加密、私钥解密
public_key, private_key = rsa.newkeys(1024)
print(public_key)
print(private_key)

# plaintext = b"hello world"
# ciphertext = rsa.encrypt(plaintext, public_key)
# print('公钥加密后:',ciphertext)
# plaintext = rsa.decrypt(ciphertext, private_key)
# print('私钥解密:',plaintext)

### 使用私钥签名
plaintext = b"hello world"
sign_message = rsa.sign(plaintext, private_key, "MD5")
print('私钥签名后:',sign_message)

## 验证私钥签名
plaintext = b"hello world"
# method = rsa.verify(b"hello world", sign_message, public_key)
method = rsa.verify(b"hello world1", sign_message, public_key) # 报错Verification failed
print(method)

5.5 base64

1
2
3
4
5
6
7
8
9
import base64

# 编码
res=base64.b64encode(b'hello world')
print(res)

# 解码
res=base64.b64decode('aGVsbG8gd29ybGQ=')
print(res)

__END__