当前位置: 首页 > 后端技术 > Python

【JS逆向工程100例】互联网洛哲反爬实践平台第六题:JS加密、环境模拟检测

时间:2023-03-26 00:57:36 Python

关注微信公众号:爬虫K哥,继续分享高级爬虫、JS/等技术干货安卓逆向工程!声明本文所有内容仅供学习交流。抓拍内容、敏感网址、数据接口均已脱敏处理,严禁用于商业或非法用途。否则,由此产生的一切后果与作者无关。侵权请联系我立即删除!逆向标靶:网罗者反爬虫实践平台问题六:JS加密,环境模拟检测链接:http://spider.wangluozhe.com/...简介:同样需要收集100页的所有数字,并且计算所有数据的总和。请注意!不要重复使用参数值,不要自欺欺人!抓包分析通过抓包分析可以发现,这道题的Payload中的参数并没有像前面几道题那样变化,只是RequestHeaders中有个hexin-v,每次都会变。如果有朋友做过某招如果你是金融爬虫,你会发现这个参数在某华顺站点也被广泛使用,如下图:搜索加密,先尝试搜索hexin-v直接,它只在6.js中有值。很明显,这个JS用的很糊涂,无法定位,仔细一看,整个6.js是一个自执行函数(IIFE),传入的参数是7个数组,分别对应n,t,r,e,a,u,c,如下所示:!function(n,t,r,e,a,u,c){}([],[],[],[],[],[],[]);6.js是通过调用元素的下标来获取值的,所以这个混淆也很简单。如果要恢复,只需要写一个脚本替换数组对应的值即可。当然,这个例子比较简单。反混淆。因为hexin-v的值在RequestHeaders中,我们可以使用Hook来捕获header的hexin-v值并在debugger中存活。重复):(function(){'usestrict';varorg=window.XMLHttpRequest.prototype.setRequestHeader;window.XMLHttpRequest.prototype.setRequestHeader=function(key,value){if(key=='hexin-v'){调试器;}returnorg.apply(this,arguments);};})();接下来就是顺着栈,在6.js中可以看到h的值就是我们想要的值,h=ct.update(),ct.update()其实就是x(),如图下图:继续跟进x(),t就是我们想要的值,t=N():继续跟进N(),et.encode(n)就是最终的值,可以看到有就是鼠标移动,点击等一些功能:我们之前分析过,6.js是一个自执行的方法,代码量不多,所以这里直接定义一个全局变量,导出这个N方法即可,以及方法不再一一推导,伪代码如下://定义全局变量varHexin;!function(n,t,r,e,a,u,c){//省略N多代码函数N(){S[T]++,S[f]=ot.serverTimeNow(),S[l]=ot.timeNow(),S[k]=zn,S[I]=it.getMouseMove(),S[_]=it.getMouseClick(),S[y]=it.getMouseWhell(),S[E]=it.getKeyDown(),S[A]=it.getClickPos().x,S[C]=it.getClickPos().y;varn=S.toBuffer();returnet.encode(n)}//给N方法赋值给全局变量hexin=N}([],[],[],[],[],[],[]);//自定义函数得到最终的hexin-v值functiongetHexinV(){returnHexin()}环境完成如上改写后,我们在本地调试,发现window和document未定义。我们先按照前面的方法把它们定义为空,后面会报错getElementsByTagNameisnotafunction。我们知道getElementsByTagName获取的是指定标签名称的对象,属于HTMLDOM的内容,我们本地节点执行肯定没有这个环境。这里介绍一种在Node.js中可以直接创建DOM环境的方法,使用的是jsdom库,官方是这样介绍的:jsdom是很多web标准,特别是WHATWGDOM和HTML标准的纯JavaScript实现,用于节点.js。一般来说,该项目的目标是模拟足够多的Web浏览器子集,以用于测试和抓取真实的Web应用程序。最新版本的jsdom需要Node.jsv12或更新版本。(低于v17的jsdom版本仍然适用于以前的Node.js版本,但不支持。)具体使用请参考jsdom文档。需要注意的是jsdom还依赖canvas,所以也需要安装canvas库。HTMLcanvas标签用于通过脚本(通常是JavaScript)动态绘制图形。具体的介绍和使用可以参考canvas文档。我们在本地JS中添加如下代码后,我们就有了DOM环境,可以成功运行://varcanvas=require("canvas");varjsdom=require("jsdom");var{JSDOM}=jsdom;vardom=newJSDOM(`

