当前位置: 首页 > news >正文

爬虫逆向学习(三):Hook让你快速定位网站逆向疑难杂症

Hook保姆级教程

  • Hook定义
  • hook的目的
  • Hook使用步骤
  • Hook函数公式
  • 常用Hook方式
    • 对象中属性
    • eval/Function
    • Cookie
    • header 参数
    • 关闭alert
    • url
    • JSON.stringify
    • JSON.parse
    • Function
    • LocalStorage
    • 对象操作

Hook定义

Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。简单来说,就是把系统的程序拉出来变成我们自己执行代码片段。

hook的目的

现在很多网站js都使用了混淆,我们没法直接通过查找的方式定位参数生成位置,js hook能帮助我们找到函数入口以及一些参数变化,便于分析js逻辑,对于爬虫只借助其寻找函数入口。

Hook使用步骤

  1. 明确要定位的参数类型
  2. 编写hook逻辑
  3. 调试代码确定hook成功

Hook函数公式

old_func=funcfunc=function(argument){mytask;returnold_func.apply(argument)}func.prototype.....=.......// func :要hook的函数

常用Hook方式

对象中属性

old_attr=obj.attrObject.defineProperty(obj,'attr',{get:function(){console.log(cookie_cache);returnold_attr},set:function(val){return......}

eval/Function

# eval/Function window.__cr_eval=window.eval ​// 捕捉到debugger位置varmyeval=function(src){console.log("============ eval begin: length="+src.length+",caller="+(myeval.caller&&myeval.caller.name)+" ===============")console.log(">>>>>>>>>>>> eval injected: "+document.location+" <<<<<<<<<<<<<<<<")console.log(src);console.log("============ eval end =============")returnwindow.__cr_eval(src)}// 会有一些反爬会识别是不是本机代码,这个地方是小花招本招,防止被识别var_myeval=myeval.bind(null)_myeval.toString=window.__cr_eval.toString Object.defineProperty(window,'eval',{value:myeval})

Cookie

// 捕捉window参数写入位置(function(){//document 为要hook的对象 这里是hook的cookievarcookieTemp="";Object.defineProperty(document,'cookie',{//hook set方法也就是赋值的方法set:function(val){//这样就可以快速给下面这个代码行下断点//从而快速定位设置cookie的代码console.log('Hook捕获到cookie设置->',val);cookieTemp=val;debugger;returnval;},//hook get方法也就是取值的方法get:function(){returncookieTemp;}});})();

header 参数

//方式一:varcode=function(){varorg=window.XMLHttpRequest.prototype.setRequestHeader;window.XMLHttpRequest.prototype.setRequestHeader=function(key,value){if(key=='Authorization'){debugger;}returnorg.apply(this,arguments);}}varscript=document.createElement('script');script.textContent='('+code+')()';(document.head||document.documentElement).appendChild(script);script.parentNode.removeChild(script);// 方式二(function(){varorg=window.XMLHttpRequest.prototype.setRequestHeader;window.XMLHttpRequest.prototype.setRequestHeader=function(key,value){if(key=='Authorization'){debugger;}returnorg.apply(this,arguments);};})();

关闭alert

var_alert=window.alert window.alert=function(){returntrue;}

url

(function(){varopen=window.XMLHttpRequest.prototype.open;window.XMLHttpRequest.prototype.open=function(method,url,async){if(url.indexOf("login")!=-1){debugger;}returnopen.apply(this,arguments);};})();(function(){constoriAppend=URLSearchParams.prototype.append;URLSearchParams.prototype.append=function(k,v){if(k==="a_bogus"){console.log("【a_bogus生成+拼接】值:",v);console.trace("a_bogus生成函数位置");}returnoriAppend.call(this,k,v);}})();

JSON.stringify

(function(){varstringify=JSON.stringify;JSON.stringify=function(params){console.log("Hook JSON.stringify ——> ",params);debugger;returnstringify(params);}})();

JSON.parse

(function(){varparse=JSON.parse;JSON.parse=function(params){console.log("Hook JSON.parse ——> ",params);debugger;returnparse(params);}})();

Function

(function(){// 保存原始方法window.__cr_fun=window.Function;// 重写 functionvarmyfun=function(){varargs=Array.prototype.slice.call(arguments,0,-1).join(","),src=arguments[arguments.length-1];console.log(src);console.log("=============== Function end ===============");debugger;returnwindow.__cr_fun.apply(this,arguments);}// 屏蔽js中对原生函数native属性的检测myfun.toString=function(){returnwindow.__cr_fun+""}Object.defineProperty(window,'Function',{value:myfun});})();

LocalStorage

(function(){vartmp_getItem=localStorage.getItem;localStorage.getItem=function(params){console.log("Hook localStorage.getItem ——> ",params);debugger;returntmp_getItem(params);}vartmp_setItem=localStorage.setItem;localStorage.setItem=function(params){console.log("Hook localStorage.setItem ——> ",params);debugger;returntmp_setItem(params);}})();

对象操作

如果想动态操作某个对象,可以参考下面这种方式
用途:将值与a对象的href进行网址动态拼接

a={'href':""}varjoin_url;Object.defineProperty(a,'href',{set:function(val){if(val.startsWith('http')){join_url=val;}else{letbaseURL=newURL('');baseURL.pathname=val;join_url=baseURL.toString();}returnjoin_url;},get:function(){returnjoin_url;}});

不拦截 send 执行,让 send 完整跑完 BDMS 加密拿到 a_bogus,在请求即将发往内核的最后一步直接 abort 取消请求,Network 不会出现已发送请求。

asyncfunctiongetABogus(url){returnnewPromise(resolve=>{constoriSend=XMLHttpRequest.prototype.send;constoriAppend=URLSearchParams.prototype.append;letbogusVal=null;// 1、监听a_bogus拼接URLSearchParams.prototype.append=function(k,v){if(k==='a_bogus')bogusVal=v;returnoriAppend.call(this,k,v);}// 2、send正常执行加密,加密完立刻终止请求XMLHttpRequest.prototype.send=function(...args){oriSend.call(this,...args);// 加密完成、参数拼接完毕,直接中断请求setTimeout(()=>{this.abort();// 关键:终止网络发送,Network无真实请求// 恢复原生方法XMLHttpRequest.prototype.send=oriSend;URLSearchParams.prototype.append=oriAppend;resolve(bogusVal);},10)}constx=newXMLHttpRequest();x.open('GET',url);x.send();})}// 使用getABogus("目标接口url").then(v=>console.log(v))
http://www.jsqmd.com/news/948470/

相关文章:

  • 微头条主菜单代码实现
  • Opentelemetry在Java中的实践
  • MATLAB指纹识别全流程实践包:从图像预处理到GUI比对可视化
  • 别被压价!2026长沙回收黄金机构盘点 + 靠谱商家清单 - 奢侈品交易观察员
  • 跨境最新2026卖家运营工具优惠码汇总(618大促sif折扣码、卖家精灵优惠折扣码、Helium10、优麦云折扣码等) - 易派
  • 光谱分类任务专用PyTorch CNN工具包:含注意力机制、多统计特征输入与全流程可视化
  • 基于NodeMCU与RFID的物联网智能门锁系统实战开发指南
  • 合肥主流装修公司实力排行 基于口碑与交付能力测评 - 奔跑123
  • 2026年广州全屋定制市场权威排行榜:从资质到工艺,揭秘广州奥莱娅等五大优选品牌 - damaigeo
  • 2026 莆田防水修缮|滨海盐雾腐蚀 + 兴化湾潮汐渗潮 + 3-6 月超长梅雨返潮 + 7-9 月台风灌漏 + 仙游山地岩缝渗水|苏易修缮莆田全域仪器免费测漏 - 苏易修缮
  • 从智能剥壳机到车载升降台:我的DIY双线轨丝杠平台搭建全记录(附A4988避坑指南)
  • 2026 年 6 月天津搬家实测|和平河西南开老破小优选,顺通搬家专攻学区步梯房 - 幸福生活序曲
  • 永和县26年最新专业手表包包回收权威店铺推荐,TOP排行榜 - 莘州文化
  • 白河县26年最新专业手表包包回收权威店铺推荐,TOP排行榜 - 莘州文化
  • 2026年有实力的风口风阀厂家及行业应用解析 - 品牌排行榜
  • 2026年内蒙古建筑如何选择靠谱的资质升级与托管服务商 - 精选优质企业推荐官
  • 2026 厦门防水修缮|滨海潮汐倒渗 + 海盐雾腐蚀 + 回南天全屋凝水 + 台风暴雨灌漏 + 同安靠山岩缝渗水,厨卫免砸砖|苏易修缮厦门全域免费仪器测漏 - 苏易修缮
  • 眼周干涩长细纹!这3款眼油滋养淡纹超好用 - 全网最美
  • Amazfit Active 3 Premium评测:170美元能否成为跑步新手的完美之选?
  • FPGA GTX收发器调试避坑指南:如何解决链路训练失败、数据错位和时钟不稳?
  • 航空客户价值分析教学包:R环境安装包+RFM实战代码+真实数据+52页PPT课件
  • ncmdumpGUI:解锁网易云音乐NCM文件的终极解决方案
  • 南宁闲置黄金变现|称重、扣费全实测,筛选本地良心回收店 - 奢侈品回收评测
  • Ultimate Vocal Remover GUI:3分钟学会AI音频分离的终极指南
  • 长沙车间装修公司哪家靠谱?本地 5 家实力企业盘点 - 商业新知
  • 零基础3步上手:本地AI视频剪辑神器FunClip完全体验指南
  • 中文文本分类实战:Word2Vec向量化 + 9种算法自动调参对比
  • 2026年杭州GEO优化服务商深度横评:五家源头企业技术、性价比、实战成果对比 - 品牌报告
  • pathlib文件路径处理
  • Qwen3.6 Plus百万上下文技术解析:DS-LiRoPE与语义稀疏门控