文章目录
调试干扰
第一个 debugger
进入题目,打开开发者工具,就会有 debugger
查看上一层堆栈, 一个匿名函数执行的 Function(arguments[0] + “bugger”)()
继续查看上一层堆栈,就能看到生成 debugger 的代码段
手动解混淆后可以看到生成的逻辑
(其实查看上第一层堆栈就能看得出是由 Function 生成的 debugger)
(function(yuanrenxue_222){returnfunction(yuanrenxue_222){if(('i1iliI'!=='I1iIii')){// yuanrenxue_222 为传进来的参数 'bugger'returnFunction((('Function(arguments[0]+"'+ yuanrenxue_222)+'")()'))}else{// else 块中的代码段是不需要的,因为 if 块条件永远成立}}(yuanrenxue_222)}('bugger')('de'))
这是一段由 Function 生成的 debugger
对应的 Hook 代码
Hook 代码
_Function = Function;Function=function(val){if(val.indexOf('debugger')!==-1){return_Function.call(this,'');}return_FUnction.call(this, val);}
第二个 debugger
向上查看堆栈可以看到生成第二个 debugger 的代码段
手动解混淆后
(function(){// function 里的代码是不需要的,因为里面的代码不会执行}['constructor'](('debu'+'gger'))['call']('action'));
这是一段由 Function.prototype.constructor 生成的代码段
对应的 Hook 代码
Hook 代码
__Function =Function.prototype.constructor;Function.prototype.constructor=function(val){if(val.indexOf('debugger')!==-1){return_Function.call(this,'');}return_FUnction.call(this, val);}
第三个 Function.constructor.prototype 检测
上面的代码过掉以后,控制台会报错,点击对应的信息
对应代码段
const _0x33bb17 = _0x551a2a[_0x3ae18e('\x31\x5e\x7a\x30',0x1ab,-0x27,0x53f,-0x23e)+_0x15e3c1('\x76\x68\x35\x63',0x471,0x6ee,0x44b,0x886)+'\x72'][_0x15e3c1('\x50\x43\x79\x56',0xc0,-0x12f,0x1d3,-0x63)+_0x47a4a4('\x5b\x64\x71\x46',0x22d,0xb0,0x457,0x2d6)][_0x15e3c1('\x26\x24\x47\x49',0x58,-0x7,0xbe,-0x280)](_0x551a2a)// 解混淆后
_0x551a2a['constructor']['prototype']['bind'](_0x551a2a)// 等于(function(){})['constructor']['prototype']['bind'](_0x551a2a)
检测了 Function.prototype.constructor.prototype
正常情况下 Function.prototype.constructor.prototype === Function.prototype
而 Function.prototype 是一个方法
但是经过上面的 Hook 重写之后 Function.prototype.constructor.prototype 就不是一个方法了,会变成一个对象
对应的 Hook 代码
Hook 代码
在报错的代码断打上断点,注入 Hook 代码后放开断点就正常了
3个 Hook 应该在第一个 Hook 注入时一起注入
_Function.prototype.constructor.prototype = __Function
完整的 Hook 代码
// 第一个 debugger
_Function = Function;Function=function(val){if(val.indexOf('debugger')!==-1){return_Function.call(this,'');}return_FUnction.call(this, val);}// 第二个 debugger
__Function =_Function.prototype.constructor;_Function.prototype.constructor=function(val){if(val.indexOf('debugger')!==-1){return__Function.call(this,'');}return__Function.call(this, val);}// 第三个 debugger_Function.prototype.constructor.prototype = __Function
接口分析
请求参数
page 对应页码
m 为加密参数
响应数据
data 为页面对应的数据
k字段为对象,猜想可能与加密请求参数 m 值有关系
cookie 信息
cookie 只要携带 sessionId 即可
每次请求都会返回相同的 sessionId
加密参数 m 生成位置
查看请求接口对应的 requests 栈
下好断点,点击页码后在断点处断住, data对应的变量只包含了 page,m参数却没有
单步调试可以看出,其实是改写了 XMLHttpRequest.prototype.open 方法
具体的位置 (在请求接口的第一个栈 send)
if (f.open(a.type, a.url, a.async, a.username, a.password),
加密参数还原
如果你扣代码没有障碍,可以在目录上查看并跳转到坑点目录即可
在扣代码前,先固定 10.html 和 rsnkw2ksph 文件(这两个文件是动态的)
10.html 应取消格式化再保存
遇到无限 debugger 将对应的 Hook 代码注入即可(目录 --> 完整的 Hook 代码)
加密点
单步调试,可以找到加密的关键的位置
function _yrxyA$(_yrx7jl, _yrxcze) {
扣代码提示
扣代码时经常会碰到一个变量为系统内置的函数或方法 通过 [‘call’] 调用
在浏览器全局搜索该变量赋值的地方,在本地声明为全局变量即可(比较方便)
不嫌麻烦的话 自己替换为对应的内置方法即可(数组引用不多,自己还原就行)
进入某个函数中,如果跟到类似这样的代码段,不用扣
代码段的目的是控制 _yrxaij 的值,让程序走向正确的代码段执行
判断 _yrxTY4 的值,确定是否给 _yrxnhf 变量自增
在 _yrxYfZ 数组取对应的索引并赋值给 _yrxaij
_yrxyA$()
原代码
function_yrxyA$(_yrx7jl, _yrxcze){try{if(typeof _yrx7jl !== _yrxQ9C[6])
_yrx7jl +=''}catch(_yrxrqQ){return _yrx7jl
}if(!(_yrxCJw &1024)){
_yrx7jl =_yrxR2F(_yrx7jl)}var _yrx$Kn =_yrxtSa(_yrx7jl);if(_yrx$Kn ===null){return _yrx7jl
}if(_yrx$Kn._yrxKni >3){return_yrxtY2(_yrx$Kn)}// ↑ 代码是不需要的// _yrx$Kn._yrx2ad + _yrx$Kn._yrxAmM 为对应的 路径 + 查询参数 例: /api/match/10?page=1// _yrx5XG 为 encodeURIComponent 系统内置函数var _yrxmEu =_yrxWKg(_yrxyHJ(_yrx5XG(_yrx$Kn._yrx2ad + _yrx$Kn._yrxAmM)));// _yrx7jl 用于拼接成一段完整的域名(不需要)var _yrx7jl = _yrx$Kn._yrxCiX + _yrx$Kn._yrxAmM;if(_yrx$Kn._yrxAmM ==='')
_yrx7jl = _yrx7jl +'?';else
_yrx7jl = _yrx7jl +'&';var _yrx2LR = _yrx$Kn._yrxiv8 + _yrx7jl;// _yrx$Kn._yrxQZs 也是对应的 路径 + 查询参数 例: /api/match/10?page=1// _yrxcze 一直都为 undefined 因为调用这个函数的时候就没有给形参 _yrxcze 传值
_yrx2LR +=_yrxBXT(779, _yrx$Kn._yrxQZs, _yrxmEu, _yrxcze);
_yrx2LR += _yrx$Kn._yrxcFt;// 这一段也是不需要的return _yrx2LR
}
改写
functionsdk(params){var _yrxmEu =_yrxWKg(_yrxyHJ(encodeURIComponent(params)));let result =_yrxBXT(779, params, _yrxmEu,undefined);return result
}
console.log(sdk("/api/match/10?page=1"));// 调用
后续照样子缺啥补啥即可
var _yrxmEu = _yrxWKg(_yrxyHJ…
_yrxWKg()
var _yrxrqQ = new _yrx03s();
_yrx03s 函数有 prototype 原型 这里是需要补的
先将 _yrx03s() 方法扣好
再查找 prototype 赋值的地方
示例
function_yrx03s(){this._yrx4r0 =this._yrxa9O['slice'](0);this._yrxNj0 =[];this._yrx2tg =0}function_yrxs6z(){// 代码太长了 全局搜索 function _yrxs6z() {}
_yrx03s['prototype']=new_yrxs6z();
对应的函数补完之后 _yrxmEu 值就可以生成了,验证下结果
let result = _yrxBXT(779, …
_yrxBXT() 方法里面是控制流,跟着控制流扣对应的代码即可
_yrxBXT() 方法进入会声明变量,这里面也是需要声明的(涉及到闭包作用域的问题)
示例
function_yrxBXT(_yrx4Aj, _yrx7jl, _yrxcze, _yrxyqC){var _yrx4Sf, _yrxxIM, _yrxWxp, _yrxPhB, _yrxnZw, _yrxUSw, _yrxWfm, _yrxxy4, _yrxE8L, _yrx7ea, _yrxrqQ, _yrx$Kn, _yrxmEu, _yrx2LR, _yrx3il, _yrxTXe, _yrxxj7, _yrxDS9, _yrxI6a, _yrx2aP, _yrxG5u;var _yrxTY4, _yrxaij;// _yrxnhf = _yrx4Aj, _yrxYfZ = _yrxFzI[1];// _yrxnhf, _yrxYfZ 这两个变量的作用是接收对应的指令,执行对应的代码段,所以不需要扣if(_yrx4Aj ===779){// 在浏览器单步调试 边调试边将对应的代码段扣进来即可// 例如调试到的第一个代码段为 var _yrxrqQ = [] // 将对应的代码段扣下来即可var _yrxrqQ =[];}}
调试后会发现 _yrxBXT() 有重复调用的情况, 加多个 if 就行
function_yrxBXT(_yrx4Aj, _yrx7jl, _yrxcze, _yrxyqC){var _yrx4Sf, _yrxxIM, _yrxWxp, _yrxPhB, _yrxnZw, _yrxUSw, _yrxWfm, _yrxxy4, _yrxE8L, _yrx7ea, _yrxrqQ, _yrx$Kn, _yrxmEu, _yrx2LR, _yrx3il, _yrxTXe, _yrxxj7, _yrxDS9, _yrxI6a, _yrx2aP, _yrxG5u;var _yrxTY4, _yrxaij;// _yrxnhf = _yrx4Aj, _yrxYfZ = _yrxFzI[1];// _yrxnhf, _yrxYfZ 这两个变量的作用是接收对应的指令,执行对应的代码段,所以不需要扣if(_yrx4Aj ===779){// 在浏览器单步调试边调试边将对应的代码段扣进来即可var _yrxrqQ =[];var _yrx$Kn =''var _yrxmEu =_yrxBXT(746,6)}if(_yrx4Aj ===746){// 在浏览器单步调试边调试边将对应的代码段扣进来即可// 例: var _yrxrqQ = _yrxlo_(_yrx1_p())}}
可以按照这个模板扣代码
function_yrxBXT(_yrx4Aj, _yrx7jl, _yrxcze, _yrxyqC){var _yrx4Sf, _yrxxIM, _yrxWxp, _yrxPhB, _yrxnZw, _yrxUSw, _yrxWfm, _yrxxy4, _yrxE8L, _yrx7ea, _yrxrqQ, _yrx$Kn, _yrxmEu, _yrx2LR, _yrx3il, _yrxTXe, _yrxxj7, _yrxDS9, _yrxI6a, _yrx2aP, _yrxG5u;var _yrxTY4, _yrxaij;if(_yrx4Aj ===779){var _yrxrqQ =[];var _yrx$Kn ='';var _yrxmEu =_yrxBXT(746,6)
_yrxays ='{qqqqqqqqq~F3F2Y0r8FDwZzST.0m833g1O8K3Lp5rUZVIEcS2.5cJl.aG4FKElt0sBukW2APm.aigTYNPnEiHGB.rsZldYKLmjhKMlS.a14qdQvjSF.ttGuXYj_J4ZD_ubMJXyYvnjaEiNKXmjLtEaVbP_1Wtzp_c8AcRE7CAtcJzEWjnB1kL9o9pK9mgzFLnu3cMGOX2DhxMZHnGFTt7Qhzft6EgVMbYj4hylyunHiJEAxbfUmkF7XpArhr2Jp8YRTsDll3TWSYsTW3SlSqsGkIpl0rKVKFpq9soVlwTW2Y1mWISlzhY70Un2nxPGKMAehKUfUxamAY0GuV1Y_YfGSAmzUhoVzVsxkclyRc80qKXecN.sWZDpUvSdYGoST5hq.nynMpWTcSGZ99KpMJ0B24Wpp33Bjo3ePE0_BzQLBpi9r0l4096hdtX.i.ivhmjqqqqqqqqqDdfe167kR2El3leHql3650hAuA1Wm3ZJmRr0qq!x7z,aac,amr,asm,avi,bak,bat,bmp,bin,c,cab,css,csv,com,cpp,dat,dll,doc,dot,docx,exe,eot,fla,flc,fon,fot,font,gdb,gif,gz,gho,hlp,hpp,htc,ico,ini,inf,ins,iso,js,jar,jpg,jpeg,json,java,lib,log,mid,mp4,mpa,m4a,mp3,mpg,mkv,mod,mov,mim,mpp,msi,mpeg,obj,ocx,ogg,olb,ole,otf,py,pyc,pas,pgm,ppm,pps,ppt,pdf,pptx,png,pic,pli,psd,qif,qtx,ra,rm,ram,rmvb,reg,res,rtf,rar,so,sbl,sfx,swa,swf,svg,sys,tar,taz,tif,tiff,torrent,txt,ttf,vsd,vss,vsw,vxd,woff,woff2,wmv,wma,wav,wps,xbm,xpm,xls,xlsx,xsl,xml,z,zip,apk,plist,ipaqqqqqM1L25X6idI4fnXojgI.z5XU_9I_Q{.DGZ.J1G9Eoe4RoJ08CrTRupbwbxeQUpjJoRdwUTLQv0.xcG7EmJyV6eowqTnAUJcQ2x_mPqFhfJ01CScIVTXAbGqF9JBY6JIFpSCYvpsM20HRSRYxYAGV1ephYWqr1r4k162hZrX5whI412tqq}!iAgmRTwdsDARRVrPUcgMImrSUUJUJp2SU1AMpKR0Y6rKImTrRO0Rs2fWUrZMsUrUwCpWwYwb8m2dlmRiUDmg3K26KbYQAUmEwKRFq9mPAo2zp2zIk6rbQArOsKLhwKSNQKS3UomQsvR.w2ArwOJno9N.1qeNQlWG1GwOo9WFFop4xUy7Ds23Hla0roqUoAl93qr6lC98ksp6FVq5UGpnDlq7DCqqqqqqXAOo30eljTuAgmeehhIUrtA;4kUyzUi8kgD7ll6J2MqFBA;k136EQOTwklqJ|gc10eslSeWlfIq0ms3Vz7rVrl3TRSDkNJ10rt3KSGM6wLpKwWUVpc8la.Wkfjrm9WpnJtw0EfFSfGhmZ9FrJEkYZQIqecmo9mYG9ZH0EP31xQiUSOFueM3s0IM1JQMuafKny3oC3z3sS.kC3OMap4EYrsAn2Lh27nApZZKbgf82NrEbZNpqezJuzcAnRkxYgZVSSJplV5UuxHlkG0Y922mTg5Qczkh6rxs7J2SvHMA7rEasuQMWztyDIIHZwhybsyK8yD4mvm1.ymC2kE8XrenTOGKWxvZ2uXKeYlVMqTwimVCKszMxYZ9Knp3r0t1074790432Y3HGMHwnXHqzPTCrao7BEU';
_yrxVMl ={"scj":[],"_yrxdD_":["_yrxvn$","_yrxnIK","_yrxw3G","_yrx4Sh","_yrx8LV","_yrx1e8","_yrxc$E","_yrxIEc","_yrx9zH","_yrxYeM","_yrxlCm","_yrxUlA","_yrx6L9","_yrxCZ3","_yrxC72","_yrxEvO","_yrxksc","_yrxbDF","_yrxVrt","_yrxlQ1","_yrxYZC","_yrxdDm","_yrxFpw","_yrxJPo","_yrxfMk","_yrxpnH","_yrxyLY","_yrxEH7","_yrxwaS","_yrxXGq","_yrxdJ4","_yrxANR","_yrx9K2","_yrxCIU","_yrx_yd","_yrx5El","_yrxGxQ","_yrxDnL","_yrxgie","_yrxBoU","_yrxAv3","_yrx9XC","_yrxqy0","_yrxIvz","_yrxHpk","_yrxQsc","_yrxZXD","_yrxEM9","_yrx1x3","_yrxyum","_yrxa$M","_yrxbFy","_yrxUQ9","_yrx0N3","_yrx_Mu","_yrx4vh","_yrxphR","_yrxuIo","_yrxuHi","_yrxh5_","_yrx$re","_yrxA_W","_yrxtCE","_yrxEIH","_yrxOWU","_yrxgbu","_yrxrIo","_yrxrp_","_yrxQfa","_yrxzw0","_yrxzO0","_yrxCwK","_yrxxoO","_yrxEvl","_yrx148","_yrx6sx","_yrxgJ7","_yrxzWA","_yrxbvq","_yrxMXv","_yrxEG0","_yrx1Gh","_yrxDvn","_yrxbUG","_yrx6Ot","_yrxuxO","_yrx5T2","_yrxDH0","_yrx78n","_yrxl1W","_yrxRph","_yrxhP3","_yrxYTK","_yrxB2k","_yrx8IE","_yrxiSq","_yrxRVO","_yrxkm0","_yrx3xY","_yrxFfV","_yrxL82","_yrxo5n","_yrxIE7","_yrxIN8","_yrxvah","_yrxCkZ","_yrx5Tr","_yrxKQ7","_yrxs3J","_yrx3Zy","_yrxbVe","_yrxvpX","_yrxNy7","_yrxX7$","_yrxguY","_yrxsCY","_yrx$Rr","_yrxCKr","_yrxLm1","_yrxf$v","_yrx38N","_yrxesH","_yrxBFw","_yrxaXm","_yrxKtx","_yrx62w","_yrxbzo","_yrxd$z","_yrxRNY","_yrxa01","_yrxzX3","_yrxPh$","_yrxo3Y","_yrxueR","_yrxesu","_yrxZxk","_yrxFhg","_yrx1DZ","_yrxlgb","_yrx1Dk","_yrxjRT","_yrxXZS","_yrxIZD","_yrxxLm","_yrxReq","_yrxSGY","_yrxobT","_yrxLxA","_yrxljD","_yrx7Ua","_yrxIAZ","_yrxB7N","_yrxY3F","_yrxNar","_yrxeDY","_yrxxFM","_yrxYdQ","_yrxoIx","_yrxXLs","_yrxskY","_yrxOzH","_yrxRHC","_yrxdD_","_yrxF9v","_yrxSQs","_yrxXKo","_yrxe_I","_yrxkdW","_yrxjQZ","_yrxrl5","_yrx9Cs","_yrxwrM","_yrxxuf","_yrxG1y","_yrxBeS","_yrxIR_","_yrxa05","_yrxJzA","_yrxpzH","_yrx2Qi","_yrxlS3","_yrxh$_","_yrxcUJ","_yrxHzD","_yrxkbM","_yrxtjm","_yrxujQ","_yrxQ2N","_yrxyHY","_yrx8_W","_yrx5cB","_yrxcKn","_yrxewE","_yrx3l5","_yrx9ma","_yrxwmT","_yrxPpH","_yrxPTc","_yrxHIr","_yrxJPm","_yrx5TB","_yrxNhj","_yrxzgw","_yrxwNp","_yrx384","_yrxGMB","_yrxOlf","_yrxlLZ","_yrxbmY","_yrx7fF","_yrxByv","_yrxMcz","_yrx5DU","_yrxI_A","_yrxwHl","_yrxCqV","_yrxGUo","_yrx8Bu","_yrxsA9","_yrx2vL","_yrxrmP","_yrxkcn","_yrxnbH","_yrxeCo","_yrxJTd","_yrxGr9","_yrxRFl","_yrxuZX","_yrxLB$","_yrxzfU","_yrxb8Z","_yrxoVn","_yrxs4W","_yrx7Ly","_yrx6MZ","_yrxxzB","_yrxxJf","_yrxfLH","_yrxnaE","_yrxGLk","_yrxsfq","_yrxq1J","_yrx7MS","_yrx_CY","_yrxxs7","_yrxAUK","_yrxysL","_yrxvt0","_yrxvGj","_yrxVZ5","_yrxd6Y","_yrxGFx","_yrxwoX","_yrxMty","_yrxLAe","_yrxVH8","_yrxgny","_yrxGOA","_yrxxZ1","_yrxMtN","_yrxqc0","_yrxryX","_yrxYNU","_yrxCxm","_yrx6eT","_yrxipW","_yrxxh$","_yrx$VN","_yrxAbr","_yrxYXt","_yrxn5J","_yrxyUW","_yrxWNu","_yrxCPn","_yrxrxt","_yrxMqa","_yrxwl9","_yrxpTj","_yrx5ZS","_yrxdUL","_yrxT24","_yrxj6t","_yrxqy3","_yrxeKO","_yrxJtv","_yrxYT$","_yrxQHJ","_yrxkGQ","_yrxH$W","_yrxtlb","_yrxC6E","_yrx6Co","_yrxPoS","_yrxz5E","_yrx_MJ","_yrxCis","_yrxiJr","_yrxbW$","_yrxUCq","_yrx4L6","_yrxrNH","_yrxsbl","_yrxbGf","_yrxUtc","_yrxkAl","_yrxGx4","_yrxKHt","_yrxfzV","_yrxPjI","_yrx9$i","_yrxf8y","_yrxC8m","_yrxpvu","_yrxMYv","_yrxoBI","_yrxXNY","_yrxfop","_yrxlai","_yrxhs4","_yrxt8s","_yrx3vn","_yrxiJ_","_yrxrsz","_yrxy3U","_yrxiyJ","_yrxe95","_yrx1c3","_yrxv6V","_yrxMIW","_yrx3Zr","_yrxXaH","_yrxc9Z","_yrxvnj","_yrxITk","_yrx3gL","_yrxQjp","_yrxF7S","_yrx4nv","_yrxOti","_yrxUew","_yrxZa$","_yrxs1t","_yrxACY","_yrxi0j","_yrxhKn","_yrxBR$","_yrxq1j","_yrxWFn","_yrxAsZ","_yrxIJz","_yrxcGo","_yrxkEO","_yrxBrv","_yrxQlP","_yrxk5W","_yrxQea","_yrx6Tl","_yrxspT","_yrxMdm","_yrxXjK","_yrxSXA","_yrxbhG","_yrxmQM","_yrxHMV","_yrxWfK","_yrxT30","_yrxO$q","_yrxgeN","_yrxfsZ","_yrxRkB","_yrx1oK","_yrx5eX","_yrxBOd","_yrx_FJ","_yrxCKS","_yrx0pK","_yrx8PQ","_yrxVYs","_yrxtID","_yrxQop","_yrxrti","_yrxhpM","_yrxR4J","_yrxSIs","_yrxYue","_yrxaMJ","_yrxm4r","_yrxW9G","_yrxmEn","_yrxp8I","_yrx8Mg","_yrxVCk","_yrx4yh","_yrxu$6","_yrxsKT","_yrxg_C","_yrxTek","_yrx2ls","_yrxJlC","_yrxxlW","_yrxYCT","_yrxYwL","_yrxFMr","_yrx_HZ","_yrxdP_","_yrxib_","_yrxZzn","_yrxoWN","_yrxCr8","_yrxW2V","_yrxq0O","_yrxZDq","_yrxJt6","_yrx4ZB","_yrxDtu","_yrxvws","_yrxFvG","_yrxsXn","_yrxLUO","_yrxmLF","_yrx0aH","_yrxgrL","_yrx$vi","_yrxMjU","_yrxgnz","_yrxH4g","_yrxlAD","_yrxZbF","_yrxZ9O","_yrxyDh","_yrxGQI","_yrxIXE","_yrxlKt","_yrxaMH","_yrxbwQ","_yrx7vl","_yrxcs_","_yrxnQG","_yrxLGi","_yrxqmY","_yrx3$u","_yrxsFd","_yrxsiZ","_yrxRcF","_yrxnm6","_yrxJZB","_yrxSA8","_yrxsmv","_yrx$IW","_yrx6iQ","_yrxCSB","_yrxCSj","_yrxyol","_yrxxb7","_yrx$GK","_yrxtMv","_yrxKyq","_yrxtmC","_yrxRXY","_yrx0bX","_yrxktO","_yrx0Yy","_yrxqmN","_yrxKob","_yrxDyf","_yrxWyR","_yrx0uk","_yrx35v","_yrx_c3","_yrxBhN","_yrxjFS","_yrxZBz","_yrxqir","_yrx1Zm","_yrxWXt","_yrxSiZ","_yrx1pR","_yrxnI6","_yrxgPc","_yrxHzZ","_yrx0AE","_yrxlBA","_yrxZL7","_yrxKTc","_yrxhu3","_yrxKrv","_yrxGEI","_yrxhIk","_yrxVo3","_yrxE8B","_yrx0u2","_yrxoiI","_yrx5Nx","_yrxkbn","_yrxbc_","_yrxnWX","_yrxti2","_yrxYCx","_yrxQ5b","_yrxhqz","_yrxslt","_yrxuQs","_yrx1oc","_yrxgJq","_yrxsXq","_yrxuDZ","_yrxJvd","_yrxARP","_yrxGN1","_yrxIAU","_yrxkzY","_yrxBRE","_yrx6$W","_yrxcCO","_yrxwRb","_yrxKBC","_yrxyRP","_yrxN9H","_yrxiZr","_yrxmOc","_yrxNP$","_yrxFvM","_yrxXFt","_yrxwcB","_yrxDHA","_yrxaTZ","_yrx4nd","_yrxbSu","_yrx8fG","_yrxanS","_yrx4sc","_yrx65U","_yrxWp0","_yrxeCH","_yrx6cf","_yrxRUs","_yrx5Ez","_yrxrpn","_yrxIUj","_yrxmrS","_yrxh4U","_yrx8v4","_yrxJwg","_yrxMAX","_yrxLQa","_yrxCwd","_yrxgUq","_yrxZsd","_yrxwgT","_yrx2CI","_yrxdDM","_yrxq3B","_yrx0$G","_yrxs3D","_yrxYXC","_yrxqXj","_yrxg6c","_yrxzKr","_yrxHqj","_yrxpze","_yrxavz","_yrx0UI","_yrxR9p","_yrxv1m","_yrxo$_","_yrxfZ5","_yrxR$I","_yrxoRY","_yrxXdI","_yrxZaO","_yrxvNs","_yrx94Y","_yrxpwF","_yrxhSJ","_yrx1e0","_yrxBHc","_yrxHWO","_yrxG$u","_yrx_IP","_yrxvgx","_yrx6V8","_yrxJoN","_yrx_sb","_yrxCnA","_yrxxQ3","_yrxIz2","_yrxqe1","_yrxseo","_yrxWvn","_yrxjzR","_yrxSpt","_yrxC3u","_yrxWhC","_yrxL$E","_yrxsNG","_yrxr4R","_yrxP9n","_yrxs_S","_yrxyvu","_yrxp2H","_yrxCc5","_yrxiaz","_yrxbp3","_yrxXDC","_yrxc1W","_yrxqwf","_yrx_Md","_yrxmVv","_yrxAOV","_yrxOFw","_yrx_Jy","_yrx46_","_yrxU$j","_yrxB6t","_yrxgG$","_yrx0kE","_yrxnmu","_yrxXa9","_yrxTS1","_yrxWYB","_yrxydX","_yrxs0x","_yrxVaz","_yrxemL","_yrx8OV","_yrxf6A","_yrxHqN","_yrxHnX","_yrxa0E","_yrxE1m","_yrxcSp","_yrxBsz","_yrxKrH","_yrxuPJ","_yrxx0N","_yrxSRQ","_yrxfEV","_yrxPtQ","_yrxfaI","_yrxuNA","_yrx2jW","_yrxP9Z","_yrxNs6","_yrxRaI","_yrxBUi","_yrxoLR","_yrxcMm","_yrxLWC","_yrxjMy","_yrxyZo","_yrxFX2","_yrxMW1","_yrx5nY","_yrxgcF","_yrxB27","_yrx_t3","_yrxxFN","_yrx5C4","_yrx8O6","_yrxiC8","_yrxUzY","_yrxsf2","_yrxlRr","_yrxmtc","_yrxrFm","_yrxka3","_yrxv8F","_yrxoYx","_yrxtsH","_yrxHDC","_yrxhOy","_yrxEo1","_yrxMmL","_yrxwjf","_yrxLtD","_yrxlWr","_yrxsRq","_yrxk2P","_yrxYUF","_yrx38b","_yrxeDI","_yrxD6s","_yrxlGM","_yrxM7l","_yrxdxm","_yrxZP0","_yrxuKx","_yrxqge","_yrxC2_","_yrxCLW","_yrxe9l","_yrx0SW","_yrx_DI","_yrxAGq","_yrxFBS","_yrxZ5Q","_yrxydK","_yrxcDL","_yrxEvY","_yrxT3X","_yrxwt4","_yrxWFi","_yrxcWt","_yrxX9a","_yrx6$O","_yrxioC","_yrx97k","_yrx5zl","_yrxdFJ","_yrxE78","_yrxmsT","_yrxAMx","_yrx_jm","_yrxtFh","_yrxQpl","_yrxCwc","_yrxWTD","_yrxJo8","_yrx1CB","_yrxE5Q","_yrxK$s","_yrxheq","_yrxxaO","_yrxl9I","_yrxP4e","_yrxOdV","_yrxo91","_yrxsXv","_yrxBIv","_yrxgrQ","_yrxQp3","_yrx_o4","_yrx1ZQ","_yrxTca","_yrx$ik","_yrxW4m","_yrxYfv","_yrxGTH","_yrx3Xx","_yrxvBq","_yrxOkz","_yrxbY0","_yrxvlu","_yrx6kn","_yrxOXt","_yrxDaw","_yrxPkV","_yrx9er","_yrxjGP","_yrxkr0","_yrxIYv","_yrxV9K","_yrxuXS","_yrxrsp","_yrxvAM","_yrxXZW","_yrxixH","_yrx_9X","_yrxW$P","_yrxE$A","_yrxF6D","_yrxQPF","_yrxgnE","_yrxUk5","_yrxgOw","_yrx0kY","_yrx5es","_yrxHi2","_yrxaOF","_yrx5ih","_yrx60p","_yrxJe2","_yrxlXc","_yrxjCx","_yrx5ST","_yrxao0","_yrxNvQ","_yrx58d","_yrxZHQ","_yrxAib","_yrxTDa","_yrxxoi","_yrxoJG","_yrxzyD","_yrxcpE","_yrx6bH","_yrxoHC","_yrxsHn","_yrxSTy","_yrxzYG","_yrxK_u","_yrxBbS","_yrxJy8","_yrxCnq","_yrxlBI","_yrxC_3","_yrxk$S","_yrxXte","_yrxg7A","_yrxwHO","_yrxDJL","_yrxMfm","_yrxt$d","_yrx0Su","_yrx7KW","_yrxVua","_yrx0jZ","_yrx2Wn","_yrx$EP","_yrxCl6","_yrxPEb","_yrx2iR","_yrxqXd","_yrxsCu","_yrxT8A","_yrx6St","_yrxfNC","_yrx0vn","_yrx_rq","_yrxRHu","_yrx70z","_yrxlJu","_yrxFyi","_yrx47w","_yrxhXn","_yrxcd6","_yrxviG","_yrxhu$","_yrxWMk","_yrxCEV","_yrxrv4","_yrxa$v","_yrxE6t","_yrxGbF","_yrxQ19","_yrxOFZ","_yrxOSA","_yrxDSX","_yrxFlt","_yrxXrx","_yrxsCI","_yrxRwv","_yrx9WZ","_yrxAiy","_yrxzXv","_yrx2IV","_yrx58j","_yrxcgQ","_yrxH3P","_yrxPVu","_yrx6LX","_yrxIar","_yrxVYQ","_yrxVSH","_yrxOr6","_yrxR$e","_yrxCxh","_yrxw8g","_yrxrjd","_yrx4G7","_yrxG$g","_yrxDL5","_yrxy6K","_yrxB7w","_yrx0UT","_yrxxEX","_yrxPFL","_yrxUDM","_yrxBqk","_yrxcOX","_yrxVw5","_yrxJLb","_yrx1j0","_yrxV6u","_yrxTcE","_yrx1rx","_yrxVZb","_yrxKDI","_yrxdCW","_yrxoGE","_yrxWMU","_yrxU0T","_yrx6TG","_yrxj$b","_yrxMBG","_yrxM8R","_yrxjHs","_yrxwsM","_yrxKmt","_yrxGhr","_yrxK1p","_yrx2Cy","_yrxKqP","_yrxpnC","_yrxgDT","_yrxpi6","_yrxjYX","_yrxac4","_yrxUva","_yrxkFO","_yrxOz6","_yrx4Lq","_yrxE5J","_yrxRGz","_yrxHaQ","_yrxVCU","_yrxaPy","_yrxzxI","_yrxxyQ","_yrxdGe","_yrxqhC","_yrxcJC","_yrxI9o","_yrxaPr","_yrxf$e","_yrx$ki","_yrxT4k","_yrx4RC","_yrxzO3","_yrxrAG","_yrxR$H"],"_yrxJPo":42,"_yrxw3G":25,"_yrxfMk":2,"_yrxueR":"_yrxh5_","_yrxRNY":"_yrx0N3","_yrxa01":"_yrx_Mu","_yrxesu":"_yrx4vh","_yrxzX3":"_yrxphR","_yrxPh$":"_yrxuIo","_yrxo3Y":"_yrxuHi","_yrxZxk":"_yrxA_W","_yrxyum":"_yrx$re","_yrx1x3":"_yrxBoU","_yrx8LV":"SKqUSREnLma","_yrxpnH":"6IlAN8vwS8G","_yrxc$E":"SDYIJJvVXUgSzuW0plhENg","_yrxOzH":"JXvH5PnmBoa","_yrxAv3":"9cYSTvrLw95znNK8s5SwUa","_yrxJPm":"_yrxrGA","_yrx9XC":103,"_yrx5TB":"_yrx$IW","_yrxqy0":203,"_yrxNhj":"_yrx71e","_yrxgie":203,"_yrxzgw":"_yrxb2c","_yrxIvz":180,"_yrx5El":-15,"aebi":[[],[510,72,82,242,535,334,168,129,535,519,468,338,468,519,502,70,242,298,244,519,398,242,497,261,519,523,401,468,314,219,266,519,347,519,468,332,124,115,162,425,195,242,319,205,245,316,242,47,18,217,417,227,531,212,374,464,204,242,431,415,204,242,431,31,204,242,431,468,250,347,519,10,519,173,140,209,305,306,489,33,519,268,448,242,254,28,519,468,518,215,60,519,165,208,242,214,519,102,385,96,428,330,17,223,481,348,267,524,471,455,4,528,29,428,283,288,285,17,184,418,513,517,251,195,242,519,318,414,519,173,379,242,137,303,189,519,325,457,519,451,242,405,48,519,469,519,299,50,411,209,519,306,182,519,502,333,199,209,232,512,519,282,30,448,209,232,512,519,360,395,519,529,365,372,519,49,350,209,5,86,136,209,143,0,161,209,36,54,141,209,79,134,64,209,159,149,198,333,390,242,306,138,421,80,209,512,247,151,209,38,238,384,209,538,443,200,209,228,122,27,209,132,222,172,242,521,109,519,94,530,519,173,409,21,77,519,492,494,291,412,130,209,452,306,440,257,242,197,28,519,492,249,519,321,242,527,14,519,442,302,242,327,230,519,468,468,346,519,280,533,355,152,435,381,394,294,466,516,183,145,468,410,185,470,144,257,209,135,226,387,257,209,312,506,1,100,337,118,486,445,399,196,361,408,87,157,526,139,194,257,209,312,484,322,257,209,312,233,39,348,206,65,370,534,503,20,148,59,242,142,476,252,375,209,125,25,511,348,505,121,520,123,316,209,187,253,293,348,525,155,265,150,237,242,434,335,474,242,51,478,348,424,40,169,127,209,388,154,235,128,209,515,34,81,176,209,111,119,62,176,209,111,433,446,304,459,242,326,468,43,519,112,242,3,313,310,519,104,333,284,368,436,307,468,519,173,404,351,503,391,290,348,367,69,468,103,112,242,352,292,56,324,242,315,519,323,242,495,396,519,112,242,482,89,519,101,259,203,519,229,203,519,201,348,63,263,271,519,236,358,532,209,389,306,218,519,7,345,449,75,406,519,344,240,258,67,458,193,153,514,274,120,181,450,447,19,348,256,147,460,488,58,301,180,272,331,116,88,243,146,44,281,202,73,519,210,113,519,262,519,461,473,456,519,507,209,329,6,519,507,209,504,373,519,507,242,178,519,280,211,499,295,432,213,348,220,170,105,264,37,519,52,248,519,507,100,188,221,45,209,287,179,311,383,348,463,242,328,519,468,126,422,519,68,519,507,242,23,519,468,369,242,465,296,231,519,156,242,477,519,41,359,158,131,537,225,423,519,277,158,341,133,380,420,519,173,32,340,204,90,107,209,234,491,241,209,84,207,536,209,462,191,437,209,397,517,166,209,356,306,106,33,519,354,74,519,279,519,419,76,519,273,519,362,209,468,519,66,224,439,519,413,382,519,403,490,257,348,522,487,349,255,239,257,29,55,441,91,209,500,222,467,242,480,530,519,173,496,286,348,386,15,24,519,171,519,8,519,110,468,177,519,363,22,498,377,289,348,427,453,117,300,163,393,519,275,444,426,454,24,519,485,2,242,483,366,519,61,472,108,376,92,209,175,306,297,519,475,519,378,501,438,97,209,468,167,364,503,11,357,509,336,493,85,93,242,53,402,519,371,407,57,216,16,13,71,242,270,353,186,429,342,9,242,270,339,519,371,407,26,192,242,519,276,343,209,278,468,246,508,416,309,190,392,83,42,320,519,269,260,209,400,98,519,99,519,173,479,33,519,78,501,430,204,348,164,174,12,35,519,371,114,519,317,95,308,160,242,46,519],[28,39,33,39,77,108,45,100,17,83,56,26,56,80,18,56,32,56,30,66,51,62,56,96,56,68,64,56,56,7,56,35,17,2,56,119,56,61,56,57,56,22,109,76,58,17,36,118,56,46,56,87,89,56,85,104,56,111,93,110,113,91,84,56,6,59,40,110,5,69,102,56,60,56,73,56,73,56,63,56,55,35,108,20,107,17,94,82,88,98,17,15,42,34,13,97,79,33,37,1,123,74,3,25,116,108,75,13,106,69,75,56,8,56,86,65,19,65,17,78,126,17,56,95,11,92,27,23,120,125,110,114,90,47,34,14,17,114,112,44,29,81,115,121,120,70,110,41,90,101,34,50,17,41,56,67,17,16,56,54,56,56,12,24,17,56,9,31,34,75,109,124,75,38,56,72,48,99,21,56,117,110,49,69,122,56,117,17,56,0,71,10,4,105,53,52,103,43,56],[27,22,28,1,10,1,36,1,25,16,8,14,1,9,1,37,41,35,4,13,44,39,12,46,44,26,31,1,1,1,18,44,32,33,1,20,15,7,11,0,6,24,21,29,30,38,44,5,40,23,34,1,2,19,3,1,43,42,44,45,17,1],[3,0,1,2]]};
_yrxR7k ='_yrxdD_';
_yrxJ_8 =[203,103,203,618];
_yrxmEu =aiding_5702(_yrxays, _yrxVMl, _yrxR7k, _yrxJ_8);
_yrxTY4 = _yrxmEu
// _yrxrqQ = _yrxrqQ['concat'](_yrxcze, _yrxBXT(775, _yrx7jl) ? 1 : 0, _yrxyqC || 0, _yrxBXT(789))// _yrxBXT(775, _yrx7jl) 并不影响什么// _yrxyqC 值是 undefined
_yrxrqQ = _yrxrqQ['concat'](_yrxcze,0,0,_yrxBXT(789))// _yrxK$4 检测了document["characterSet"]// _yrx2LR = _yrxK$4 + _yrxmEu + _yrxwbi(_yrxrqQ)
_yrx2LR =''+ _yrxmEu +_yrxwbi(_yrxrqQ)
_yrxs7K ='m';return _yrx2LR
}if(_yrx4Aj ===746){var _yrxrqQ =_yrxlo_(_yrx1_p());var _yrx$Kn =_yrxBXT(708, _yrxrqQ)var _yrxmEu = _yrx$Kn[1]return}if(_yrx4Aj ===708){_yrxY1C=function(){return'23fnaorei32nfahiof2nfiahra2fniawni2Nhifdqnari2FWN2N'};var _yrxrqQ = _yrxY1C;var _yrx$Kn =''// var _yrxmEu = _yrxu8d(_yrxMKL(_yrxQXy))// _yrxQXy 为字符串 "T"// _yrxMKL(_yrxQXy) 返回字符串 "SE00aFVCVDBkRE9uMTYyVD0="// _yrxu8d(...) 匹配 cookie 中是否包含 "SE00aFVCVDBkRE9uMTYyVD0=" 字段// 可能是检测环境有问题 cookie 中才会包含这个字段var _yrxmEu =undefined;// _yrxmEu = 'å¦çˆ¬è™«å°±é€‰_yrx';return[_yrxrqQ,'','','']}if(_yrx4Aj ===775){// 这个指令并没有什么卵用
_yrx$Kn = _yrxQXc["createElement"]("a");
_yrx$Kn["href"]= _yrxCcG["href"];
_yrxmEu = _yrxQXc["createElement"]("a");
_yrxmEu["href"]= _yrx7jl;
_yrxmEu["href"]= _yrxmEu['href'];
_yrxrqQ = _yrx$Kn["protocol"]+"//"+ _yrx$Kn["host"]!== _yrxmEu['protocol']+"//"+ _yrxmEu['host']return _yrxrqQ
}if(_yrx4Aj ===789){var _yrxrqQ =_yrxlo_(_yrx1_p())return_yrxWKg(_yrxrqQ)["slice"](0,8)}}
坑点
eval 函数内的代码
_yrxVhD() 方法
方法中对应的时间戳是动态变化的,包括后面的全局变量 _yrxCxm 的值也是动态变化的
function_yrxVhD(_yrxtJ1){return 拿到动态的变化的时间戳 + 拿到动态的值
}
_yrxM3E() 方法
方法中 var yrxC2 = 195 + _yrxCxm[‘f’ + ‘g’ + ‘a’ + ‘E’];
+左边的数值是动态变化的
_yrxCxm[‘f’ + ‘g’ + ‘a’ + ‘E’] 的值和 _yrxVhD() 方法中的值一致
function_yrxM3E(_yrxvAM){var _yrxC2_ = 要匹配的动态的数值 + _yrxCxm['f'+'g'+'a'+'E'];// ......}
_yrxa$o() 方法
与 _yrxM3E() 方法一致, + 左边的数值是动态变化的
_yrxCxm[‘f’ + ‘g’ + ‘a’ + ‘E’] 的值和 _yrxVhD() 方法中的值一致
function_yrxa$o(_yrxtJ1){var _yrxmbl = 要匹配的动态的数值 + _yrxCxm['f'+'g'+'a'+'E'];// ......}
_yrxCxm[‘E’ + ‘c’ + ‘A’ + ‘b’]
这个变量对应初始的值在请求主页的时候能查看到,具体的匹配规则为
初始值
yuanrenxue_59 = re.findall('var yuanrenxue_59=(\d+);', response.text)[0]
变化规律
每次请求完数据接口后回返回一个 k 字段,后续会随着这个 k 字段中的数值改变
获取 eval() 函数内的代码
js 模板代码
window = global;setInterval=function(){};// 代码不会阻塞var text;
_log = console.log;// console.log 被置空了eval=function(val){
text = val;returnundefined};// toString 格式化检测
eval.toString=function(){return'function eval() { [native code] }'};// rs.js 代码(rs.js代码不是动态的,我是直接copy进模板文件的,代码太长所以并没有复制进来)// 如果调用的时候总报错,就是 rs.js 代码的问题,还是比较建议直接复制进来的// rsnkw2ksph// 主页自执行functionsdk(){return text
}_log(sdk())
对应 python 代码
defsend_index():# 主页
url ="https://match.yuanrenxue.cn/match/10"
response = requests.get(url, headers=headers, cookies=cookies)# 主页自执行函数匹配
execution_func = re.findall('<script type="text/javascript"r="m">(.*?)</script>', response.text)[0]# rsnkw2ksph 文件(动态的必须请求拿到)
url ="https://match.yuanrenxue.cn/stati/mu/rsnkw2ksph"
rsnkw2ksph = requests.get(url, headers=headers, cookies=cookies).content.decode()withopen('js模板代码路径', mode='r', encoding='utf-8')as f:
js_code = f.read()# 替换
js_code = js_code.replace('// rsnkw2ksph', rsnkw2ksph +';')
js_code = js_code.replace('// 主页自执行', execution_func +';')# 新建文件withopen('new_file.js', mode='w', encoding='utf-8')as f:
f.write(js_code)# 获取 主页 中的值
meta = re.findall('<meta content="(.*?)"', response.text)[0]# 主页 meta 标签的值
yuanrenxue_59 = re.findall('var yuanrenxue_59=(\d+);', response.text)[0]# _yrxCxm['E' + 'c' + 'A' + 'b'] 变量首次的值# 获取 eval 中的值
output = subprocess.check_output("node new_file.js")
time_strap = re.findall("function _yrxVhD\(.*?\)\{return (\d+) \+", output)[0]# 匹配 _yrxVhD() 函数需要用到的时间戳
_yrxao = re.findall("function _yrxa\$o\(_yrxtJ1\)\{var _yrxmbl=(\d+) \+", output)[0]# _yrxa$o 函数中需要用到的数值
_yrxM3E = re.findall("function _yrxM3E\(_yrxvAM\)\{var _yrxC2_=(\d+) +", output)[0]# _yrxM3E 函数中需要用到的数值
os.remove('new_file.js')# 删除对应的文件return meta, yuanrenxue_59, time_strap, _yrxao, _yrxM3E
版权归原作者 Spider小郭 所有, 如有侵权,请联系我们删除。