先把justtrusmeplus打开设置好95分,开始抓包,得到结果为:
https://www.95fenapp.com/api_goods/list/v3.0?is_all=1&keywords=%E7%A7%91%E6%AF%94&
page=1&page_size=20
&publish_timestamp=0
&scene=2&scene_type=95fen_android_search_personal&sn=SearchList&
spm=L93782f7a5fd50e7a
×tamp=1615455175519
&token=5a3b08f18dd751bd6321e669962460dc
可知加密参数为token,然后进行jadx搜索,不管是token= “token 都没有搜索到,换个方式搜索api_goods/list/v3.0 发现在一个地方进行调用了,但是用了一天时间,不管是进行这个地方的HOOK还是上下文看项目,一直没有发现真实的token生成的地方,即使这个地方确实是调用了,也经过了(反思:在这里的调用函数分析中,观察到是在服务中直接发送了请求,请求的参数中已经包含了token,在这里无法再分析到细节)
然后再换一下思路,既然能抓包抓得到,那就开始objection来看看okhttp 随后进行okhttp的hook
发现确实也走了这个,于是再进一步,进行okhttp3.Request.url方法的hook,发现搜索token出现以下结果
说明这个命名,起码是跟token有关,继续进行这个类的hook
这里有几个方法,也确实被调用了,所以打开项目进行f.v.a.g.g.a的搜索
在这里先进行intercept方法的hook是不成功的,这个是拦截器,于是再换成对其他方法的hook:
RposedBridge.hookAllMethods(
RposedHelpers.findClass("f.v.a.g.g.a", lpparam.classLoader),
"d", new RC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
Log.i(tag,"参数1===>"+JSONObject.toJSONString(ForceFiledViewer.toView(param.args)));
// Log.i(tag,"参数2===>"+JSONObject.toJSONString(ForceFiledViewer.toView(param.args[1])));
Log.i(tag, "结果====> " + JSONObject.toJSONString(ForceFiledViewer.toView(param.getResult())), new Throwable());
}
}
);
换成hook这个HTTPURL 观察入参出参就发现了疑似地点:
还有a方法的hook:
可以确定token 就是a方法生成的,然后需要确定的就是入参,直接使用当前的URL 是错的
所以需要 HOOKa方法,同时抓包,通过Charles的抓包参数进行搜索,发现以下打印结果:
["xgcpyh666",{"is_all":"1","keywords":"耳机","page":"1","page_size":"20","publish_timestamp":"0","scene":"2","scene_type":"95fen_android_search_personal","sn":"SearchList","spm":"L2c5037dd43542aa8","timestamp":"1615882480695”}]
结果====> “048f430296442f4d92eac06ad91f1139"
在postman中进行验证,确实有效可以获取参数,这时,我们只需要搞清楚spm的生成就行了,是可以重复使用还是关联传参生成的
直接用js_frIda的加密Hook,可以定位到关键位置,但是不是每一个APP都是这样
比如贝壳找房,直接用加密的HOOK找不到,是通过关键字搜索定位到相关位置,找到关键点进行rpc
所以通用套路是搜索+加密定位 如果都不好使才使用调用栈分析
小红书就是搜不到shiled,因为加密和请求全部放在so里面,导致没有合适的RPC点