返回列表 发新帖

记一个flutter应用加密算法的破解过程[内存取证]

  [复制链接]

5

主题

386

回帖

1087

积分

高中生

Rank: 4

金币
595
好评
1
信誉
100
发表于 2026-1-13 14:28:12 | 显示全部楼层 | 阅读模式  来自 江苏
本帖最后由 braintrust2003 于 2026-1-13 17:29 编辑

本次案例不是破解会员,也不是破解卡密内购。
仅是一个requests body和 response 加密算法的还原记录。

本次我们同样采用内存取证方法,再次利用到我们上一篇文章中提到的法宝。
本次案例同样来自客户需求。先上apk图



好消息是未加固
坏消息是竟然是flutter应用


不知道从何时起,flutter应用开始满天飞了。
搞逆向的应该知道flutter应用,都是千元起步,难度是有目共睹。

但是我今天要讲的依然是我们内存数据取证的应用。
所以,到此我们基本上就不分析apk了。
重点讲解我们的内存数据
不管怎么样,先抓包吧
我们今天分析的重点是这个请求的body体(返回数据也是一样的)
抓包结果


我们继续祭出我们的手机法宝,把手机内存dump下来查找关键词
并搜索我们的关键词
这里我们的关键词就搜索我们登录时候的密码123456好了



这是一个好现象啊,一眼就知道这是我们的登录时候的数据包构成啊
复制出来
查看字节数 ,对比密文base64解密后的字节数
惊奇的一致!
我们继续分析
那么事情就简单了。密文和明文字节数一致的算法有哪些?
xor,rc4算是我们最常见的了。

很简单,我们改密码后看看数据包情况。


我们发现改密码后改几个数字,那么密文就有几个变化。
所以,第一反应就是xor了。写个代码解析下密钥

  1. import base64

  2. def get_keystream(plain_str, cipher_b64):
  3.     plain = plain_str.encode('utf-8')
  4.     cipher = base64.b64decode(cipher_b64)
  5.     # 提取密钥流
  6.     length = min(len(plain), len(cipher))
  7.     return bytes([plain[i] ^ cipher[i] for i in range(length)])
复制代码


输入密文和明文后,得到密钥流

  1. eabfac1c4696969c11352ada86d976307d4712f26d210d16a0344b7bc2f50fe8e9b3d4a9f8f43a89d32d7cf9e4e176606fb1dc0ec7daecef5469f5131f461fefce27f06c2f0e500e5c427cde96455464306e6d30de08d1e9a352bee4f609f8723f692abcda5d3757e848288b98d3772eeb7f1ab1c6042d5ef9a117ecf2e4df08f6749b240ada70ebca3c8418f97fde67bebb456aee086586859c0ffcaeeb09ca80d7092b945ced8e0e9d34e634352bc7bf472ae28fb0498680696182c9ef808f15a9807e2e785e51f854faf79212d3677a2d441f35cebb5f07f7f0a86b0b9e02b816eacbc2207b931f7ec6bde637d760bfce27adef9ea7a05875a6e057fa034f41d528db0738c8d3229e37b86aaaa7a46a00906cb8b5aadf9254ecec045edd2d0ad25a0aaedd4fdcad88586ca51683f0d092a7c5062ca06b832c3ace61cf42f9888ebb06ef6b7ab5dcc3d39d4a113249003e17a286457e83819c919c1253fd9e5fb5190e732b70dc11f973b1076bcc17b4616c45249254bb1480a40260c77e4b1c3b555bbc7c2bafe59fa341a79d3282922a064d8b620f9e26947f4259c86930bed5e3dca2c25e91ddab643da0dd70eb515114fd7e2695d4deb868a3776dc06d27201b6194ffc07c817ead76dda4329820745f2a2b1de9a6e25852fcf75f21680cca3c48a350e9dd3d2b15ea90a67da047ec11fcbfc7da97a4380fac13a18a697a35ee8cfc67c61e7ca51718afbfafd414436ac6427d84cba5......次数省略1万字
复制代码


可以看出来,没有任何重复,所以它不可能是xor。
那么它应该就是rc4了

至此,其实我们已经完成任务了,所有的请求和返回我们都能解密和加密了。
  1. h = "xxxxxxxxxxx" //把上面密钥流填写进来

  2. def decrypt_with_hex(cipher_b64, keyHex):
  3.     keystream = bytes.fromhex(keyHex)
  4.     cipher = base64.b64decode(cipher_b64)
  5.     length = min(len(cipher), len(keystream))
  6.     decrypted = bytes([cipher[i] ^ keystream[i] for i in range(length)])
  7.     return decrypted.decode('utf-8', errors='ignore')

  8. c2 = ("kZ3IfTL3tKYzFwb49awVUxg0YdBXVX9jxRhpFqeGfImO1vaT2qdP6rBIGZ2BhVRMTdSufKior4AwDNcpLzs=")

  9. print("解密结果:", decrypt_with_hex(c2, h))
