前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬了一个“此地无银三百两”的网页

爬了一个“此地无银三百两”的网页

作者头像
偶尔敲代码
发布2023-12-14 08:31:51
1810
发布2023-12-14 08:31:51
举报
文章被收录于专栏:偶尔敲代码

某年某月某一天,爬某个网站的时候,返回了一堆乱码,然后右键查看网页源代码,发现一堆被编码过的字符串,也看不到我想爬的内容,类似下图这样。

明摆着这是加密了,有百分号%看着是url编码,但直接去解码结果又是乱码。观察<script id='crypt_eval_js'>的 _0x5cef 有个返回值,结合第12行的命令,在控制台直接输出_0x5cef('0x0') 和 _0x5cef('0x1') :

整那么几行,就是为了返回 _0x42d7 的成员 write 或 reverse ,字面上看可能有对字符串进行反转和写入的操作,多少有点“吓”到我了哈哈。

那就让ChatGPT弄个简单网页,代码如下:

代码语言:javascript
复制
<!DOCTYPE html>
<html>
<head>
    <title>偶尔敲代码</title>
    <style>
        body {
            margin: 0;
            padding: 0;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            background-size: cover;
            background-position: center;
            background-repeat: no-repeat;
        }

        .welcome-text {
            font-size: 36px; /* 调整字体大小 */
            color: red;
            text-align: center;
            text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
        }
</style>
</head>
<body>
    <div class="welcome-text">
   
    </div>
</body>
</html>

对上面的网页源码进行url编码,再将编码后的网页源码文本进行反转,放入到 html 变量里,加上这个网站其他花里胡哨的代码,成为下面这样:

代码语言:javascript
复制
<!DOCTYPE html>
<script id='crypt_html_js'>
  var html = 'E3%lmthF2%C3%A0%E3%ydobF2%C3%A0%E3%vidF2%C3%02%02%02%02%A0%18%0A%7E%3A%BB%4E%2B%59%6E%49%0B%5E%6B%18%5E%A9%CB%FE%7B%F8%5E%79%CB%4E%CA%58%5E%1A%FB%4E%EA%EB%5E%8A%3B%6E%3B%58%5E%E8%FB%8E%2A%CA%6E%02%02%02%02%02%02%02%02%A0%E3%22%txet-emoclew22%D3%ssalc02%vidC3%02%02%02%02%A0%E3%ydobC3%A0%E3%daehF2%C3%A0%E3%elytsF2%C3%02%02%02%02%A0%D7%02%02%02%02%02%02%02%02%A0%B3%)5.002%C2%002%C2%002%C2%0(abgr02%xp402%xp202%xp202%A3%wodahs-txet02%02%02%02%02%02%02%02%02%02%02%02%A0%B3%retnec02%A3%ngila-txet02%02%02%02%02%02%02%02%02%02%02%02%A0%B3%der02%A3%roloc02%02%02%02%02%02%02%02%02%02%02%02%A0%F2%*02%F8%0B%5E%7A%4A%5E%39%DB%4E%79%DA%5E%4B%59%6E%38%0B%8E%02%*F2%02%B3%xp6302%A3%ezis-tnof02%02%02%02%02%02%02%02%02%02%02%02%A0%B7%02%txet-emoclew.02%02%02%02%02%02%02%02%A0%A0%D7%02%02%02%02%02%02%02%02%A0%B3%taeper-on02%A3%taeper-dnuorgkcab02%02%02%02%02%02%02%02%02%02%02%02%A0%B3%retnec02%A3%noitisop-dnuorgkcab02%02%02%02%02%02%02%02%02%02%02%02%A0%B3%revoc02%A3%ezis-dnuorgkcab02%02%02%02%02%02%02%02%02%02%02%02%A0%B3%hv00102%A3%thgieh02%02%02%02%02%02%02%02%02%02%02%02%A0%B3%retnec02%A3%smeti-ngila02%02%02%02%02%02%02%02%02%02%02%02%A0%B3%retnec02%A3%tnetnoc-yfitsuj02%02%02%02%02%02%02%02%02%02%02%02%A0%B3%xelf02%A3%yalpsid02%02%02%02%02%02%02%02%02%02%02%02%A0%B3%002%A3%gniddap02%02%02%02%02%02%02%02%02%02%02%02%A0%B3%002%A3%nigram02%02%02%02%02%02%02%02%02%02%02%02%A0%B7%02%ydob02%02%02%02%02%02%02%02%A0%E3%elytsC3%02%02%02%02%A0%E3%eltitF2%C3%18%0A%7E%3A%BB%4E%2B%59%6E%49%0B%5E%6B%18%5E%E3%eltitC3%02%02%02%02%A0%E3%daehC3%A0%E3%lmthC3%A0%E3%lmth02%EPYTCOD!C3%';
