高中生

- 金币
- 595
- 好评
- 1
- 信誉
- 100
|
本帖最后由 braintrust2003 于 2026-1-13 17:29 编辑
本次案例不是破解会员,也不是破解卡密内购。
仅是一个requests body和 response 加密算法的还原记录。
本次我们同样采用内存取证方法,再次利用到我们上一篇文章中提到的法宝。
本次案例同样来自客户需求。先上apk图
好消息是未加固
坏消息是竟然是flutter应用
不知道从何时起,flutter应用开始满天飞了。
搞逆向的应该知道flutter应用,都是千元起步,难度是有目共睹。
但是我今天要讲的依然是我们内存数据取证的应用。
所以,到此我们基本上就不分析apk了。
重点讲解我们的内存数据
不管怎么样,先抓包吧
我们今天分析的重点是这个请求的body体(返回数据也是一样的)
抓包结果
我们继续祭出我们的手机法宝,把手机内存dump下来查找关键词
并搜索我们的关键词
这里我们的关键词就搜索我们登录时候的密码123456好了
这是一个好现象啊,一眼就知道这是我们的登录时候的数据包构成啊
复制出来
查看字节数 ,对比密文base64解密后的字节数
惊奇的一致!
我们继续分析
那么事情就简单了。密文和明文字节数一致的算法有哪些?
xor,rc4算是我们最常见的了。
很简单,我们改密码后看看数据包情况。
我们发现改密码后改几个数字,那么密文就有几个变化。
所以,第一反应就是xor了。写个代码解析下密钥
- import base64
- def get_keystream(plain_str, cipher_b64):
- plain = plain_str.encode('utf-8')
- cipher = base64.b64decode(cipher_b64)
- # 提取密钥流
- length = min(len(plain), len(cipher))
- return bytes([plain[i] ^ cipher[i] for i in range(length)])
复制代码
输入密文和明文后,得到密钥流
- eabfac1c4696969c11352ada86d976307d4712f26d210d16a0344b7bc2f50fe8e9b3d4a9f8f43a89d32d7cf9e4e176606fb1dc0ec7daecef5469f5131f461fefce27f06c2f0e500e5c427cde96455464306e6d30de08d1e9a352bee4f609f8723f692abcda5d3757e848288b98d3772eeb7f1ab1c6042d5ef9a117ecf2e4df08f6749b240ada70ebca3c8418f97fde67bebb456aee086586859c0ffcaeeb09ca80d7092b945ced8e0e9d34e634352bc7bf472ae28fb0498680696182c9ef808f15a9807e2e785e51f854faf79212d3677a2d441f35cebb5f07f7f0a86b0b9e02b816eacbc2207b931f7ec6bde637d760bfce27adef9ea7a05875a6e057fa034f41d528db0738c8d3229e37b86aaaa7a46a00906cb8b5aadf9254ecec045edd2d0ad25a0aaedd4fdcad88586ca51683f0d092a7c5062ca06b832c3ace61cf42f9888ebb06ef6b7ab5dcc3d39d4a113249003e17a286457e83819c919c1253fd9e5fb5190e732b70dc11f973b1076bcc17b4616c45249254bb1480a40260c77e4b1c3b555bbc7c2bafe59fa341a79d3282922a064d8b620f9e26947f4259c86930bed5e3dca2c25e91ddab643da0dd70eb515114fd7e2695d4deb868a3776dc06d27201b6194ffc07c817ead76dda4329820745f2a2b1de9a6e25852fcf75f21680cca3c48a350e9dd3d2b15ea90a67da047ec11fcbfc7da97a4380fac13a18a697a35ee8cfc67c61e7ca51718afbfafd414436ac6427d84cba5......次数省略1万字
复制代码
可以看出来,没有任何重复,所以它不可能是xor。
那么它应该就是rc4了
至此,其实我们已经完成任务了,所有的请求和返回我们都能解密和加密了。
- h = "xxxxxxxxxxx" //把上面密钥流填写进来
- def decrypt_with_hex(cipher_b64, keyHex):
- keystream = bytes.fromhex(keyHex)
- cipher = base64.b64decode(cipher_b64)
- length = min(len(cipher), len(keystream))
- decrypted = bytes([cipher[i] ^ keystream[i] for i in range(length)])
- return decrypted.decode('utf-8', errors='ignore')
- c2 = ("kZ3IfTL3tKYzFwb49awVUxg0YdBXVX9jxRhpFqeGfImO1vaT2qdP6rBIGZ2BhVRMTdSufKior4AwDNcpLzs=")
- print("解密结果:", decrypt_with_hex(c2, h))
复制代码
但是这怎么能体现出我们的强大呢。
继续祭出法宝,它不是xor,那既然99%概率下是rc4
我们用助手试试rc4呢
完美出现结果
至此,我们实现了flutter兵不血刃,直接从内存数据破解算法加密的过程。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|