复制代码




但是这怎么能体现出我们的强大呢。
继续祭出法宝,它不是xor,那既然99%概率下是rc4

我们用助手试试rc4呢



完美出现结果

至此,我们实现了flutter兵不血刃,直接从内存数据破解算法加密的过程。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

69

主题

2252

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
2745
好评
21
信誉
100

考神MT论坛最佳新人MT论坛帅哥MT论坛活跃会员

发表于 2026-1-13 14:29:46 来自手机  | 显示全部楼层  来自 湖北
学习
回复

使用道具 举报

65

主题

3825

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
2359
好评
12
信誉
100

MT论坛最佳新人考神MT论坛帅哥MT论坛新人MT论坛活跃会员

发表于 2026-1-13 14:35:49 来自手机  | 显示全部楼层  来自 贵州
看看
回复

使用道具 举报

136

主题

4493

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4830
好评
25
信誉
102

MT论坛灌水老大

QQ
发表于 2026-1-13 14:37:11 来自手机  | 显示全部楼层  来自 新疆
看看隐藏
回复

使用道具 举报

5

主题

2100

回帖

7247

积分

硕士生

Rank: 6Rank: 6

金币
2691
好评
16
信誉
100

考神MT论坛最佳新人MT论坛帅哥MT论坛新人

发表于 2026-1-13 14:37:46 来自手机  | 显示全部楼层  来自 河南
看看
回复

使用道具 举报

8

主题

1480

回帖

2901

积分

大学生

Rank: 5Rank: 5

金币
555
好评
1
信誉
100
发表于 2026-1-13 14:40:54 来自手机  | 显示全部楼层  来自 河南
看看分享
回复

使用道具 举报

134

主题

3460

回帖

1万

积分

博士生

无敌最俊朗

Rank: 7Rank: 7Rank: 7

金币
3011
好评
49
信誉
105
发表于 2026-1-13 14:43:55 来自手机  | 显示全部楼层  来自 浙江
看看隐藏
回复

使用道具 举报

26

主题

1059

回帖

5239

积分

硕士生

Rank: 6Rank: 6

金币
434
好评
5
信誉
102
发表于 2026-1-13 14:44:32 来自手机  | 显示全部楼层  来自 广东
看看
回复

使用道具 举报

1

主题

1807

回帖

8913

积分

硕士生

Rank: 6Rank: 6

金币
3815
好评
1
信誉
100
发表于 2026-1-13 14:45:17 来自手机  | 显示全部楼层  来自 广西
路过看看
回复

使用道具 举报

1

主题

943

回帖

2651

积分

大学生

满座

Rank: 5Rank: 5

金币
951
好评
0
信誉
100

考神MT论坛新人MT论坛帅哥

发表于 2026-1-13 14:54:37 来自手机  | 显示全部楼层  来自 广东
看看隐藏
回复

使用道具 举报

87

主题

3214

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1076
好评
22
信誉
105

考神MT论坛最佳新人MT论坛帅哥

发表于 2026-1-13 14:55:27 来自手机  | 显示全部楼层  来自 浙江
看看
回复

使用道具 举报

87

主题

3214

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
1076
好评
22
信誉
105

考神MT论坛最佳新人MT论坛帅哥

发表于 2026-1-13 14:55:56 来自手机  | 显示全部楼层  来自 浙江
可以随便输入手机号登录吗
回复

使用道具 举报

5

主题

386

回帖

1087

积分

高中生

Rank: 4

金币
595
好评
1
信誉
100
发表于 2026-1-13 15:00:22 | 显示全部楼层  来自 江苏
ktwpatch 发表于 2026-1-13 14:55
可以随便输入手机号登录吗

可以随意输入手机号注册
回复

使用道具 举报

3

主题

2812

回帖

1万

积分

博士生

小白一个

Rank: 7Rank: 7Rank: 7

金币
2086
好评
2
信誉
100

MT论坛最佳新人考神

发表于 2026-1-13 15:05:02 来自手机  | 显示全部楼层  来自 湖北
学习一下方法
回复

使用道具 举报

1

主题

1362

回帖

1万

积分

博士生

Rank: 7Rank: 7Rank: 7

金币
4104
好评
7
信誉
100
发表于 2026-1-13 15:07:56 来自手机  | 显示全部楼层  来自 广东
学习一下
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表