作者:虚坏叔叔
博客:https://xuhss.com
早餐店不会开到晚上,想吃的人早就来了!😄
Js逆向教程18-l参数分解
一、l参数分解
可以看到l
是一个大数组。
里面有很多字节码
V[$_CAIAt(353)](gt[$_CAIAt(218)](o), r[$_CAIAt(756)]())
通过字符串还原
V['encrypt'](gt['stringify'](o), r['$_CCEc']())
然后看o。
{
"lang": "zh-cn",
"userresponse": "933de",
"passtime": 389,
"imgload": 94,
"aa": "d(!!Rssssts_t0stsssssw(!!(p119bMb1EL9A20992$)7",
"ep": {
"v": "7.8.9",
"$_BIB": false,
"me": true,
"tm": {
"a": 1670029641384,
"b": 0,
"c": 0,
"d": 0,
"e": 0,
"f": 1670029641403,
"g": 1670029642076,
"h": 1670029642081,
"i": 1670029642081,
"j": 1670029642148,
"k": 1670029642114,
"l": 1670029642148,
"m": 1670029642584,
"n": 1670029642584,
"o": 1670029642587,
"p": 1670029643105,
"q": 1670029643105,
"r": 1670029643106,
"s": 1670029643176,
"t": 1670029643176,
"u": 1670029643176
},
"td": -1
},
"da0j": "1302126368",
"rp": "acc4a24ed1c0c673bea52dfafc3b2ba6"
}
并且再次启动 这个o会改变。
{
"lang": "zh-cn",
"userresponse": "c088800c0c22e1",
"passtime": 335,
"imgload": 85,
"aa": "N,,(!!Twwvtsv9sL*ts~s~ssvt)vsw(!!(K:1DW92092D:9:0911E8E1::",
"ep": {
"v": "7.8.9",
"$_BIB": false,
"me": true,
"tm": {
"a": 1670032125609,
"b": 1670032126117,
"c": 1670032126117,
"d": 0,
"e": 0,
"f": 1670032125616,
"g": 1670032125621,
"h": 1670032125622,
"i": 1670032125622,
"j": 1670032125677,
"k": 1670032125647,
"l": 1670032125678,
"m": 1670032126111,
"n": 1670032126112,
"o": 1670032126119,
"p": 1670032126334,
"q": 1670032126334,
"r": 1670032126336,
"s": 1670032126409,
"t": 1670032126409,
"u": 1670032126409
},
"td": -1
},
"da0j": "1302126368",
"rp": "4940a9ff07828eb819bc8534cda69ac2"
}
对比下来,有如下参数会变动
- userresponse
- imgload
- aa 可以猜测aa就是滑动轨迹。
- rp
二、aa轨迹值得获取
aa是通过e
赋值的,e
是函数的参数
通过堆栈可以看到它是由l
传过来的:
再次调试 跟到这个l
计算的地方
l = n[$_DAAAV(913)][$_DAAAV(1059)](n[$_DAAAV(913)][$_CJJJb(1066)](), n[$_DAAAV(69)][$_CJJJb(1097)], n[$_DAAAV(69)][$_CJJJb(319)]);
还原“
l = n['$_CICM']['$_BBEM'](n['$_CICM']['$_FDU'](), n['$_CJa']['c'], n['$_CJa']['s']);
可以看出来,这是一个方法传递3个参数,将参数还原出来
第一个参数得到的是已经编码好的值 是和轨迹相关的。
n['$_CICM']['$_FDU']()
'U-!!Lxusttttst(ysttsttstt!!(S2891912028112011192'
第二个参数是直接获取的,这数据是从get.php请求里面获取的c
n['$_CJa']['c']
(9) [12, 58, 98, 36, 43, 95, 62, 15, 12]
第三个参数是js的crc版本数据校验值 是从get.php请求里面获取的s
n['$_CJa']['s']
'3a39574c'
2.1参数破解
确定了第一个参数是轨迹相关之后 可以进到这个函数里面 看一下轨迹是如何计算出的。
"\u0024\u005f\u0046\u0044\u0055": function() {
var $_BEGJO = QBLnx.$_CM
, $_BEGIl = ['$_BEHCE'].concat($_BEGJO)
, $_BEHAL = $_BEGIl[1];
$_BEGIl.shift();
var $_BEHBJ = $_BEGIl[0];
function n(t) {
var $_DBEAP = QBLnx.$_Db()[3][19];
for (; $_DBEAP !== QBLnx.$_Db()[12][17]; ) {
switch ($_DBEAP) {
case QBLnx.$_Db()[0][19]:
var e = $_BEGJO(447)
, n = e[$_BEGJO(125)]
, r = $_BEGJO(15)
, i = Math[$_BEGJO(360)](t)
, o = parseInt(i / n);
n <= o && (o = n - 1),
o && (r = e[$_BEGJO(187)](o));
$_DBEAP = QBLnx.$_Db()[12][18];
break;
case QBLnx.$_Db()[9][18]:
var s = $_BEHAL(15);
return t < 0 && (s += $_BEHAL(474)),
r && (s += $_BEGJO(411)),
s + r + e[$_BEGJO(187)](i %= n);
break;
}
}
}
var t = function(t) {
var $_BEHET = QBLnx.$_CM
, $_BEHDy = ['$_BEHHD'].concat($_BEHET)
, $_BEHFo = $_BEHDy[1];
$_BEHDy.shift();
var $_BEHGR = $_BEHDy[0];
for (var e, n, r, i = [], o = 0, s = 0, a = t[$_BEHET(125)] - 1; s < a; s++)
e = Math[$_BEHET(129)](t[s + 1][0] - t[s][0]),
n = Math[$_BEHFo(129)](t[s + 1][1] - t[s][1]),
r = Math[$_BEHET(129)](t[s + 1][2] - t[s][2]),
0 == e && 0 == n && 0 == r || (0 == e && 0 == n ? o += r : (i[$_BEHET(173)]([e, n, r + o]),
o = 0));
return 0 !== o && i[$_BEHET(173)]([e, n, o]),
i;
}(this[$_BEHAL(343)])
, r = []
, i = []
, o = [];
return new ct(t)[$_BEHAL(20)](function(t) {
var $_BEHJs = QBLnx.$_CM
, $_BEHIl = ['$_BEICx'].concat($_BEHJs)
, $_BEIAy = $_BEHIl[1];
$_BEHIl.shift();
var $_BEIBp = $_BEHIl[0];
var e = function(t) {
var $_BEIEr = QBLnx.$_CM
, $_BEIDP = ['$_BEIHs'].concat($_BEIEr)
, $_BEIFF = $_BEIDP[1];
$_BEIDP.shift();
var $_BEIGe = $_BEIDP[0];
for (var e = [[1, 0], [2, 0], [1, -1], [1, 1], [0, 1], [0, -1], [3, 0], [2, -1], [2, 1]], n = 0, r = e[$_BEIEr(125)]; n < r; n++)
if (t[0] == e[n][0] && t[1] == e[n][1])
return $_BEIFF(406)[n];
return 0;
}(t);
e ? i[$_BEHJs(173)](e) : (r[$_BEHJs(173)](n(t[0])),
i[$_BEIAy(173)](n(t[1]))),
o[$_BEIAy(173)](n(t[2]));
}),
r[$_BEGJO(421)]($_BEGJO(15)) + $_BEGJO(452) + i[$_BEGJO(421)]($_BEGJO(15)) + $_BEHAL(452) + o[$_BEGJO(421)]($_BEGJO(15));
}
折叠代码看的更加清楚
调试进去可以看到t存的是坐标,它是一个数组
然后,对单个坐标进行处理:
最终返回如下:
r[$_BEGJO(421)]($_BEGJO(15)) + $_BEGJO(452) + i[$_BEGJO(421)]($_BEGJO(15)) + $_BEHAL(452) + o[$_BEGJO(421)]($_BEGJO(15));
还原:
r['join']('') + '!!' + i['join']('') + '!!' + o['join']('');
40:00
所以需要将这段代码抠出来,传递轨迹进去,就能够得到加密的字符串
它需要将轨迹参数传递进去:轨迹转换成字符串
'[[-37,-25,0],[0,0,0],[1,-1,4],[2,-1,13],[3,-1,21],[6,-2,29],[6,-2,37],[7,-3,53],[8,-3,61],[10,-3,69],[10,-3,77],[11,-3,93],[14,-3,100],[15,-3,109],[15,-3,117],[19,-3,125],[21,-3,133],[24,-3,142],[27,-3,149],[30,-3,158],[31,-3,165],[34,-3,173],[35,-3,181],[35,-3,189],[36,-3,198],[36,-3,310]]'
这个时候,将这个数组作为字符串,传递到window.get_track()函数 可以获得一个加密的结果:
2.2函数破解
函数在这里:
搜索一下,都在一块代码里面 我们可以将这个函数也导出去:
window.get_track = W[$_CJFA(230)]["\u0024\u005f\u0046\u0044\u0055"];
window.get_method = W[$_CJFA(230)]["\u0024\u005f\u0042\u0042\u0045\u004d"];
总结
最后的最后
由本人水平所限,难免有错误以及不足之处, 屏幕前的靓仔靓女们 如有发现,恳请指出!
最后,谢谢你看到这里,谢谢你认真对待我的努力,希望这篇博客对你有所帮助!
你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星!
💬 往期优质文章分享
- C++ QT结合FFmpeg实战开发视频播放器-01环境的安装和项目部署
- 解决QT问题:运行qmake:Project ERROR: Cannot run compiler ‘cl‘. Output:
- 解决安装QT后MSVC2015 64bit配置无编译器和调试器问题
- Qt中的套件提示no complier set in kit和no debugger,出现黄色感叹号问题解决(MSVC2017)
- Python+selenium 自动化 - 实现自动导入、上传外部文件(不弹出windows窗口)
🚀 优质教程分享 🚀
- 🎄如果感觉文章看完了不过瘾,可以来我的其他 专栏 看一下哦~
- 🎄比如以下几个专栏:Python实战微信订餐小程序、Python量化交易实战、C++ QT实战类项目 和 算法学习专栏
- 🎄可以学习更多的关于C++/Python的相关内容哦!直接点击下面颜色字体就可以跳转啦!
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战 💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
❤️ C++ QT结合FFmpeg实战开发视频播放器❤️ | 难度偏高 | 分享学习QT成品的视频播放器源码,需要有扎实的C++知识! |
💚 游戏爱好者九万人社区💚 | 互助/吹水 | 九万人游戏爱好者社区,聊天互助,白嫖奖品 |
💙 Python零基础到入门 💙 | Python初学者 | 针对没有经过系统学习的小伙伴,核心目的就是让我们能够快速学习Python的知识以达到入门 |
🚀 资料白嫖,温馨提示 🚀
关注下面卡片即刻获取更多编程知识,包括各种语言学习资料,上千套PPT模板和各种游戏源码素材等等资料。更多内容可自行查看哦!