H5app的class不一定是android.webkit.WebView
也可能是腾讯X5内核或者是uc webview
殊途同归也要去hook webview的系统函数和可调式方法setWebContentsDebuggingEnabled。
突破sign算法,输出协议和加密算法的作用是什么?
分析c-sign值
在加密的位置下断点
这里密码没有加密
找到setTimeout函数,用来设置加密的函数
登录后显示的setTimeout延时函数为什么是异步的?
进入函数
什么是极光推送
跟进去,定位到传递手机账号的位置,再跟
得到c-sign
'J{"c_timestamp":1719152459747,
"c_account":"12",
"c_sign":"23052081735759B6B882378F705AB0F7",
"upvs":"2024-06-23-ccssoft"}'
g.e无法跳转的原因?
- 浏览器,或这webview提供的系统函数,无法看源码
- VM文件应该想到函数是java代码,是js调用的java文件(函数)
找到关键代码就是上述浏览器中找到的值
这样就可以在java代码中还原c_sign了
public ModuleResult jsmethod_encryptCcssoft_sync(UZModuleContext uZModuleContext) {
String[] strArr;
JSONObject jSONObject = new JSONObject();
Long valueOf = Long.valueOf(uZModuleContext.optLong("timestamp", new Date().getTime()));
String optString = uZModuleContext.optString("msg", "32025601");
String optString2 = uZModuleContext.optString("upvs", new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + "-ccssoft");
int longValue = (int) (valueOf.longValue() % 2);
String[] strArr2 = {"bx1acuimpzf3k2eluw4ffh7sklmdshhtq0cifotpap2wm8qvd1k6psuokdcfjl04mi7th4q2t7kffmod9qj3huznncbbk4p9w46z6tp7lb282om4q5me7uigi7fl0nbt", "qw6bnqbshxkec2ytag0iqdinmt94hkajkdk9f5oa5dn2nzeosqvp0jfxq2elz6sqal7pcjjvi5rm1mgtnp3ob6bl5iueqjzqienlflaiwb5otzcnvful6kmwij3fcrj4", "enp1ogzjzz15fcd1a4ekwiacxlhwgygqd6mdd5ocnjipjnjcbjpeqtm2t7c92cyhapkomeqrfkdtglwlfipgscbt6lfbxxwmq2fudipm72ld8ygln78bnidw4i9od7ch"};
Arrays.sort(new String[]{optString, String.valueOf(valueOf), strArr2[longValue], optString2});//四个参数:optString(设备ID),时间戳,数组中三个固定值,时间格式化后的参数
String str = "";
for (int i = 0; i < 4; i++) {
str = str + strArr[i];
}
StringBuilder sb = new StringBuilder();
sb.append(str);
sb.append(strArr2[longValue == 0 ? (char) 2 : (char) 1]);
String MD5 = MD5Util.MD5(sb.toString());//第一次MD5
StringBuilder sb2 = new StringBuilder();
sb2.append(MD5);//第二次MD5
sb2.append(strArr2[longValue == 0 ? (char) 2 : (char) 1]);
String upperCase = HashUtil.hash(MD5Util.MD5(sb2.toString())).toUpperCase();//第三次MD5
try {
jSONObject.put("c_timestamp", valueOf);
jSONObject.put("c_account", optString);
jSONObject.put("c_sign", upperCase);
jSONObject.put("upvs", optString2);
} catch (JSONException unused) {
}
return new ModuleResult(jSONObject);
}
法一、抠代码
法二、可以直接使用自吐算法(如果算法是标准算法,代码又在java中,可以直接跑自吐)
'J{"c_timestamp":1719155384875,"c_account":"12","c_sign":"3542F4335AAD34E4EE5B9401558E2B0C","upvs":"2024-06-23-ccssoft"}'
这样就得到三次MD5的输入值。
算法还原
未完待续