声明本文所有内容仅供学习交流,抓拍内容、敏感网址、数据接口均已脱敏处理,并严禁用于商业用途和非法使用,否则由此产生的一切后果与作者无关,如有侵权,请立即联系我删除!逆向目标目标:某政务服务网—>政民互动—>我要咨询主页:aHR0cDovL3p3Zncuc2FuLWhlLmdvdi5jbi9pY2l0eS9pY2l0eS9ndWVzdGJvb2svaW50ZXJhY3Q=接口:aHR0cDovL3p3Zncuc2FuLWhlLmdvdi5jbi9pY2l0eS9hcGktdjIvYXBwLmljaXR5Lmd1ZXN0Ym9vay5Xcml0ZUNtZC9nZXRMaXN0逆向参数:RequestHeaders:Cookie:ICITYSession=fe7c34e21abd46f58555124c64713513QueryStringParameters:s=eb84531626075111111&t=4071_e18666_1626075203000RequestPayload:{"start":0,"limit":7,"TYPE@=":"2","OPEN@=":"1"}逆过程绕过无限调试器。我们尝试抓包,打开开发者工具,刷新页面,会发现此时页面断开到debugger的位置,点击Next后,又断开到debugger的另一个位置.这种情况是无限调试器。infinitedebugger的意思就是防止一些人调试,但其实绕过unlimiteddebugger的方法很简单,方法有很多。下面介绍几种常用的旁路方法。1.Neverpausehere是在debugger位置,点击行号,右键Neverpausehere,neverbreakhere:2.Addconditionalbreakpoint同样右键选择Addconditionalbreakpoint,输入false跳过无限调试器,原理就是加条件断点。不管前面的代码是什么逻辑,跑到调试器上肯定是真的。只需要改成false,就不会执行了:3.中间人拦截替换无限debug函数所谓中间人拦截替换就是把狸猫换成太子,把原来的函数换成无限调试器。这种方法适用于知道无限调试器函数所在的具体JS文件,重写JS文件使其不包含无限调试器函数。使用第三方工具将原来的JS文件替换成重写的文件。这样的工具有很多,比如浏览器插件ReRes,可以通过指定规则将请求映射到其他URL或本地文件。或者目录,抓包软件Fidder的Autoresponder功能也可以替换。4.方法为空。直接在Console中重写无限调试器的功能。清空也可以破解无限调试器。缺点是刷新后会失效,基本不常用。抓包分析绕过无限调试器后,点击下一页抓包分析,数据界面类似:http://zwfw.xxxxxx.gov.cn/icity/api-v2/app.icity.guestbook.WriteCmd/getList?s=d455731630315957615&t=2491_d51515_1630315979000,Cookie的参数,QueryStringParameters和RequestPayload需要我们解决。参数reverse首先是Cookie,直接搜索,可以发现在首页的请求中,在Set-Cookie中设置了cookie值,然后使用get方法请求首页,直接在response中获取Cookie:RequestPayload的参数在每页观察开始+7后可以找到,其他参数不变。QueryStringParameters的两个参数s和t是JS加密后得到的。全局搜索参数s。由于s太多了,可以尝试搜索一下var,也能找到varsig的位置。这个函数后面有两个明显的语句:curUrl+="?s="+sig;curUrl+="&t="+t;,不难看出是一个url拼接语句,s参数是sig,下了断点,可以看出是我们要找的参数:复制这个函数进行本地调试,会发现提示LEx未定义,直接跟进函数LEx.isNotNull,复制原函数:再次调试,会提示__signature参数未定义,全局搜索发现这个值可以在首页的HTML中找到,直接正则表达式提取即可。完整代码GitHub关注K哥的爬虫,持续分享爬虫相关代码!欢迎加星!https://github.com/kgepachong/下面只是演示了部分关键代码,不能直接运行!完整代码仓库地址:https://github.com/kgepachong...JS加密代码isNotNull=function(obj){if(obj===undefined||obj===null||obj=="null"||obj===""||obj=="undefined")returnfalse;返回真;};函数getDecryptedParameters(__signature){varsig="";变种字符=“0123456789abcdef”;如果(!isNotNull(__signature)){varcurTime=parseInt(Math.random()*(9999-1000+1)+1000)+""+Date.parse(newDate());sig=chars.charAt(parseInt(Math.random()*(15-15+1)+10))+chars.charAt(curTime.length)+""+curTime;}else{sig=__signature;}变种键=“”;var键索引=-1;对于(vari=0;i<6;i++){varc=sig.charAt(keyIndex+1);键+=c;keyIndex=chars.indexOf(c);如果(keyIndex<0||keyIndex>=sig.length){keyIndex=i;}}vartimestamp=parseInt(Math.random()*(9999-1000+1)+1000)+"_"+key+"_"+Date.解析(新日期());vart=时间戳;//LEx.azdg.encrypt(时间戳,密钥);t=t.replace(/\+/g,"_");return{"s":sig,"t":t};}//测试示例//console.log(getDecryptedParameters("c988121626057020055"))Python代码#!/usr/bin/envpython3#-*-coding:utf-8-*-importreimportexecjsimportrequestsindex_url='脱敏处理,完整代码参考GitHub:https://github.com/kgepachong/crawler'data_url='脱敏处理,完整代码参考GitHub:https://github.com/kgepachong/crawler'headers={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/91.0.4472.124Safari/537.36'}session=requests.session()defget_encrypted_pa??rameters(signature):withopen('encrypt.js','r',encoding='utf-8')作为f:js=f.read()encrypted_pa??rameters=execjs.compile(js).call('getDecryptedParameters',signature)返回encrypted_pa??rametersdefget_signature_and_cookies():response=session.get(url=index_url,headers=headers)cookies=response.cookies.get_dict()cookie=cookies['ICITYSession']signature=re.findall(r'signature="(.*)"',response.text)[0]returncookie,signaturedefget_data(cookie,parameters,page):payload_data={'start':page*7,'limit':7,'TYPE@=':'2','OPEN@=':'1'}params={'s':参数['s'],'t':参数['t']}cookies={'ICITYSession':cookie}response=session.post(url=data_url,headers=headers,json=payload_data,params=params,cookies=cookies).json()print(payload_data,response)defmain():ck,sig=get_signature_and_cookies()forpageinrange(10):#采集10页数据param=get_encrypted_pa??rameters(sig)get_data(ck,param,page)if__name__=='__main__':main()
