![](https://s2.loli.net/2022/03/10/8jxX4wDZiR5HfuP.png)
> 关注微信公众号:K哥爬虫,持续分享爬虫进阶、JS/安卓逆向等技术干货!
## 声明
**本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请在公众号联系我立即删除!**
## 逆向目标
本次的目标是拉勾网职位的爬取,涉及到的一些关键参数如下:
- 请求头参数:`traceparent`、`X-K-HEADER`、`X-S-HEADER`、`X-SS-REQ-HEADER`、`x-anit-forge-code`、`x-anit-forge-token`
- Cookie 值:`user_trace_token`、`X_HTTP_TOKEN`、`__lg_stoken__`
- POST 请求数据加密,返回的加密职位信息解密,AES 算法
参数比较多,但事实上有些参数固定、或者直接不要,也是可以的,比如 Cookie 的三个值,请求头的 `X-K-HEADER`、`X-SS-REQ-HEADER` 等可以固定,`x-anit-forge-code` 和 `x-anit-forge-token` 可有可无。尽管如此,本文还是把每个参数的来源都分析了,可根据你实际情况灵活处理。
另外即便是把所有参数都补齐了,拉勾网对于单个 IP 还有频率限制,抓不了几次就要求登录,可自行搭配代理进行抓取,或者复制账号登录后的 cookies 到代码里,可以解除限制,如果是账号登录后访问,请求头多了两个参数,即 `x-anit-forge-code` 和 `x-anit-forge-token`,经过测试这两个参数其实不要也行。
## 抓包分析
搜索职位,点击翻页,就可以看到一条名为 positionAjax.json 的 Ajax 请求,不难判断这就是返回的职位信息。重点参数已在图中框出来了。
未登录,正常 IP,正常请求,Header 以及 Cookies:
![01](https://s2.loli.net/2022/03/11/GaPimQHcRtrT2vU.png)
![02](https://s2.loli.net/2022/03/11/6tQZkKhyaA3Oxib.png)
异常 IP,登录账号后再请求,Header 以及 Cookies:
![03](https://s2.loli.net/2022/03/11/62TGAend9tIwlyR.png)
![04](https://s2.loli.net/2022/03/11/dMiBewkrJhWH1oO.png)
请求数据和返回数据都经过了加密:
![05](https://s2.loli.net/2022/03/11/dBTqpkLZ4aPfVGm.png)
## Cookies 参数
先看 cookies 里的关键参数,主要是 `user_trace_token`、`X_HTTP_TOKEN` 和 `__lg_stoken__`。
### user_trace_token
通过接口返回的,直接搜索就可以找到,如下图所示:
![06](https://s2.loli.net/2022/03/11/KwAmUhj36D4YynJ.png)
![07](https://s2.loli.net/2022/03/11/65rhLCtSAjcwTbe.png)
请求参数,time 是时间戳,a 值随便,没有都可以,不影响,其他值都是定值,获取的关键代码如下:
```python
def get_user_trace_token() -> str:
# 获取 cookie 中的 user_trace_token
json_url = "https://a.脱敏处理.com/json"
headers = {
"Host": "a.脱敏处理.com",
"Referer": "https://www.脱敏处理.com/",
"User-Agent": UA
}
params = {
"lt": "trackshow",
"t": "ad",
"v": 0,
"dl": "https://www.脱敏处理.com/",
"dr": "https://www.脱敏处理.com",
"time": str(int(time.time() * 1000))
}
response = requests.get(url=json_url, headers=headers, params=params)
user_trace_token = response.cookies.get_dict()["user_trace_token"]
return user_trace_token
```
### X_HTTP_TOKEN
直接搜索没有值,直接上 Hook 大法,小白朋友不清楚的话可以看 K 哥以前的文章,都有详细教程,这里不再细说。
```javascript
(function () {
'use strict';
var cookieTemp = "";
Object.defineProperty(document, 'cookie', {
set: function (val) {
console.log('Hook捕获到cookie设置->', val);
if (val.indexOf('X_HTTP_TOKEN') != -1) {
debugger;
}
cookieTemp = val;
return val;
},
get: function () {
return cookieTemp;
}
});
})();
```
![08](https://s2.loli.net/2022/03/11/5ETNbWYvzIcLARO.png)
往上跟栈调试,是一个小小的 OB 混淆,`_0x32e0d2` 就是最后的 `X_HTTP_TOKEN` 值了,如下图所示:
![09](https://s2.loli.net/2022/03/11/aJofIN9CLiy42Zk.png)
直接梭哈,才300多行,不必扣了,全部 copy 下来,本地运行,发现会报错 document 未定义,定位到代码位置,下断点调试一下,发现是正则匹配 cookie 中的 `user_trace_token` 的值,那么我们直接定义一下即可:`var document = {"cookie": cookie}`,cookie 值把 `user_trace_token` 传过来即可。
![10](https://s2.loli.net/2022/03/11/rqMOS7FLDgjf4hN.png)
补全 document 后,再次运行,又会报错 window 未定义,再次定位到源码,如下图所示:
![11](https://s2.loli.net/2022/03/11/Znz7B8FvVIJRScL.png)
分析一下,取了 window XMLHttpRequest 对象,向 wafcheck.json 这个接口发送了一个 Ajax GET 请求,然后取了 Response Header 的 Date 值赋值给 `_0x309ac8`,注意这个 Date 值比正常时间晚了8个小时,然而取 Date 值并没有什么用,因为后面又 new 了一个新 Date 标准时间,赋值给了 `_0x150c4d`,`new Date(_0x309ac8[_0x3551('0x2d')](/-/g, '/'))` 语句虽然用到了前面的旧 Date,然而实际上是 `replace()` 替换方法,与旧的 Date 并没有什么关系,然后调用 `Date.parse()` 方法将新 Date 转换成时间戳赋值给 `_0x4e6d5d`,所以不需要这么复杂,直接本地把 `_0x89ea429` 方法修改一下就行了:
```javascript
// 原方法
// function _0x89ea42() {
// var _0x372cc0 = null;
// if (window[_0x3551('0x26')]) {
// _0x372cc0 = new window[(_0x3551('0x26'))]();
// } else {
// _0x372cc0 = new ActiveObject(_0x3551('0x27'));
// }
// _0x372cc0[_0x3551('0x28')](_0x3551('0x29'), _0x3551('0x2a'), ![]);
// _0x372cc0[_0x3551('0x2b')](null);
// var _0x309ac8 = _0x372cc0[_0x3551('0x2c')]('Date');
// var _0x150c4d = new Date(_0x309ac8[_0x3551('0x2d')](/-/g, '/'));
// var _0x4e6d5d = Date[_0x3551('0x2e')](_0x150c4d);
// return _0x4e6d5d / 0x3e8;
// }
// 本地改写
function _0x89ea42() {
var _0x150c4d = new Date();
var _0x4e6d5d = Date.parse(_0x150c4d);
return _0x4e6d5d / 0x3e8;
}
```
本地测试 OK:
![12](https://s2.loli.net/2022/03/11/ioKdWzINjYcOtGT.png)
### \_\_lg_stoken\_\_
`__lg_stoken__` 这个参数是在点击搜索后才开始生成的,直接搜索同样没值,Hook 一下,往上跟栈,很容易找到生成位置:
![13](https://s2.loli.net/2022/03/14/FN7IZHQtd49uXfx.png)
![14](https://s2.loli.net/2022/03/14/LE6ZFxRjweQUv5G.png)
可以看到 d 就是 `__lg_stoken__` 的值,`d = (new g()).a()`、`g = window.gt`,`window.gt` 实际上是调用了 `_0x11db59`
跟进混淆的 JS 看一下,就会发现末尾的这段代码是关键,这里用到了 prototype 原型对象,我们直接 `window.gt.prototype.a()` 或者 `(new window.gt).a()` 就能获取到 `__lg_stoken__`,如下图所示:
![15](https://s2.loli.net/2022/03/14/iHFodT1upjP6cYv.png)
到这里也许你想下断点去调试一下,看看能不能扣个逻辑出来,但是你会发现刷新之后断不下,因为这个混淆 JS 文件是一直在变化的,之前的断点就不管用了,然后你就可能会想到直接替换掉这个 JS,让文件名固定下来,就可以断点调试了,如果你这样操作的话,重新刷新会发现一直在加载中,打开控制台会发现报错了,造成这样的原因就在于这个混淆 JS 不仅文件名会改变,他的内容也会改变,当然,内容也不仅仅是改变了变量名那么简单,有些值也是动态变化的,比如:
![16](https://s2.loli.net/2022/03/14/dHYhI5Blbk3Ni9S.png)
这里我们先不管那么多,直接把所有的混淆代码 copy 下来,先在本地调试一下,看看能不能跑通,调试过程中,先后会提示 `window is not defined`、`Can
没有合适的资源?快使用搜索试试~ 我知道了~
基于Python3的JS逆向、反反爬、验证码处理、登录签到抽奖、数据可视化源码.zip
共207个文件
py:68个
md:66个
js:54个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 28 浏览量
2024-02-03
20:51:45
上传
评论
收藏 1.71MB ZIP 举报
温馨提示
基于Python3的JS逆向、反反爬、验证码处理、登录签到抽奖、数据可视化源码.zip 基于Python3的JS逆向、反反爬、验证码处理、登录签到抽奖、数据可视化源码.zip 基于Python3的JS逆向、反反爬、验证码处理、登录签到抽奖、数据可视化源码.zip 基于Python3的JS逆向、反反爬、验证码处理、登录签到抽奖、数据可视化源码.zip
资源推荐
资源详情
资源评论
收起资源包目录
基于Python3的JS逆向、反反爬、验证码处理、登录签到抽奖、数据可视化源码.zip (207个子文件)
COVID-19.html 383KB
uad.js 300KB
fm_old.js 298KB
fm_new.js 295KB
uad_reduction.js 246KB
get_encrypted_ua.js 237KB
nhsa.js 168KB
gm99_encrypt_2.js 158KB
gm99_encrypt.js 148KB
yhd_encrypt.js 108KB
10086_encrypt.js 94KB
lagou.js 93KB
challenge_6.js 51KB
qimingpian_decrypt.js 51KB
steampowered_encrypt.js 43KB
tenhou_decrypt.js 28KB
challenge_1.js 25KB
uis_nbu_encrypt.js 25KB
15yunmall_encrypt.js 23KB
10010_encrypt.js 20KB
d_cn_encrypt.js 20KB
iappstoday_encrypt.js 20KB
xueyiyun_encrypt.js 20KB
miguvideo_encrypt.js 19KB
weibo_encrypt.js 17KB
fang_encrypt.js 15KB
jzsc_mohurd_decrypt.js 10KB
pedata_decrypt.js 8KB
wcbchina_encrypt.js 7KB
360_encrypt.js 5KB
main.js 5KB
unicom_trip_decrypt.js 4KB
get_black_box.js 4KB
get_reqId_2.js 4KB
appmiu.js 3KB
get_reqId.js 3KB
challenge_2.js 3KB
get_reqId_3.js 3KB
baidu_encrypt.js 2KB
get_content_and_key.js 2KB
189_encrypt.js 2KB
get_acw_sc_v2.js 2KB
37_encrypt.js 1KB
hqew_encrypt.js 1KB
zwfw_san_he_encrypt.js 1KB
challenge_4.js 1KB
tianaw_95505_encrypt.js 1KB
encrypt.js 905B
challenge_3.js 847B
epay.js 671B
youdao_encrypt.js 599B
ewt360_encrypt.js 582B
flyme_encrypt.js 434B
cnki_encrypt.js 424B
hfax_encrypt.js 250B
facebook_comments.json 256KB
vuukle_comments.json 75KB
README.md 27KB
README.md 26KB
README.md 23KB
README.md 19KB
README.md 16KB
README.md 16KB
README.md 16KB
README.md 15KB
README.md 14KB
README.md 14KB
README.md 13KB
README.md 13KB
README.md 11KB
README.md 10KB
README.md 10KB
README.md 9KB
README.md 9KB
README.md 9KB
README.md 9KB
README.md 9KB
README.md 8KB
README.md 8KB
README.md 8KB
README.md 7KB
README.md 6KB
README.md 6KB
README.md 6KB
README.md 6KB
README.md 5KB
README.md 5KB
README.md 5KB
README.md 4KB
README.md 4KB
README.md 4KB
README.md 4KB
README.md 3KB
README.md 3KB
README.md 3KB
README.md 3KB
README.md 3KB
README.md 3KB
README.md 3KB
README.md 3KB
共 207 条
- 1
- 2
- 3
资源评论
武昌库里写JAVA
- 粉丝: 3556
- 资源: 2063
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功