记录某书中的包内容签名值
随便抓了个请求包显示如下:发现在Header头中多了几个auth参数,后面像是md5,反编译看下具体是怎么计算的
jadx搜索X-Auth,很好找到
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函数
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 = hexDigits[(b >> 4) & 15];
k = i + 1;
str = hexDigits;
}
return new String(str);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "";
} catch (UnsupportedEncodingException ue) {
ue.printStackTrace();
return "";
}
}
很简单的md5,那就关注一下f()函数,
sAppSecurityKey = Safejni.encryptAppKey();
发现f函数的作用就是返回一个encryptAppKey,跟进后发现最终调用了个native函数,ida载入后找到对应函数
f5后发现函数反汇编是不正常的
空格来到流程图模式下,点击remove funtion tail --> force BL call后效果如下
再次f5后即正常显示了
可以看到这里就是简单的字符串复制和拼接,最后返回的就是18ce9f021f1840fb93108ed2a899fb3a
第二个auth参数是根据用户当前token来的,没什么好分析的了
总结:
不太懂他起名为safe-jni的原因是什么 本帖最后由 淡然出尘 于 2017-1-18 10:56 编辑
世事繁华皆成空 发表于 2017-1-18 10:46
万一我用了反射呢
用反射得需要传进去对象吧
虽然可以直接获取CurrentApplication,这种情况还是比较少的 收藏参考了
厉害了我的哥,十分崇拜 傻..
看下 JSMainApplication.f() 函数的结构,
Native层没有传参,返回一个String,
显而易燃,一定是固定的,不用分析SO,直接打印就好 淡然出尘 发表于 2017-1-18 10:31
傻..
看下 JSMainApplication.f() 函数的结构,
Native层没有传参,返回一个String,
{:301_977:}万一我用了反射呢 淡然出尘 发表于 2017-1-18 10:55
用反射得需要传进去对象吧
虽然可以直接获取CurrentApplication,这种情况还是比较少的
擦 膜拜淡然大神啊 过来膜拜,最后的总结亮了
{:17_1060:}
吃瓜群众坐看两位大神切磋