一、目标
手机里没啥App了,连头条都没装,没办法只能看看足球资讯了。
二、步骤
Jadx下 "sign"
很明显就是这个
public static final String KEY_SIGN = "sign";
继续Jadx KEY_SIGN
一共50多个结果。
不怕,怎么说咱以前的ID 叫 愚公
一个一个翻呗……
Base64
翻起来还是挺累的。我们观察下 sign 字段里面有两个比较明显的特征
- 字段里大量含有 + / 这两个字符串
- 字段末尾是 == or =
啥也别说了,搞Base64
// Base64
var Base64Class = Java.use("android.util.Base64");
Base64Class.encodeToString.overload("[B", "int").implementation = function(a,b){
var rc = this.encodeToString(a,b);
return rc;
}
很好,逮住了我们要的签名,那就放大招了。
// Base64
var Base64Class = Java.use("android.util.Base64");
Base64Class.encodeToString.overload("[B", "int").implementation = function(a,b){
var rc = this.encodeToString(a,b);
if(rc.toString().length < 50){
console.log(">>> Base64 " + rc);
var stack = threadinstance.currentThread().getStackTrace();
console.log("Rc Full call stack:" + Where(stack));
}
return rc;
}
通过我们仔细观察(反正我是掰着手指头数了),这个签名字串的长度大概40多。所以我们过滤一下再打印出堆栈信息。
>>> Base64 WTLS2zZdf2xIDqN5FNq4Q70esCTP+FQ0iahVvCC4JK4=
Rc Full call stack:dalvik.system.VMStack.getThreadStackTrace(Native Method)
java.lang.Thread.getStackTrace(Thread.java:1720)
android.util.Base64.encodeToString(Native Method)
com.donxxiudi.core.http.g.a(HttpSignUtil.java:126)
com.donxxiudi.core.http.g.a(HttpSignUtil.java:83)
com.donxxiudi.core.http.h$9.intercept(HttpTools.java:389)
okhttp3.internal.c.g.a(RealInterceptorChain.java:147)
okhttp3.internal.c.g.proceed(RealInterceptorChain.java:121)
okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:250)
okhttp3.RealCall$AsyncCall.execute(RealCall.java:201)
okhttp3.internal.c.run(NamedRunnable.java:32)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
java.lang.Thread.run(Thread.java:919)
木有悬念了,Hook这个 com.donxxiudi.core.http.g.a 吧
var signCls = Java.use("com.donxxiudi.core.http.g");
signCls.a.overload('java.lang.String', 'java.lang.String', 'java.lang.String', 'java.lang.String', 'java.lang.String').implementation = function(a1,a2,a3,a4,a5){
var rc = this.a(a1,a2,a3,a4,a5);
console.log(a1 + "," + a2 + "," + a3 + "," +a4 + "," + a5 );
console.log(">>> rc= " + rc);
return rc;
}
结果很清晰了
/v3/useract/app/search/getIndex,@ztxbDpXvtfDYLOXaEO2cV+g6oP34ClXCbes2fElXSWgBB9DupGYfJnxo5ZjxUXZP,donxxiudi.com,donxxiudi.com,1619429693
>>> rc= 5MPoQLRoTuKU8loJ9vBxg75AFoe8JuOUAyW1oergEdI=
三、总结
搜了一下,这都是第三篇靠Base64定位的教程了,看来Base64还是深受广大码农的喜爱呀。
幸福好像冰激凌,最好不要拿出去晒;否则水不是水,奶不是奶,糖不是糖……
关注微信公众号,最新技术干货实时推送