文章目录
- 调试干扰
- 第一个 debugger
- Hook 代码
- 第二个 debugger
- Hook 代码
- 第三个 Function.constructor.prototype 检测
- Hook 代码
- 完整的 Hook 代码
- 接口分析
- 加密参数 m 生成位置
- 加密参数还原
- 加密点
- 扣代码提示
- _yrxyA\$()
- var _yrxmEu = _yrxWKg(_yrxyHJ....
- _yrxWKg()
- let result = _yrxBXT(779, ....
- 坑点
- eval 函数内的代码
- _yrxVhD() 方法
- _yrxM3E() 方法
- _yrxa$o() 方法
- _yrxCxm['E' + 'c' + 'A' + 'b']
- 初始值
- 变化规律
- 获取 eval() 函数内的代码
调试干扰
第一个 debugger
进入题目,打开开发者工具,就会有 debugger
查看上一层堆栈, 一个匿名函数执行的 Function(arguments[0] + “bugger”)()
继续查看上一层堆栈,就能看到生成 debugger 的代码段
手动解混淆后可以看到生成的逻辑
(其实查看上第一层堆栈就能看得出是由 Function 生成的 debugger)
(function (yuanrenxue_222) {
return function (yuanrenxue_222) {
if (('i1iliI' !== 'I1iIii')) {
// yuanrenxue_222 为传进来的参数 'bugger'
return Function((('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
接口分析
数据接口 https://match.yuanrenxue.cn/api/match/10
请求参数
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
}
改写
function sdk(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;
return undefined
};
// toString 格式化检测
eval.toString = function (){return 'function eval() { [native code] }'};
// rs.js 代码(rs.js代码不是动态的,我是直接copy进模板文件的,代码太长所以并没有复制进来)
// 如果调用的时候总报错,就是 rs.js 代码的问题,还是比较建议直接复制进来的
// rsnkw2ksph
// 主页自执行
function sdk(){
return text
}
_log(sdk())
对应 python 代码
def send_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()
with open('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 + ';')
# 新建文件
with open('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