一、目标
我们来分析另一个电商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代码阅读能力
你左顾右盼做着各种打算,却不知道生活已然过去大半。
TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系。
关注微信公众号 奋飞安全 ,最新技术干货实时推送