声明
本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负,如有侵权,请联系作者立即删除!由于本人水平有限,如有理解或者描述不准确的地方,还望各位大佬指教!!
抓包分析
今天我们要分析的app是某x瓣,版本号7.26.0。
准备工具:抓包工具fiddler,一台真机或者模拟器,jadx反编译工具。
第一步进行抓包分析。通过抓包发现_sig是加密的,而这个_sig应该经过base64编码。
其他参数udid应该是用户id为固定值,apikey,device_id和apple应该是当前设备参数信息可以直接固定。
反编译apk
找到加密参数_sig,接下来就是反编译apk。我们使用jadx对apk进行反编译。直接通过搜索"_sig"关键字,定位到加密代码处,如下图。
找到包含_sig的代码不是很多,我们可以一个一个的看,这里根据选择题定律选择最长的(学渣专用方法),点进去可以看到"_sig"参数是a4.first的方法返回的,具体是干嘛的不知道,不过不要紧,继续跟进发现a4是Pair<String, String>a4 = TopicApi.a(request);这个方法声明实例化的一个对象。
然后点进去看看TopicApi.a这个方法具体是怎么实现的。
可以看到TopicApi.a这个方法调用了d方法,我们继续跟进到d方法里,可以看到这个d方法就是加密的地方。
我们使用动静态结合分析。首先静态分析一下java代码,一会在用frida动态分析验证我们的猜想。
分析加密逻辑
首先看到d方法传入了三个参数str,str2和str3,然后定义了一个变量decode,具体是干嘛的还不知道,然后定义了一个str5,往后看可以知道这是一个AES加密的密钥key。接下来是对g进行一系列的添加。
-
把str2添加进g。
-
定义一个encodedPath,后面通过frida动态分析知道这个是请求url的path,同时还把url的path给url编码了。然后把AMPERSAND,跟进发现是一个"&"符号,最后把&符号添加进g。
-
把编码后的path添加进g。
-
把&符号添加进g。
-
把10位的时间戳currentTimeMillis添加进g。
最后把g.toString后赋值给sb。最后调用HMAC_SHA1对str5和sb进行加密,最最后对加密后的结果进行base64编码。
静态分析的差不多了,接下来用我们的frida动态调试一下,看看实际的效果是什么样子的。
frida动态分析
编写frida-hook脚本。
function main(){
Java.perform(function(){
Java.use("com.douban.frodo.fangorns.topic.TopicApi").d.overload('java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function(arg1, arg2, arg3){
console.log("arg1===>", arg1);
console.log("arg2===>", arg2);
console.log("arg3===>", arg3);
var result = this.d(arg1, arg2, arg3);
console.log("result===>", result);
return result;
}
var hmacsha1 = Java.use("com.douban.live.internal.LiveHelper");
hmacsha1.hmacSHA1.implementation = function(cs1, cs2){
console.log("str1:", +cs1);
console.log("str2:", +cs2);
var result = this.hmacSHA1(cs1, cs2);
console.log("result:", +result);
return result;
}
})
}
setImmediate(main)
/*
function main(){
// 目的:hook 类名:xxxxxxxx 下的 kkkk 方法
Java.perform(function(){
var utils = Java.use("待填写的类名");
utils.待填写的方法名.implementation = function(key){
待编写的逻辑
}
})
}
setImmediate(hook_java)
*/
开始hook。在cmd窗口输入frida -UF -l hook.js,就能开始hook。如图就是打印出hook的内容。
可以看的出来str1就是上面所说的str5密钥key,而str2就是进行了一系列添加操作的sb。总结一下就是GET+请求url的path+时间戳和str5作为hmac-sha1加密的参数,再然后经过base64编码,就得到最终的加密参数_sig。到这一步frida动态分析基本结束。接下来就是利用python实现加密和获取数据。
最近某x瓣sig加密改变了,加了盐,但流程没有发生变化,重新跟的过程中忘记截图了,就懒得在跟了我直接给出加密代码了。
def encrypt(url, ts):
path = (urlparse(url).path).replace('/', '%2F')
req_url = f"GET&{path}&dd1f5ec25efa2c5b975e1c471cee8511&{ts}"
key = "bf7dddc7c9cfe6f7"
hmac_code = hmac.new(key.encode(), req_url.encode(), sha1).digest()
return base64.b64encode(hmac_code).decode()
总结:frida-hook函数方法,确定类名,确定方法名,然后传参个数,然后按如下格式填写即可hook;setImmediate用于执行给定的function,当从控制台进行hook时会调用相关的function
各位大佬觉得本文写的不错的话,可以一键四连哦。