随便抓了个请求包显示如下:
发现在Header头中多了几个auth参数,后面像是md5,反编译看下具体是怎么计算的
jadx搜索X-Auth,很好找到
[Java] 纯文本查看 复制代码 String timestamp = (System.currentTimeMillis() / 1000) + "";
aa modifiedResponse = chain.a(request.e().a(url).a(headers).a("X-Timestamp", timestamp).a("X-Auth-1", ao.a(JSMainApplication.f() + timestamp)).a("X-AUTH-2", ao.a(userRB.mobile_token + (System.currentTimeMillis() / 1000))).a());
if (modifiedResponse.d()) {
return modifiedResponse;
}
a(errorMessage);
可以看到第一个auth参数是根据f()函数的值和当前时间戳(此处/1000,所以单位为秒),最后进行了a函数的调用,首先看下a函数
[Java] 纯文本查看 复制代码 public static String a(String s) {
char[] hexDigits = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
try {
byte[] strTemp = s.getBytes("UTF-8");
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
char[] str = new char[(j * 2)];
int k = 0;
for (byte b : mdTemp.digest()) {
int i = k + 1;
str[k] = hexDigits[(b >> 4) & 15];
k = i + 1;
str[i] = hexDigits[b & 15];
}
return new String(str);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "";
} catch (UnsupportedEncodingException ue) {
ue.printStackTrace();
return "";
}
}
很简单的md5,那就关注一下f()函数,
[Java] 纯文本查看 复制代码 sAppSecurityKey = Safejni.encryptAppKey();
发现f函数的作用就是返回一个encryptAppKey,跟进后发现最终调用了个native函数,IDA载入后找到对应函数
f5后发现函数反汇编是不正常的
空格来到流程图模式下,点击remove funtion tail --> force BL call后效果如下
再次f5后即正常显示了
可以看到这里就是简单的字符串复制和拼接,最后返回的就是18ce9f021f1840fb93108ed2a899fb3a
第二个auth参数是根据用户当前token来的,没什么好分析的了
总结:
不太懂他起名为safe-jni的原因是什么 |