🌙安卓逆向实战-某加密算法
2023-12-20
| 2024-7-26
0  |  0 分钟
type
status
slug
tags
category
icon
password
Property
Jul 26, 2024 11:22 AM
date
summary

🤔 前言

最近项目遇到一个有趣的App,通过简单的hook ssl绕过就能正常抓包,但是数据包里面有Sign签名,签名算法又是使用java2c 并且做了混淆,如果想要对数据包修改,就很麻烦并且还涉及到了反Frida。在这个过程中可谓是一波三折,从frida到xposed再最后到frida折来折去,过程还是学到挺多
 

📝过程

签名

首先正常使用基操 xposed 绕过ssl可以正常抓包,发现应用有sign签名算法
notion image
 
尝试直接修改数据包(mobile=10086’),发现因为签名不一致,提示签名校验失败。整理一下思路:应该所有数据包到了后端,应该都会先进行签名校验。如果签名校验不通过则无法修改数据包(越权、注入漏洞都没法正常测试)
notion image
 
尝试逆向分析签名算法,发现签名算法疑似在com.XXXXX.SignUtils类中
notion image
 
发现使用@LDPProtect注解,怀疑是Java2C的一种加密手法,应该是类似下面的这种加密手法。 https://www.imooc.com/article/306075
notion image
 
看见几维安全怀疑应该就是几维加固了,看了几个几维加固的分析文章,一头雾水超纲了……(还是跟着分析尝试了一下无果)
尝试提取so文件查找加密算法sign的具体实现,发现C语言代码做了混淆
notion image
 
逆向/debug 混淆后的C函数比较麻烦,换种思路,使用frida来hook函数,打印签名结果
notion image
 
 
果然不出所料,发现应用存在反frida ,frida被退出了
notion image

xposed

换种hook方式,使用xposed发现lsposed可以正常hook,尝试使用xposed来hook返回值,结果和抓包的一致
notion image
 
 
和上面hook的结果和抓包的一致,代表就是这个函数进行签名计算
notion image
 
曲线救国:sign函数传递进去了ruqest请求包,那么直接hook请求包,然后修改,这样无需逆向算法就可以得到修改后的sign数值了。
编写代码尝试在sign计算前修改request数值
 
在这里代码编写新学了YukiHookAPI的xposed框架,还挺好用强烈推荐
 
  1. 反射抓取request并打印
notion image
 
  1. 构造新的数值
notion image
 
  1. 修改数值
notion image
 
尝试查看数值(reqId、和mobile)被修改成功,没有提示签名签名校验失败
notion image
 

效率太低

虽然使用上面的方式已经可以实现,怎奈效率太低(虽然lspsed已经不用每次重启设备)但是每次修改完代码,需要重新运行等!也是很麻烦,搞起来就是没有frida顺畅也愉快,本来使用frida啪啪啪几秒钟的事情,使用xposed 搞了几个小时才弄好。
 

反反frida

hook检测frida-os

一开始也说过这个应用会检测frida
notion image
 
于是乎在网上寻找办法,尝试打印so 调用堆栈,看看那个so做了frida检测,使用脚本打印so和堆栈
 
notion image
 
根据上方信息, 对应用程序过滤( 就是 fork 子进程)来实现反反调试
 
通过脚本加载成功运行frida
notion image
 

魔改frida

还有一种思路就是运行魔改服务端frida
 
运行魔改 frida
notion image
 
直接运行frida成功,没有被检测
notion image
 

frida

解决完frida运行的问题,那后面hook就方便了,直接尝试hook签名算法,直接创建一个RPC接口
 
加载脚本,尝试rpc调用,可以看到成功调用sign算法
notion image
 
通过python调用
notion image

🤗总结归纳

在这次Android逆向工程中,我的主要挑战是破解应用的签名加密算法。该算法通过Java2C技术实现并加入混淆,增加了逆向分析的难度。此外,应用还部署了反Frida机制。我最终成功绕过这些保护措施。
先用Xposed框架绕过SSL认证,成功抓取数据包,但签名校验使简单修改无效。定位到疑似签名算法的类后,代码混淆和Java2C保护使直接逆向不可能。我尝试用Frida hook函数,但应用能检测到Frida并阻止其运行。
于是我用Xposed hook相关函数,成功在签名计算前修改请求数据,但效率低。分析检测细节后,我成功hook关键函数,并修改Frida服务端,使其在不被检测的情况下运行。
有了可靠运行Frida的能力,我创建了RPC接口来hook签名算法,并通过Python脚本调用,大大提高了效率。
这次经历加深了我对Android逆向工程的理解,提升了对hook技术和反反调试策略的掌握,证明了持续学习和灵活适应的重要性。我希望这次实战能为其他安全研究人员提供帮助,特别是在处理加密算法和反调试措施时。

😋参考文章

 
 
技术分享
  • Pentesting
  • 【漏洞加固】常见Web漏洞修复建议Electron安全初探
    目录