最近在学习android逆向,不足之处欢迎大佬多多指点。
这次分析的是快手极速版1.2.2.8,使用Fiddler抓包发现有2个签名,一个是__nstokensig和sig。
通过jadx-gui搜索字符串找到nstokensig算法,只在java层
这里我就不继续往下跟e.a了,实际上他就是判断编码的操作。通过上面第一层发现,是传递str和str2进行签名,接下来我们hook一下他的传参数据。
通过xposed hook观测得知,str是sig签名结果,str2是kuaishou.api_client_salt,也就是在快手登录之后返回的一个值,这个值后续包是抓不到的。只有登录的时候才有。
得到传参后,我们回到刚刚的第二层,发现他先用 sha-256 计算之后,还调用了d.a(),我们跟进去看即可拿到java层算法,直接抠出来即可。
以下就是扣好的nstokensig签名
// An highlighted block
public String getNsTokenSig(String sig,String token) throws NoSuchAlgorithmException {
String str2 = sig+token;
return new String(b(MessageDigest.getInstance("SHA-256").digest(str2.getBytes())));
}
private static char[] b(byte[] bArr) {
char[] b = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
char[] cArr = b;
int length = bArr.length;
char[] cArr2 = new char[(length << 1)];
int i = 0;
for (int i2 = 0; i2 < length; i2++) {
int i3 = i + 1;
cArr2[i] = cArr[(bArr[i2] & 240) >>> 4];
i = i3 + 1;
cArr2[i3] = cArr[bArr[i2] & 15];
}
return cArr2;
}
sig签名之前看到是在so层,能力有限没有把so层还原成java代码,最终我只能通过unidbg或者xposed直接调用so,那么我们先看看sig签名都传递了什么参数,直接先继续搜索关键字"sig"
CPU.a() 就是计算sig,那么一共3个参数,第一个是Context,第二个是byte[],第三个是int
第一个和第三个都知道具体的结果,我们只需要关心第二个即可,我们发现他是通过合并2个map最后链接成字符串转成byte[],只需要关心a.b()里面干的事情即可。
这个比前面的签名更加简单,就是将map链接道一块儿,然后sort重新排序一下,那么接下来直接xposedhook来得到他传递的参数值。
通过2个map得知,第一个是url的参数,第二个是post的参数,也就是他是将2个参数衔接在了一起,那么这里贴一下map合并的代码。
public byte[] encode(String url,String post){
String[] url_arr = url.substring(url.indexOf("?")+1,url.length()).split("&");
String[] post_arr = post.split("&");
ArrayList arrayList = new ArrayList(url_arr.length+post_arr.length);
for(int i=0;i<url_arr.length;i++){
arrayList.add(url_arr[i]);
}
for(int i=0;i<post_arr.length;i++){
arrayList.add(post_arr[i]);
}
Collections.sort(arrayList);
byte[] data = null;
try {
System.out.println(TextUtils.join("",arrayList));
data = TextUtils.join("",arrayList).getBytes("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return data;
}