# boss网js破解 **Repository Path**: asoule/js_cracking_of_boss ## Basic Information - **Project Name**: boss网js破解 - **Description**: 本仓库实现boss直聘网js的破解,项目在进行中... - **Primary Language**: JavaScript - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-12-28 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # boss网js破解 #### 介绍 闲来无事,研究一下boss网爬虫策略,能不能成功还说不准... 首先,boss网请求得了解了解。谷歌浏览器F12网络监听,顺带把Preserve log勾上。让我们打开网页https://www.zhipin.com/c101230200-p100901/ ![](./001.png) 我们看到如图中编号一样的请求顺序,当我们对```https://www.zhipin.com/c101230200-p100901/```请求的时候,首先会302重定向到编号2的链接上,我们看下截图 ![](./002.png) 该链接有多个参数,`seed`、`ts`、`name`三个参数到后面有用,我们接下来看下编号2链接网页部分源码: ```javascript (function() { var script = document.createElement("script"); script.src = "https://static.zhipin.com/library/js/analytics/ka.js"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(script, s); })(); ``` ```javascript if (seed && ts && fileName) { seriesLoadScripts("https://www.zhipin.com/web/common/security-js/" + fileName + ".js", function() { var expiredate = new Date().getTime() + 32 * 60 * 60 * 1000 * 2; var code = ""; var nativeParams = {}; var ABC = window.ABC || frame.contentWindow.ABC; debugger; try { code = new ABC().z(seed, parseInt(ts)+(480+new Date().getTimezoneOffset())*60*1000); } catch (e) {} if (code && callbackUrl) { Cookie.set("__zp_stoken__", code, expiredate, COOKIE_DOMAIN, "/"); ``` 源码中分别加载了`ka.js`和以`name`命名的js文件,也就是第一张图片中编号3、4的请求。 最后,编号5的请求成功了,其携带了5个cookie值,看图: ![](./003.png) 这是所有的请求过程。 很显然,我们发现,我们向`https://www.zhipin.com/c101230200-p100901/`发送请求,若未携带cookie或者cookie值不正确时,都会跳转到`https://www.zhipin.com/web/common/security-check.html`这个链接上,然后这个连接中中js文件会生成cookie值,最后再携带cookie重新请求,就可以访问成功了。 那么,问题的关键在于cookie值是如何生成的, - 经过js研究发现,五个cookie值中前4个值均由`ka.js`生成,且算法简单、很容易破解。 - 关键性参数在于`__zp_stoken__`,由`name`命名的js文件生成的。该js文件采用混淆加密,很蛋疼,看的掉头发。 在上面的部分源码展示中,显示了函数入口`code = new ABC().z(seed, parseInt(ts)+(480+new Date().getTimezoneOffset())*60*1000);`,传入了`seed`、`ts`两个参数。 在name.js文件中,有许多dom操作,我手动添加了部分对象,如下: ```javascript var window = { "navigator": { "userAgent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36", "webdriver" : undefined, "appVersion": "5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" }, "screen": { "availHeight": 864, "availLeft": 0, "availTop": 0, "availWidth": 1536, "colorDepth": 24, "height": 864, "pixelDepth": 24, "width": 1536 }, "callPhantom": undefined, "_phantom": undefined, "outerWidth": 1536, "outerHeight": 864, "innerWidth": 0, "innerHeight": 0, "moveBy": function () { return undefined; }, "moveTo": function() { return "" }, "open": function(){ return ""; }, "dispatchEvent": function (e) { return null; } }; var document = { "getElementById": function (str) { return "I do not know what has been returned"; }, "title": "", "createElement": function (flag) { return "<"+flag+">"; } }; var top = { "location": { "href": "https://www.zhipin.com/web/common/security-check.html" } }; ``` 添加上浏览器对象后,js就可以本地运行了,可惜与浏览器还是有点不同,不知道哪里忽略了,还在研究中...