项目地址:aHR0cHM6Ly93d3cuemhpcGluLmNvbS9qb2JfZGV0YWlsLz9xdWVyeT0lRTklODAlODYlRTUlOTAlOTEmY2l0eT0xMDAwMTAwMDAmaW5kdXN0cnk9JnBvc2l0aW9uPQ==
观前提示:
本文章仅供学习交流,切勿用于非法通途,如有侵犯贵司请及时联系删除
前言
上一篇文章[2020-8-18]boss直聘__zp_stoken__参数分析
分析了__zp_stoken__ 用了哪些环境参数 以及介绍了俩种hook方法
这一篇 我们详细讲另外一种方法以及上一篇没讲到的环境的分析
分析
有一些小伙伴看了上一篇文章后补了环境能算出值却是过不了的
那就要考虑一下是不是eval和Function检测的环境是不是漏了
我们会经常用nodejs来调试js 而nodejs调试器可以显示出使用过的VM
那我们要知道 eval和Function运行的东西都是要在VM里面执行的 那我们只要获取到所有的VM代码不就知道他检测了哪些东西吗?操作起来!
补好部分头之后(确保能算出值) 在尾部打上一个 debugger
然后快捷键 F5 启动调试运行
接着会在debugger断住出现如下图一样的界面
点开
就能看到一堆VM文件了
一个一个点开查看
[process.pid, process.version, process.arch]
这个可以忽略不计
爬 下一个
window.sb = window.history.length;
这个简单 定义个window.history.length就行了
try {window.sb = /\w+:\/\/([^\/:]+)/.exec(top.location.href)[1].replace('www','w');} catch(err){}
可以看到它的代码是很狗的 放在VM里面运行 还顺便带了try 你没发现的话根本不知道也不报错
这个是检测了host 我们只需要定义一个top.location.href就行了
置于href的值 自己去网页中拿即可
typeof document === "object"
这个就是检测了document的类型 要确保网页的运行返回的值和node运行的返回的值是一致的
例如 网页中返回的true 那我们的node也要是true才行
typeof navigator === "object"
和上同
typeof window ["navigator"] ["userAgent"] == "string"
检测window ["navigator"] ["userAgent"]是不是为string类型 如果你没定义 那userAgent就是undefined 而typeof undefined的结果就是"undefined"
那上述的代码就返回的false 所以缺啥补啥 让他和网页返回的值一致即可
typeof setInterval == "function"
检测 setInterval 这个是不是function 我们直接伪造一个空的function即可
(function anonymous( ) { try {return typeof global == "undefined";}catch(e){return false;} })
这里的typeof global网页是返回undefined 而node返回是object 那我们就直接重新定义一个global为undefined就可以了
(function anonymous( ) { try {return this === global;}catch(e){return false;} })
(function anonymous( ) { try { return process["argv"][0]["indexOf"]("node") >0 }catch(e){return false;} })
(function anonymous( ) { try {return typeof module != "object";}catch(e){return false;} })
同上 它检测的就是node和网页中的差别从而判断你是不是node环境
(function anonymous( ) { try { localStorage["setItem"]("localSetxx","1") }catch(e){} })
(function anonymous( ) { try { return localStorage["getItem"]("localSetxx") == "1" }catch(e){return false;} })
这里localStorage的一个set和一个get操作 之前教过你们怎么补了 不懂去翻
typeof child_process === "undefined"
typeof Buffer === "undefined"
好补 直接定义undefined
(function anonymous( ) { try {return window ["window"] ["window"] ["toString"]() === "[object Window]" || window ["window"] ["window"] ["toString"]() === "[object]" }catch(e){ return false; } })
这里启用了套娃模式 但是他要啥我们给啥不就行了嘛
(function anonymous( ) { try { return closed["__proto__"] === ( 1>>3 >4 )["__proto__"] }catch(e){ return false; } })
这里不知道在判断啥 我是直接定义closed然后closed["__proto__"]=(1>>3>4)["__proto__"] 反正结果稳稳返回true 美滋滋
(function anonymous( ) { try { return !document["getElementById"]("ss") }catch(e){ return false; } })
这里是document["getElementById"] 不需要返回结果 反正是取反返回true
所以直接定义一个假的getElementById即可
(function anonymous($qrq, _j$q, n34012, fn ) { $qrq in document?1:_j$q[n34012]=fn() })
不知道在做啥 不管 不报错就行
总的来说呢 就是检测了一些node才有的东西而网页中是没有的从而判断你的运行环境 也不报错 一不小心就入坑了
现在够详细了吧
那有小伙伴就问成功率了
我实测了Python和易语言俩个环境跑数据
Python-仅仅40%的成功率
易语言-接近百分百成功率
一样的环境代码 不一样的结果 啥原因自行测试吧~
[完]