声明
请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。
APP名称:57OW5b+D
去哪里下就不说了,懂的都懂,稍微搜索一下就能找到。
简单查个壳
抓个数据包,看看数据包长啥样
数据包是16进制的,将数据包从hex转成string看能不能还原,显示乱码,估计是加密了。
如果将结果以base64形式显示,这就看着很熟悉了,是不是很像AES、DES之类的加密。其实大多数情况下见到的AES、DES加密结果,都是经过了base64编码的。但这个数据包是十六进制的,推测可能是AES、DES加密后的原始数据。
数据包就先分析到这,接着,将app拖入jadx-gui,看看源代码。
类名都是a、b、c之类的命名,应该是做了混淆。
打开AndroidManifest.xml看一下包名:com.flutter3.xxxx.xd0eeh
有一个flutter关键字,难道这是flutter开发的app?简单科普一下:Flutter框架是由Google推出的一款跨平台移动应用开发框架,使用的是Dart语言,使用该框架开发的app主要代码都在libapp.so和libflutter.so文件中。为了验证猜想,查看一下lib目录中是否存在libapp.so和libflutter.so文件。
这下实锤了,确实是Flutter 框架开发的,将libapp.so和libflutter.so拖入IDA中简单看一下。
函数名都是sub_xxxxxx,没有符号,导出函数也看不出啥来。
Flutter 逆向
目前Flutter逆向工具大概有blutter、reFlutter、Doldrums。Doldrums、reFlutter已经比较老了,blutter是一款新出的Flutter框架逆向工具,目前还在不断更新,不足的是仅支持Android libapp.so(仅限arm64)和最新的Dart版本。
blutter下载地址:https://github.com/worawit/blutter
blutter使用也非常简单,将app lib目录中的arm64-v8a文件夹导出,使用以下命令运行就行了。
python blutter.py ./arm64-v8a ./output
blutter首次运行的时候需要下载一些环境,建议挂上代理。
之后等待程序运行结束,在指定的输出文件夹中就能看到如下文件
asm: 具有符号的libapp.so的汇编代码。
ida_script: IDA脚本,用于还原libapp.so的符号。
blutter_frida.js: 针对目标应用程序的 Frida 脚本模板。
objs.txt: 对象池中 Object 的完整(嵌套)转储。
pp.txt: 对象池中所有 Dart 对象的转储。
使用ida_script中的python脚本还原libapp.so中的符号
将addNames.py代码粘贴过来,点击Run,之后的弹窗都点击OK
脚本运行结束后,符号都已经恢复
以app包名中的flutter3为关键字,搜索一下,以flutter3_frame开头的函数应该就是和app相关的
flutter3_frame$utils$endecode_util_EnDecodeUtil这个类似乎是和加解密相关的,并且这个类下面存在decryptRaw、encryptRaw方法,这不就和前面的猜想对上了吗,加密之后并没有进行base64编码,直接返回了hex类型的原始数据。
进入encryptRaw方法看看
开启一下显示指令地址
encryptRaw方法中调用了dart_convert_Codec__encode_b6f634和dart_typed_data_Uint8List__factory_ctor_fromList_765890方法。
dart:convert包在flutter中用于对JSON、UTF-8进行编解码,Uint8List是一个数据类型,用于存储一组字节数据。
那么这2个方法应该是和编码相关的,hook这2个方法或许可以得到一些有用的信息,因为通常在加密前都会对密钥、IV、数据做一些编码处理。
使用frida注入blutter_frida.js,在APP中触发一下网络请求
得到一个字节数组和字符串,字节数组转换成ASCII后和字符串是一样的。大概率是密钥,验证一下。
信 安 考 证
CISP、PTE、PTS、DSG、IRE、IRS、NISP、PMP、CCSK、CISSP、ISO27001… |
推荐阅读
渗透实战|记一次简单的Docker逃逸+反编译jar接管云主机
原文始发于微信公众号(藏剑安全):【APP安全】flutter逆向某成人APP