瑞数
aHR0cHM6Ly9hcHAuc3V5aW53ZWFsdGguY29tL3N5bGMvcGFnZS9pbmRleC5odG1sI3BhZ2UvMTAvMTkvUDEwMTkuaHRtbD9wcmRDb2RlPUowMjM0Nw==
本文章中所有内容仅供学习交流使用,不用于其他任何目的,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
加密
开始两个debugger都可以使用“一律不在此处暂停过掉”
跟栈,或者搜encrypt都可以找到加密位置
b就是请求数据
k是b生成H_TIME和H_NONCE(随机生成,只有-不变和一个4不变,可以写死)之后的请求参数,用于加密
e是一个随机生成的16位uuid(可以写死),用于后续的aes加密的key
4
进去就可以看到是个md5,rsa,aes的混合加密,都没有魔改可以直接使用加密库进行加密即可
解密
解密入口
进去就是一个原生的aes解密
上面一堆对返回的加密数据做处理,然后做aes解密,iv,mode,padding都在里面
cookie
后面只剩下最后一个cookie上的
上面那个是服务器端返回的,下面那个是js生成的
hook一下cookie就可以看到,FSSBBIl1UgzbN7NP的设置位置
跟栈找到vm的生成位置,这个d.的文件是一直不变的,vm里面的是一直会变,而且_$eN不能写死
后面就是把这个d.开头的文件扣下来补环境即可,运行会发现报错找不到$_ts,搜索即可,可以看到生成位置在index.html中的一个script标签中,拿下来补上去就可以正常运行了,剩下的就是补环境了,缺啥补啥,没有检测Error和原型链,也没有检测toString,最后补出来的长度为235位就能过(在浏览器代码块中运行的也是235位),192位过不了。
// 几个检测点
ActiveXObject = undefined
window.name
window.top = window;
window.self = window;
HTMLCollection_script = [script, script]
HTMLCollection_script.getAttribute = function getAttribute(tagName) {
debugger
}
HTMLCollection_meta = [meta]
HTMLCollection_meta.getAttribute = function getAttribute(tagName) {
debugger
}
// document中注意一下getElementsByTagName这个方法不能直接返回一个标签对象,要返回HTMLCollection类数组对象,后续调用是通过数组下标调用的
document = {
'getElementsByTagName': function getElementsByTagName(tagName) {
debugger;
if (tagName === "script"){
return HTMLCollection_script
}
if (tagName === "meta") {
return HTMLCollection_meta
}
if (tagName === "base") {
return HTMLCollection_base
}
},
"visibilityState": "visible",
}
插桩位置if以及打印日志的变量_$g4
发包
先发index.html拿到meta中的content属性值,在拿到_$ts那段script标签里的内容替换到,补好的js中
替换位置:content属性值替换content_xyz, script标签里的内容替换xyz_ts
content = "content_xyz"
meta = {
"getAttribute": function getAttribute(attr){
debugger;
if (attr == "r"){
return "m"
}
if (attr == "content") {
return content
}
},
"parentNode": head,
"content": content
}
// 补的环境
...
xyz_ts
// d.开头的那个js代码
...
再发需要请求的包即可,需要使用session发送