一、目标
手机里没啥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还是深受广大码农的喜爱呀。
幸福好像冰激凌,最好不要拿出去晒;否则水不是水,奶不是奶,糖不是糖……
TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。
关注微信公众号 奋飞安全,最新技术干货实时推送