前言
最近总感觉时间不够用,很多东西都堆着,答应给朋友看的某app,也没来得及看。所以也就一直没有空发文章,当然我也承诺过,尽量保证文章的质量,所以不能随便水文章,要嘛就不发,要嘛就发质量我觉得过得去的。dGVj{deleteme}aC5lY{deleteme}2hvaW5nLm{deleteme}t1cmls
开始抓包
一开始用charles链接wifi代理去抓包这个app,发现只能抓到一点点无关紧要的包,需要的数据接口是抓不到的:所以以为APP可能设置了no_proxy,使用postern开启VPN,因为VPN抓包的方式可以解决no_proxy的问题,但结果toast提示【null】,以为APP开启了双向验证,逐一去尝试解决,情况跟上面一样,都没有抓到包。尝试hook打印堆栈,突然看到了flutter的字样,才意识到这有可能是用flutter开发的APP。什么是flutter
Flutter是Google使用Dart语言开发的移动应用开发框架,使用一套Dart代码就能快速构建高性能、高保真的iOS和Android应用程序。由于Dart使用Mozilla的NSS库生成并编译自己的Keystore,导致我们就不能通过将代理CA添加到系统CA存储来绕过SSL验证。flutter打包的apk,会把核心逻辑放在so层,且SSL Pining也在Native层,这就导致没法抓包怎么判定app是flutter开发的
把apk包复制一份,后缀改为zip,然后解压,进入lib目录,如果看到有libflutter.so,那就是flutter开发的了,否则则不是反抓包分析
为了解决这个问题,就必须要研究libflutter.so了https://bbs.pediy.com/thread-261941.htm
然后跟着操作了一下,在打开app的包文件,用IDA去打开libflutter.so(注意32位与64位)点ok,等一会儿,找到有【Rx,PC :"ssl_client"】之类的字眼这时候,点ida里的菜单栏,options->General,把这个由0改成4(这个步骤我找了很久,请教了奋飞大佬找到的,ida操作不熟没办法)Number of opcode bytes设置为4然后当前位置往上找,找到有_unwind开头的,停下来,从_unwind开始,拿到字符串前面10个字符(也可以大于10),照这个前10个字符,我尝试好久才知道是要从这个unwind开始拿字符串,而不是在找到ssl_client位置开始拿前10个字符串,上面看雪那个帖子也没说清楚(也可能是我菜,没读懂)。用那几个字符串,加上flutter的hook脚本,配合drony或者postern就可以抓包了(亲测过,postern一样可以抓,配置起来没有drony繁琐):
用frida hook attach模式启动,同时重新刷新页面果然抓到了包,而且app页面也正常显示数据,不好意思打的码有点厚,不过不重要,这种结果就是有数据的意思加密参数逆向
所以,找找这个怎么生成的即可,打开jadx,搜索:
而实际上,第一个里返回的最后也调用了第二个里的,所以实际就是第二个了,写个脚本对它进行hook操作:
相信你发现了,这后续流程跟常规的app逆向没有任何区别,那是因为这个app并不难,如果是那种所有逻辑都在so层,就难搞了,这里的加密逻辑还是在java层,只是一开始的抓包就把部分朋友难住了不废话,继续看,这个看来就是个rsa加密了,当我正要分析的时候,程序意外崩溃了,这个不要紧,估计没有返回正常的值导致的,那行,既然找到就这个位置了
打印堆栈跟下加密逻辑,顺便看到了加密的privateKey:接下来就找传进去的第一个参数了,回到刚才的逻辑,第一个参数是这个,
那这个基本也稳了,不过注意的是,有的url里面的参数里就多了个开始时间,结束时间,和当前时间python代码还原+验证
然后这个接口有的是带了时间的,有时间的加密结果也一样,我就不贴图了python代码,(感谢成都逆向天团里颜值最高的徐少给的代码),我就不自己重写了from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
import base64
import warnings
warnings.filterwarnings("ignore")
def RSA_sign(data, privateKey):
private_keyBytes = base64.b64decode(privateKey)
priKey = RSA.importKey(private_keyBytes)
signer = PKCS1_v1_5.new(priKey,)
hash_obj = SHA256.new(data.encode('utf-8'))
signature = base64.b64encode(signer.sign(hash_obj))
return signature
def main(startTime=None, endTime=None):
data = '/cactus-api/posts/by-tagtagIds%5B%5D=4&orderBy=updatedAt&offset=10&limit=101648403473200'
privateKey = '''自己用jadx打开放到这里吧,太长了,占篇幅'''
res_sign1 = RSA_sign(data, privateKey)
signature = res_sign1.decode('utf8')
print(signature)
if __name__ == '__main__':
startTime = 1648051200 # 有时间的接口这么用
endTime = 1648137599 # 有时间的接口这么用
main(startTime, endTime)
题外话
对了,网洛者爬虫练习平台的站长LeeGene,他读了python的requests源码后自己用golang实现了个requests库:https://github.com/wangluozhe/requests,支持http2.0+ja3指纹修改,经作者自己测试,可以过猿人学内部题22题+29题,赶紧学起来。结语
终于算是对flutter有个大概的逆向操作流程了,其实本次目标并不难,如果是那种很难的就难搞了。这个app其实还有某盾加固,但由于不是一线大厂加固,我直接忽略加固一样操作那遇到那种难的,把大部分的逻辑都直接编译在so层的,怎么办?dart反编译吧,但是反编译的效果不是很好,目前没法通杀,只能多方尝试了参考链接
http://91fans.com.cn/post/fruittwo/
https://github.com/google/boringssl
https://rloura.wordpress.com/2020/12/04/reversing-flutter-for-android-wip/
https://github.com/rscloura/Doldrums
https://bbs.pediy.com/thread-261941.htm
https://mp.weixin.qq.com/s/Ad0v44Bxs1LFy93RT_brYQ
https://tinyhack.com/2021/03/07/reversing-a-flutter-app-by-recompiling-flutter-engine/
https://blog.tst.sh/reverse-engineering-flutter-apps-part-1/
https://blog.tst.sh/reverse-engineering-flutter-apps-part-2/
https://github.com/hellodword/xflutter/blob/main/snapshot-hash.csv
https://raphaeldenipotti.medium.com/bypassing-ssl-pinning-on-android-flutter-apps-with-ghidra-77b6e86b9476
https://github.com/G123N1NJ4/c2hack/blob/0f85a9b0208e9ee05dcbfb4fbcebd1c7babc4047/Mobile/flutter-ssl-bypass.md
https://github.com/ptswarm/reFlutter?msclkid=41b563c4ab7a11ecad34e0a8139bac19
https://github.com/mildsunrise/darter
flutter app的流量监控和逆向库
https://github.com/ptswarm/reFlutter
dart反编译,只能编译2018年前的
https://github.com/hdw09/darter
推荐阅读
Android JNI动态库逆向
JNI与NDK编程(基础到精通)最全总结
Android和iOS逆向分析/安全检测/渗透测试框架(建议收藏)
文章来源: http://mp.weixin.qq.com/s?__biz=Mzg2NzUzNzk1Mw==&mid=2247492329&idx=2&sn=8dbf8e6292d094217e97f2056ae31e4d&chksm=ceb8a7a7f9cf2eb1085c554d939be7abac67f36863bae660ef5c06144e1574cdebad948e690b&mpshare=1&scene=1&srcid=0610urO58GYy3zD7PDd5hQFu&sharer_sharetime=1654799949483&sharer_shareid=205c037363a9188e37dfb6bb4436f95b#rd
如有侵权请联系:admin#unsafe.sh