从对抗到出洞:某金融APP 实战渗透与 Frida 反检测绕过(Rpc + Flask + AutoDecoder)
文章介绍如何使用Frida绕过Java检测并分析加密机制。通过编译frida-bridge或ZygiskFrida解决注入问题,并利用jadx和抓包工具解析签名和加密流程。最终提取密钥实现数据还原与重放。 2025-10-16 00:0:0 Author: www.freebuf.com(查看原文) 阅读量:28 收藏

frida 可以正常注入程序,但是一使用Java.use就会闪退

图片

这里编译frida-bridge或者使用ZygiskFrida都可以绕过Java.use检测

编译frida-bridge可以参考这个视频 frida模块化开发,frida-compile,解决frida的java的api检测相关问题,frida-java-bridge调试_哔哩哔哩_bilibili

加载编译好的_agent.js即可绕过检测

图片

图片

ZygiskFrida这里使用的是这个项目

https://github.com/sucsand/sucsand

图片

首先抓到的数据包是这样的,请求体和响应体都是json格式,并且以=作为键。

图片

先上算法助手hook一遍,然后搜索相关的密文字符串,但是并没有找到相关联的hook结果,那大概率加解密都是放在native层,然后看到请求头中有验签的字段X-Emp-Signature,索性直接jadx大法,全局搜索X-Emp-Signature

图片

图片

经过分析定位到initHttpRequest方法,这里签名字段是通过HmacSha1实现的

图片

这里encryptHMAC通过配置决定使用国密 SM3 算法还是传入的算法配置对输入数据和密钥进行 HMAC 运算。

图片

签名的算法搞定后,再去看请求体是如何加密的,一般验证签名都是在数据加密后再去做的,可以通过jadx向上找引用,这里省的看代码直接用frida打印堆栈去看

图片

往上追踪定位到sendResquest方法,sendResquest中通过handleRequestBody函数来处理请求体

图片

继续跟到handleRequestBody,这里直接贴出GPT给出的解释

图片

图片

图片

handleRequestBody处理完请求体之后,会调用sendResquest发送请求,这里再看下sendResquest的逻辑

图片

这里会再对上面handleRequestBody的结果再进行一次Base64编码,然后再拼接成json发送数据包

图片

这样逻辑就比较清晰了

resultByts = HMAC(序列号 || AES(RNC + 请求体))  || 序列号 || AES(RNC + 请求体)result = Base64(resultByts)请求体 = Base64(result)

所以只要能拿到AESCipher.clientKey_和AESCipher.ClientIv_以及ClientHello.ServerHmacKey即可对加密后的数据进行还原并且重放,这里继续往下跟踪AESCipherClientHello代码,发现只是定义了静态变量没有进行赋值。

图片

图片

为了找到clientKey_clientIv_,继续追踪AESAdapter.encrypt方法,发现每次重新打开APP,对应的clientKey_clientIv_都会改变,一开始想的是是不是动态向服务器去请求的clientKey_clientIv_,但是抓包并没有发现类似的请求,事情开始变得有趣了起来。

图片

图片

clientKey_clientIv_既不是通过HTTP请求传输的,又不是硬编码在代码中的,那服务端到底是如何解密的呢?

为了搞清楚clientKey_clientIv_的生成逻辑,继续往上找AESCipher这个类的相关引用,最后发现一个可疑的方法,

图片

这里的关键其实是第一行代码,其余的代码都是在做密钥的分割,然后赋值。

byte[] allSecret = PRFCipher.PRF(ms2, HMac.TLS_MD_CLIENT_SERVER_KEYIVMAC_CONST(), ms2RncRnsSeed, R2.attr.arrowHeadLength);

所以还是得继续往上找引用,看看ms2是如何生成的,定位到handleServerKeyExchange方法,熟悉TLS流程的朋友这里就能看出来,这里的TLS握手流程中的服务器密钥交换 过程非常相似。

图片

继续往上找,定位到handlerServerKeyExchange函数

图片

继续追handleFacilityServerHelloResponse

图片

继续往上追,发现了一个可疑的请求,生成的密钥结果都是从这个请求中提取的。

图片

抓包也同样看到了这个请求

图片

继续向上看定位到ClientHello的构造方法

图片

这里直接贴出GPT给的代码解释

图片

但是由于测试时间有限,按理说这部分代码也是可以通过Python代码去解析响应然后提取clientIvclientKeyserverKeyserverIv的,但转念一想这几个参数都是静态参数,可以直接用frida去获取。

首先用frida+rpc+flask获取clientIvclientKeyserverKeyserverIv,脚本如下

在上文编译好的_agent.js中添加需要发送到Python端的数据。

Java.perform(function () {var ClientHello = Java.use("com.rytong.emp.net.ClientHello");var mClient

文章来源: https://www.freebuf.com/articles/web/452966.html
如有侵权请联系:admin#unsafe.sh