我是如何用Hrida自动生成签名的

这应该是最后一次写用frida来hook安卓的东西了 = = 当然,最主要的目的还是为这个小脚本打个广告。

这次的小玩意叫Hrida,思路来自于BridaHrida可以看作是frida的http接口,可以通过http请求获取在frida脚本中导出函数的执行结果。

Hrida的用法见Github页面

在检测一个APK的时候,发现一些关键请求带了签名,找来找去没有找到签名算法所在的问题,只找到了调用签名函数在java层的接口。这个接口的参数是一些自定义类型的类。目标是随意调用签名函数为自己的请求进行签名。

最开始以为frida只是一个hook工具,只能在apk里某些函数被调用的时候触发,后来想到了Brida,翻了翻源码和文档,发现frida提供了rpc的接口。通过这些接口可以方便的导出一些函数,供外部调用,而且是任意时候都能调用。在这些函数内部我们可以使用任意Java类,实例化我们想要的对象,调用特定的方法。

我们为了调用签名函数,首先需要实例化对应的类和参数。对于自定义的类,实例化的时候可能需要一层一层向前追溯。
我尝试过先用hook的方式来保存一个目标类的对象的引用,然后在导出函数里使用,实践下来发现frida报了上下文环境的异常。于是只能老老实实自己构造了。

样例代码如下所示,导出了一个叫sign的函数,参数是data,其中参数以json中数组的形式传递。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// rpc.js
var result = null
rpc.exports = {
sign: function(data){
Java.perform(function (data) {
try{
Hrida = Java.use('me.5alt.hrida')
hrida = Hrida.$new();
result = hrida.sign(data).toString()
console.log(result)
}catch(e){
console.log(e)
}
});
return result
}
}

Hrida载入:python hrida.py -a me.5alt rpc.js

用python调用这个接口

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests
import json
from urllib import quote
url = "http://127.0.0.1:8800/call"
method = 'sign'
args = ["md5_salt"]
payload = {
'method': method,
'args': quote(json.dumps(args))
}
print requests.post(url, data=payload).text

为了方便调用,可以在本地装一个安卓虚拟机,启动Hrida,用autossh将本地监听的端口反弹到远程vps上,这样就能在公网愉快的使用了。

参考资料

https://github.com/5alt/hrida

http://arondight.me/2016/02/17/%E4%BD%BF%E7%94%A8SSH%E5%8F%8D%E5%90%91%E9%9A%A7%E9%81%93%E8%BF%9B%E8%A1%8C%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/

分享到 评论