文章总结: 本文详细记录了对一个成人内容APP的逆向分析过程,作者首先通过抓包发现应用使用加密数据传输,然后通过Flutter特性分析确定应用由Flutter开发。作者排除了RSA加密可能性,通过分析Base64解码后的数据特征(长度为16的倍数)确定使用AES加密。使用Blutter工具还原Flutter代码后,作者通过Hook技术定位到加密函数,最终找到了AES加密的密钥和初始向量,成功解密了应用中的通信数据。文章展示了完整的逆向分析流程,包括工具使用、加密算法识别和密钥提取等技术细节。
综合评分: 85
文章分类: 移动安全,逆向分析,二进制安全,应用安全,漏洞分析
记一次对某涩涩的逆向过程
只会看监控的实习生
2025年8月14日 09:10
广东
以下文章来源于听风安全
,作者Saturday
听风安全
.
潜心学安全
#
免责声明
由于传播、利用本公众号听风安全所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号听风安全及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢!
本次目标是个涩涩APP,所以不截图app了 主要学习思路 只做技术交流
data
定位
我们发现很多接口都包含了data,我们这里去找一个简单的接口,比如登录接口
b64编码后的数据,我们再次搜索判断是否是rsa
发现有一些变化,可能是rsa
这种黑灰app基本都是用flutter开发的,我们验证一下
这说明部分或者全部代码用flutter开发;
我们也可以jadx看看
这种app代码基本都会混淆,不过好在没加固
我们试着搜一下
看着鬼样子全是flutter,我们hook一下java层的put方法
没反应
搜一下url尝试
没反应,说明核心代码都在flutter中
接下来用blutter还原
还原后根据算法特性检索
感觉像是RSA加密,因为密文都在变;
搜了还是很多的,不过没有encrypt函数
而且也没看到哪里有公钥私钥
说明可能是其他加密
我们思考一下,常见的可逆加密主要是对称加密和非对称加密
而RSA被我们排除了,接下来去看看是不是AES
我们可以验证一下AES的特征
我们把b64的解开然后对比十六进制数据
最后发现前半部分不变,后面就开始变化了
数一下长度
256
这是16的倍数,很可能是分组加密
常见的分组加密又是对称加密的,很像AES
> AES 是分组加密算法,固定分组大小为 128 比特(16 字节)。无论密钥长度是 128、192 还是 256 比特,分组大小始终是 16 字节。
我们多抓几个包
发现都符合这个16倍数的特点
所以我们去ida中搜AES
这里贴一下flutter开发中AES的常用实现
一般使用的是 encrypt 加密库
支持很多模式,CBC ECB CFB-64 OFB-64 SIC
class AESUtil { static String generateAES(String data, String keyStr, String ivStr) { final plainText = data; final key = Key.fromUtf8(keyStr); final iv = IV.fromUtf8(ivStr); final encrypter = Encrypter(AES(key, mode: AESMode.cbc));// 指定使用CBC模式(AES/CBC/PKCS5PADDING) final encrypted = encrypter.encrypt(plainText, iv: iv); // final encrypter = Encrypter(AES(key, mode: AESMode.cbc)); 默认是AESMode.sic // final encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: null)); // NoPadding print("generateAES:" + encrypted.base64); return encrypted.base64; }}
这里的key是通过AES传的;iv和明文是通过encrypt传的;
所以我们ida中搜索的AES去找encrypt
很明显前面几个比较像,以及靠后的位置有 encrypt
我们hook验证
这个函数确实走了
我们打印一下参数
第一个参数好像是存了AES的加密模式
第二个也差不多
第三个存储了很多信息,其中包含了我们的明文密码
第四个参数啥也没有
我们重新去打印数据,用utf8
我们把明文复制出来
加密的东西还挺多,其中uid(游客信息)和devid以及token和设备信息账号信息都有关,不过多说了;
接下来我们需要找到其key和iv
前面的AES总结中,会在前面实例化key对象
final encrypter = Encrypter(AES(key, mode: AESMode.cbc));// 指定使用CBC模式(AES/CBC/PKCS5PADDING)
这里我们跟栈
这里的(v10-8)就是我们指定的AES模式,v11是我们的明文
这里还是没看见key和iv
我们继续查找交叉引用
这里面就有key和iv了
我们去hook 43765c的
发现第三个也就是v13可能包含了key的信息,这里比较像的就是 qrRCjxruBaInnSFvv 部分了
由于AES的key有一定要求,所以可能是 qrRCjxruBaInnSFv 或者 rRCjxruBaInnSFvv
接下来hook一下iv,走的函数实际上是同一个
所以这里可能是 S58LowsUeDkyX4KT 或者 58LowsUeDkyX4KTv
接下来我们去测试key和iv
和抓包比对,不对,更换key和iv
最后测试发现这样就是正确的了
我们测试一下响应体的data
发现也是同样的key和iv
其他接口估计也可以,我们尝试一下
搜索接口的明文我们可以通过解密拿到
{“type”:1,”page”:1,”keyword”:”111″,”page_size”:20,”devid”:”7f11*****e210b8f”,”invite”:””,”os”:”android”,”timestamp”:1751094678892,”user_invite”:””,”version”:”1.0.0″,”uid”:10***137,”token”:”bdfb4625fe7f016*******784411c4:12216676d04bba6e40bfab4a09111274″}
懂得都懂。。。。
算法还原
低价证书请联系hacker94nb或者扫描以下二维码
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:只会看监控的实习生 《记一次对某涩涩的逆向过程》