作者:虚坏叔叔
博客:https://xuhss.com
早餐店不会开到晚上,想吃的人早就来了!😄
可以看到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"
}
对比下来,有如下参数会变动
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'
确定了第一个参数是轨迹相关之后 可以进到这个函数里面 看一下轨迹是如何计算出的。
"\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()函数 可以获得一个加密的结果:
函数在这里:
搜索一下,都在一块代码里面 我们可以将这个函数也导出去:
window.get_track = W[$_CJFA(230)]["\u0024\u005f\u0046\u0044\u0055"];window.get_method = W[$_CJFA(230)]["\u0024\u005f\u0042\u0042\u0045\u004d"];
最后的最后
由本人水平所限,难免有错误以及不足之处, 屏幕前的靓仔靓女们 如有发现,恳请指出!
最后,谢谢你看到这里,谢谢你认真对待我的努力,希望这篇博客对你有所帮助!
你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星!
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
🧡 Python实战微信订餐小程序 🧡 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
💛Python量化交易实战 💛 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
❤️ C++ QT结合FFmpeg实战开发视频播放器❤️ | 难度偏高 | 分享学习QT成品的视频播放器源码,需要有扎实的C++知识! |
💚 游戏爱好者九万人社区💚 | 互助/吹水 | 九万人游戏爱好者社区,聊天互助,白嫖奖品 |
💙 Python零基础到入门 💙 | Python初学者 | 针对没有经过系统学习的小伙伴,核心目的就是让我们能够快速学习Python的知识以达到入门 |
关注下面卡片即刻获取更多编程知识,包括各种语言学习资料,上千套PPT模板和各种游戏源码素材等等资料。更多内容可自行查看哦!