</script>
<script id='crypt_eval_js'>
  var _0x42d7 = ['write', 'reverse'];
  var _0x5cef = function(_0x42d7d2, _0x5cefe4) {
    _0x42d7d2 = _0x42d7d2 - 0x0;
    var _0x950fea = _0x42d7[_0x42d7d2];
    return _0x950fea;
  };
  document[_0x5cef('0x0')](decodeURIComponent(html['split']('')[_0x5cef('0x1')]()['join'](''))); ['sojson.v4']['filter']['constructor'](((['sojson.v4'] + [])['constructor']['fromCharCode']['apply'](null, '40P102t117j110T99z116Z105B111y110X40K41Y123E102O117X110o99g116B105I111V110q32g120c40q105s100i41x123i108F101j116N32D99i104u115B61G100K111G99z117l109C101c110t116A46E103e101s116H69Y108N101o109N101f110p116t66V121r73s100b40o105g100g41h59M99Z104p115B46M112r97P114R101o110q116A78F111o100W101F46c114D101m109p111m118g101j67G104q105B108M100o40e99v104W115J41n125x120d40V39r99J114r121p112Y116c95Q104X116c109z108P95x106U115k39Y41g59e120N40Z39C99b114w121o112m116K95L101l118u97r108V95D106l115G39a41n59d125D41r40L41' ['split'](/[a-zA-Z]{1,}/))))('sojson.v4');
</script>

保存成html文件,直接运行,果然就是正常的网页。

既然编码加密后的源码是明确放在 html 变量里了,继续看看代码中第12行是怎么解密并让网页成功渲染的:

代码语言:javascript
复制
 document[_0x5cef('0x0')](decodeURIComponent(html['split']('')[_0x5cef('0x1')]()['join']('')));

在控制台输出一下 decodeURIComponent 后的结果可以看出前面的分析没错

如果一步步分解,步骤大概是:

1. 使用split('')方法将变量 html 按字符拆分成数组;

2. 对拆分后的数组调用函数_0x5cef('0x1'),获取到数组中索引为1的元素,即字符串'reverse',将数组反转;

3. 使用join('')方法将反转后的数组重新合并为一个字符串;

4. 使用decodeURIComponent函数对合并后的字符串进行解码;

5. document[_0x5cef('0x0')](...)调用函数_0x5cef('0x0'),获取数组中索引为0的元素,即字符串'write'。

所以第12行代码翻译成明文就是:

代码语言:javascript
复制
document['write'](decodeURIComponent(html['split']('')['reverse']()['join']('')));

<script id='crypt_eval_js'> 就用不上了。

所以这个网页主要是对编码字符串进行解码,并将解码后的内容通过document.write()方法输出到网页中。虽然它表面上不想让人爬取页面上的信息,把内容反转又编码的,但这一分析它就把网页放在最显眼的变量里,有种“此地无银三百两”的感觉了。

当时一开始爬取的时候,确实让我卡壳了一下,以为是很复杂的加密,最终也算解决了,做个简单记录分享~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 偶尔敲代码 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档