url
aHR0cHM6Ly93d3cuYXFpc3R1ZHkuY24vaGlzdG9yeWRhdGEvZGF5ZGF0YS5waHA/Y2l0eT0lRTYlQjclQjElRTUlOUMlQjMmbW9udGg9MjAxMy0xMg==base64.b64decode()
反爬机制:
1. 无限debugger,F12, 右键禁用, 窗口检测
2. 数据加密
3. ajax请求
4. 代码混淆
处理各种反扒:
1.无限debugger, F12, 右键, 窗口检测
禁用F12,右键: 不用快捷键找到并打开开发者工具(浏览器右上角三个点->更多工具-> 开发者工具),
窗口检测:开发者工具右上角三个点,将开发者工具选择独立窗口,而不是停靠网页的一侧
无限debugger:右键debugger左侧数字,选择一律不在此处暂停;
刷新网页后就可以进行调试了。
刷新后发现主页面中没有数据,清除cookie(点击网址左端的小锁,选择Cookie和网站数据,点击删除),重新刷新网页,就可以抓到数据包了。
2. 数据加密,ajax请求, 代码混淆
多清几次cookie,刷新,会发现请求的数据是加密的,且key值是变化的。
因为key值不断变化,没办法直接通过搜索关键字来找数据加密逻辑,因此通过xhr断点找:
勾上断点,清cookie,刷新:
网页断在了发送ajax请求之前,然后通过不断的单步调试,最后找到了ajax请求所在的vm文件:
从ajax请求内容可以看到,我们要找的数据就是p89pnAs,由函数p9cAcdlXf3jULuRd(m2OpM54Fm, ooz7uL4Rde)加密得来的,打上断点刷新:
里面是通过md5 + base64(后面会发现这个地方是会变化的,base64后可能会出现aes或des加密)加密,直接用python重写,或者耐心点慢慢扣js。
成功请求到数据后,发现数据是一串加密的字符,我们要找到其加密的逻辑:
因为我们网页上看到的数据是明文的,所以一定存在解密的代码在某个js文件中(自学,个人理解),清cookie,刷新,找到ajax请求,在success后打上断点,右键执行到此处,发现
success传入的数据就是我们请求到的密文,单步调试就可以找到数据解密的逻辑了:
数据解密逻辑:
找到这些逻辑后,就可以准备按顺序开始写代码:加密post的data -> requests.post -> 解密数据;
加解密的时候会遇到一个问题,密钥每次加载都会变化:
data对应的key值也会变化,data加密的方法也会变化 (会加aes或des加密),aq0G也是变化的:
太多变化了,第一反应就是干脆将整个文件请求出来,然后就发现是vm文件,百度知道vm文件是js使用eval函数后出现的结果, 点击网络,搜素eval:
将eval里面的函数copy出来放到console里面跑一下,就可以找到vm文件的内容了(可能有多重加密,多跑几次直到看到你熟悉的js代码)
跑一次发现还是个eval函数,再将eval里面的内容扣出来跑:
最终找到了对应的代码,
然后我们找到这个eval所在的js文件,可以发现这个js文件的url也会变: deZFrgC0SMD9R.min.js?v=1692841562, 我们通过启动器找到了它的url生成位置daydata.php
至此,所有需要的东西我们都可以获取到了。
总结一下整个流程
1. requests.get 请求主页 -> 正则/xpath/css 获取到js文件路径:resource/js/deZFrgC0SMD9R.min.js?v=1692841562
2. requests.get 请求js文件 -> 获取到整个eval函数
3. 使用execjs反复call eval里面的函数 -> 解密后vm文件代码
4. 使用正则将aes, des的key和iv,post的data的appId, data的key值,data加密的方法(有没有使用aes,des),抓出来 -> post请求的data
def data_encode(appId, method, object, timestamp, aes_key, aes_iv, des_key, des_iv, clienttype="WEB", encode="b64"): judge_obj = JudgeCode() s = appId + method + timestamp + clienttype + object secret = judge_obj.judge_encode(s, encode_func=USE_MD5) # md5加密,自己网上找 data = '{"appId":"%s","method":"%s","timestamp":%s,"clienttype":"%s","object":%s,"secret":"%s"}' % ( appId, method, timestamp, clienttype, object, secret) result = judge_obj.judge_encode(str(data).encode('utf8'), encode_func=base64.b64encode).decode(encoding='utf8') if encode == "aes": # aes加密可以直接扣出来,也可以用python写(没试过python写,不知道行不行) result = decode_js.call("aes_encode", result, aes_key, aes_iv) elif encode == "des": result = decode_js.call("des_encode", result, des_key, des_iv) return result
5. requests.post + data 请求historydata/api/historyapi.php -> 获得加密后的数据
6. 使用aes des的key和iv解密数据,获得需要的数据
7.写入sql。
8. 代码就不贴了,多动手。因为是自学,可能很多步骤别人一眼就知道对应的代码,逻辑在哪,不需要像我一样反复清cookie,单步调试,欢迎各位大神指点一下 。
最后再贴个结果: