一、目标
我们来分析另一个电商App的sign签名算法,先打开一个商品页,抓包结果:
二、步骤
jadx全局搜索 sign
晕倒,7000多个结果,肯定没法玩。 再尝试下 sign=、 "sign"
这次效果不错,只有几十个结果,而且这个很眼熟,点进去看看:
这也太明显了,getSign 函数名都起的这么霸气。
Hook getSign
var DispatchParamBuilderCls = Java.use('anet.channel.strategy.dispatch.DispatchParamBuilder');
DispatchParamBuilderCls.getSign.implementation = function(a,b){
var result = this.getSign(a,b);
console.log(">>> getSign " + result);
return result;
}
结果
>>> getSign a4892b56967b2c11a07be8b01581e05db916d60b
可以了,收工……
Hook内部类
还没完, 我们仔细看一下 getSign函数的参数
public static String getSign(IAmdcSign iAmdcSign, Map<String, String> map)
这个 IAmdcSign 是什么东东?点进去看下:
public interface IAmdcSign {
String getAppkey();
String sign(String str);
boolean useSecurityGuard();
}
它只是一个接口,我们必须要找到这个接口的实现,然后再Hook sign才叫完美。
那就继续搜索 IAmdcSign
这里有个new的操作,双击进去看看
太棒了,这就是 IAmdcSign 的实现类。
不过这里我们犯难了,这个类的类名是什么?总不能是 class anet.channel.SessionCenter.C12541 吧?
我们记住这里的代码行是 142
然后切换到 Smali 代码
啊哈,就是你了,anet/channel/SessionCenter$1
迫不及待的hook之
var signOperCls = Java.use('anet.channel.SessionCenter$1');
signOperCls.sign.implementation = function(a){
var result = this.sign(a);
console.log(a);
console.log(" >>> Sign " + result);
return result;
}
结果就很完美了:
{"carrier":"联通","clientIsp":"100026","code":1000,"cv":0,"dns":[{"aisles":[{"cto":10000,"heartbeat":0,"port":443,"protocol":"https","retry":1,"rto":10000},{"cto":10000,"heartbeat":0,"port":80,"protocol":"http","retry":1,"rto":10000}],"host":"log.mmstat.com","ips":["101.11.251.76"],"strategies":[],"ttl":300,"version":"0"},{"aisles":[],"host":"fourier.xxx.com","ips":[],"strategies":[],"ttl":300},{"aisles":[],"host":"sjarvis.xxxxx.com","ips":[],"strategies":[],"ttl":300}],"ip":"121.129.37.71","uid":"2200620453058","unit":"center"}
>>> Sign 0c52785056833613278c4746fe9cfa2cfae482ee
参数干净,下一步 RPC调用之就很简单了。
三、总结
不要太依赖java的反编译,源码级反编译仅供参考,还是需要有一定的Smali代码阅读能力
参考: Java内部类详解
你左顾右盼做着各种打算,却不知道生活已然过去大半。
关注微信公众号,最新技术干货实时推送