Helloworld

`);window=dom.window;document=window.document;navigator=window.navigator;用Python代码,在requestheader中,每次携带不同的hexin-v,逐个计算每一页的数据,最终提交成功:完整代码GitHub关注K的爬虫,继续分享爬虫相关代码!欢迎加星!https://github.com/kgepachong/下面只是演示了部分关键代码,不能直接运行!完整代码仓库地址:https://github.com/kgepachong...JavaScript加密密钥代码/*======================================#@时间:2021-12-20#@作者:微信公众号:爬虫K哥#@文件名:challenge_6.js#@Software:PyCharm#======================================*/varTOKEN_SERVER_TIME=1611313000.340;varHexin;varjsdom=require("jsdom");var{JSDOM}=jsdom;vardom=newJSDOM(`

Helloworld

`);window=dom.window;document=window.document;navigator=window.navigator;!function(n,t,r,e,a,u,c){!function(){函数Gn(){}varQn=[newa[23](n[20]),newe[3](f+l+d+p)];函数Zn(){}varJn=[newt[16](c[13]),newu[9](e[19])],qn=a[24][u[16]]||a[24].getElementsByTagName(st(r[19],r[20]))[a[25]],nt;!function(o){}(nt||(nt={}));变种人;!function(o){}(tt||(tt={}));varrt=function(){}(),等;RT=rt!function(o){}(et||(et={}));函数at(){}varot;!function(o){}(ot||(ot={}));变种;!function(o){}(它||(它={}));变种;!function(s){}(ut||(ut={}));变种CT;!function(o){functionx(){}functionL(){}functionM(){}o[a[105]]=M;函数N(){S[T]++,S[f]=ot.serverTimeNow(),S[l]=ot.timeNow(),S[k]=zn,S[I]=it.getMouseMove(),S[_]=it.getMouseClick(),S[y]=it.getMouseWhell(),S[E]=it.getKeyDown(),S[A]=it.getClickPos().x,S[C]=it.getClickPos().y;varn=S.toBuffer();returnet.encode(n)}Hexin=No[r[81]]=x}(ct||(ct={}));函数st(){}varvt;!function(o){}(vt||(vt={}));可变英尺;!function(r){}(ft||(ft={}))}()}([],[],[],[],[],[],[]);functiongetHexinV(){returnHexin()}//测试输出//console.log(getHexinV())Python计算关键代码#====================================#--*--coding:utf-8--*--#@Time:2021-12-20#@Author:WeChat公众号:K哥爬虫#@FileName:challenge_6.py#@Software:PyCharm#====================================importexecjsimportrequestschallenge_api="http://spider.wangluozhe.com/challenge/api/6"headers={"Content-Type":"application/x-www-form-urlencoded;charset=UTF-8","Cookie":"cookie换成你自己的!","Host":"spider.wangluozhe.com","Origin":"http://spider.wangluozhe.com","Referer":"http://spider.wangluozhe.com/challenge/6","User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/96.0.4664.45Safari/537.36","X-Requested-With":"XMLHttpRequest"}defget_hexin_v():withopen('challenge_6.js','r',encoding='utf-8')asf:wlz_js=execjs.compile(f.read())hexin_v=wlz_js.call("getHexinV")print("hexin-v:",hexin_v)returnhexin_vdefmain():result=0forpageinrange(1,101):data={“page”:page,“count”:10,}headers[”hexin-v”]=get_hexin_v()response=requests.post(url=challenge_api,headers=headers,data=data).json()fordinresponse["data"]:result+=d["value"]print("结果为:",result)if__name__=='__main__':main()