我逆向的是一个甘肃的网站,网站链接:aHR0cHM6Ly9memdnLmdhbnN1Lmdvdi5jbi9memdnL3R6Z2cvbGlzdC5zaHRtbA==,这个网站是由瑞数防护的。我们打开控制台,点到应用可以看见这里有两个 cookie,一个是 O 开头的,还有一个是 T 开头的。这个 O 是由第一次请求返回的 cookie,然后这个 T 是根据第一次请求返回的数据生成的新 cookie。有的 cookie 是 S 跟 T,只要看见这两个基本上可以断定这个网站是瑞数六了。
1、打开控制台,我们找到返回真实数据的链接。我们发现它的请求链接参数经过处理,如下图。但是我发现这个网站可以不对它处理,直接请求真实的链接,携带正确的 cookie 也可以拿到正确的数据,所以没有深究这个参数加密逻辑。
2、我们想要知道这个真实的请求参数是什么也非常简单,因为这个网站没有无限 debug。我们直接跟栈,打开堆栈进入下面这个栈,打上断点,然后点击翻页就断在了第二张图。将鼠标悬浮在上面就可以查看到真实的请求参数格式了:/common/search/203df409225e451a8ebf743d3f176ed3?_isAgg=false&_isJson=true&_pageSize=20&_template=index&_rangeTimeGte=&_channelName=&page=1
3、在这之后,我们就需要知道这个本地是如何生成 cookie 的。因为本地的 cookie 是通过脚本生成的,我们先把本地 cookie 清除,在事件监听这里将脚本勾上,再刷新页面。
4、我们在刷新后,先去查看第一个请求为 412 的链接。源码当中的 content 我们需要将它保存下来,在后续生成 cookie 的时候会用到。还有这个 js 代码,这个 js 代码就是打上脚本监听后断住的 js 代码,这个在后续也要用于生成 cookie。
5、我们在断住的脚本监听这里放开第一个断点,就到了第二张图的位置。这个 js 是生成 cookie 的核心代码,我们将它拷贝到本地。拷贝进本地时不能格式化,因为瑞数会对这个格式进行检测,我们只需要点击左下角的 {} 就可以去除格式化。
6、我们现在已经拿到了瑞数生成本地 cookie 的核心数据了:一个 content,一个第一次返回 412 的 js 代码,还有一个核心的生成 cookie 的 js。拿到这三个数据后,我们就可以本地生成 cookie。瑞数会对运行环境进行环境检测,我们必须根据代理补环境。代理可以在网上搜一个,或者直接去 GitHub 上找一个下来。env 是补环境的代码,ts_data 是第一次返回 412 的 js,zzx 是生成本地cookie的 js。
7、我们有一个要注意的地方:getElementsByTagName中 meta 标签这里的 content 要是第一次请求响应的 content。
8、我们捋一下思路,py 代码先请求第一次,拿到第一次的 cookie,然后将源码里面的 js 保存到 ts_data,提取里面的 content 传递给 env 里面的 main 方法。因为getElementsByTagName里面的 meta 标签需要动态的,运行 zzx 生成本地 cookie,再携带两次的 cookie发起请求。这样就能拿到正常的 json 数据了。
require("./ts_data") require("./zzx") function main(content){ _content=content return document.cookie }