⛳️ 看漫画MHG mhgui 实战分析

本文所有MHG使用 MHG 替代~

本次爬虫采集的案例是MHG,该站点貌似本身就游走在法律的边缘。

站点地址直接检索即可进入,在该目标站点,橡皮擦发现了 eval 加密的双重用法。

页面所有点位都无太大难点,而且漫画超多,但是当点击详情页的时候,发现加密点位了。

https://i.看评论区.com/ps1/u/17287/cmdty/第01话/3.jpg.webp?e=1654230046&m=T-uqjbcgI-eyVGgsIsnjLw

其中比较关键的就是参数 m,其余参数都比较容易猜到其含义。

  • 第01话:第一话;
  • e:时间戳。

通过开发者工具的 DOM 事件绑定器

找到下一页按钮点击事件,然后在下述位置添加断点。

通过该断点调试,发现参数在页面加载时已经生成,继续寻找的意义不大,接下来要更换思路。

全局检索关键字 m=,查看所有搜索结果之后,最终定位到 config.js 文件,即下图代码高亮位置。

截取相应的代码文件

如下所示,这代码一眼看上去就能猜测是 eval 加密,但是其关键信息,例如 window["\x65\x76\x61\x6c"] 还是存在加密,下面我们优先解决该值。

window["\x65\x76\x61\x6c"](function(i, k, a, n, m, an) {
    m = function(a) {
        return (a < k ? "" : m(window["\x70\x61\x72\x73\x65\x49\x6e\x74"](a / k)))   ((a = a % k) > 35 ? window["\x53\x74\x72\x69\x6e\x67"]["\x66\x72\x6f\x6d\x43\x68\x61\x72\x43\x6f\x64\x65"](a   29) : a["\x74\x6f\x53\x74\x72\x69\x6e\x67"](36))
    }
    ;
    if (!''["\x72\x65\x70\x6c\x61\x63\x65"](/^/, window["\x53\x74\x72\x69\x6e\x67"])) {
        while (a--)
            an[m(a)] = n[a] || m(a);
        n = [function(m) {
            return an[m]
        }
        ];
        m = function() {
            return '\\\x77\x2b'
        }
        ;
        a = 1
    }
    ;while (a--)
        if (n[a])
            i = i["\x72\x65\x70\x6c\x61\x63\x65"](new window["\x52\x65\x67\x45\x78\x70"]('\\\x62'   m(a)   '\\\x62','\x67'), n[a]);
    return i
}('\x72 \x41\x3d\x28\x78\x28\x29\x7b\x72 \x6c\x69\x74"]('\x7c'), 0, {}));

别看上述代码长,但是当我使用在线工具解密之后,得到了下面一段代码。

function(f){return LZString.decompressFromBase64(this).split(f)}

但是这里并没有前文的关键字参数 m=T-uqjbcgI-eyVGgsIsnjLw,接下来我们在源码中查看一下,看是否存在关键性信息。

得到的代码段如下所示

window["\x65\x76\x61\x6c"](
  (function (p, a, c, k, e, d) {
    e = function (c) {
      return (
        (c < a ? "" : e(parseInt(c / a)))  
        ((c = c % a) > 35 ? String.fromCharCode(c   29) : c.toString(36))
      );
    };
    if (!"".replace(/^/, String)) {
      while (c--) d[e(c)] = k[c] || e(c);
      k = [
        function (e) {
          return d[e];
        },
      ];
      e = function () {
        return "\\w ";
      };
      c = 1;
    }
    while (c--)
      if (k[c]) p = p.replace(new RegExp("\\b"   e(c)   "\\b", "g"), k[c]);
    return p;
  })(
    'U.k({"F":i,"E":"D","C":"i.a","B":A,"z":"f","y":["1.a.b","2.a.b","3.a.b","4.a.b","5.a.b","6.a.b","7.a.b","8.a.b","9.a.b","%x%w%v%c%t%G%d%g%h%r.4.1%q.a.b","%p%j%o%c%j%n%c%l%I%d%H%P%d%g%h.a.b"],"J":W,"Y":11,"Z":"/12/u/X/V/f/","10":1,"S":"","R":Q,"O":0,"N":{"e":M,"m":"T-L-K"}}).s();',
    62,
    65,
    "D41hWAODmwO4FMBGlgFECs6CcJA03gAwCMgu9HACCRwAQlgMzbYBMVAHNcAJYC20AIgEMALgOCtWIbADFg2DmgBswJriasWwSACcEASQB2nIbLqSAwjT7oALMABmnADYIAzsADG gdwTAMGVgB2YI9OABNgFE53YEBIm0ANvMAQt0BavUBbtUivH0jwsTYsViUHQxcACwQIhABPADUAcWgXXRd9cAAZOGAAVwBHcCR3aF1gIgUMayY6AgJrJRdHTR0AN10I1it/IMCJfQQADyEVyMcAe3cAawB9dxjgAGUAWQAJD24woUr7AUcXXyJAtUCwGc k0whKwBcIiEnTcmhcRCAA="[
      "\x73\x70\x6c\x69\x63"
    ]("\x7c"),
    0,
    {}
  )
);

此时关键信息逐渐出现,我们重点解密该代码段即可。

eval 函数解析

直接使用 eval 函数解析上述代码,发现出现如下错误。

但是 \x65\x76\x61\x6c 可以解码为 eval

console.log('\x65\x76\x61\x6c')
16:42:45.372 VM251:1 eval

但是下述这段代码出现了问题。

在结合刚才我们得到的一个莫名的加密函数。

function(f){return LZString.decompressFromBase64(this).split(f)}

可以试着用 Python 解密一下上述代码段,而且 Python 中恰好有同名第三方模块。

pip install lzstring

直接解密加密字符串即可。

import lzstring
x = lzstring.LZString()
decompressed = x.decompressFromBase64(
    'D41hWAODmwO4FMBGlgF加密字符串AA=')
print(decompressed)

得到的信息如下所示,变得越来越清楚了。

||||||||||jpg|webp|E5|E9||第01话|A1|B5|39921|8B|imgData|88||9F|9B|E6|29|2821|preInit|93||9C|BD|E4|files|cname|558777|cid|bpic|沉默的庭园|bname|bid|81|85|86|finished|eyVGgsIsnjLw|uqjbcgI|1654230046|sl|prevId|8D|558778|nextId|block_cc||S
MH|cmdty|false|17287|len|path|status||ps1

此时还是无法得到最终的答案,然后可以看到代码结构发现下述规律,即代码出现了相似的部分,并且都是 eval。

细心环节,将代码一点点翻译成可逆向的

lzstring 解密字符串,然后手动使用 split 函数进行分隔,因为上述代码 \x73\x70\x6c\x69\x63 解析出来竟然是 splic 函数。

谷歌开发者工具的控制台中运行下述代码即可。

"||||||||||jpg|webp|E5|E9||第01话|A1|B5|39921|8B|imgData|88||9F|9B|E6|29|2821|preInit|93||9C|BD|E4|files|cname|558777|cid|bpic|沉默的庭园|bname|bid|81|85|86|finished|eyVGgsIsnjLw|uqjbcgI|1654230046|sl|prevId|8D|558778|nextId|block_cc||SMH|cmdty|false|17287|len|path|status||ps1".split(
  "|"
);

得到的信息如下所示。

[
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "",
  "jpg",
  "webp",
  "E5",
  "E9",
  "",
  "第01话",
  "A1",
  "B5",
  "39921",
  "8B",
  "imgData",
  "88",
  "",
  "9F",
  "9B",
  "E6",
  "29",
  "2821",
  "preInit",
  "93",
  "",
  "9C",
  "BD",
  "E4",
  "files",
  "cname",
  "558777",
  "cid",
  "bpic",
  "沉默的庭园",
  "bname",
  "bid",
  "81",
  "85",
  "86",
  "finished",
  "eyVGgsIsnjLw",
  "uqjbcgI",
  "1654230046",
  "sl",
  "prevId",
  "8D",
  "558778",
  "nextId",
  "block_cc",
  "",
  "SMH",
  "cmdty",
  "false",
  "17287",
  "len",
  "path",
  "status",
  "",
  "ps1",
];

然后将其替换到上述 JS 中,使用解密工具直接在线解析。

SMH.imgData({
  bid: 39921,
  bname: "沉默的庭园",
  bpic: "39921.jpg",
  cid: 558777,
  cname: "第01话",
  files: [
    "1.jpg.webp",
    "2.jpg.webp",
    "3.jpg.webp",
    "4.jpg.webp",
    "5.jpg.webp",
    "6.jpg.webp",
    "7.jpg.webp",
    "8.jpg.webp",
    "9.jpg.webp",
    "作品页(21.4.1).jpg.webp",
    "招募分配页.jpg.webp",
  ],
  finished: false,
  len: 11,
  path: "/ps1/u/17287/cmdty/第01话/",
  status: 1,
  block_cc: "",
  nextId: 558778,
  prevId: 0,
  sl: { e: 1654230046, m: "T-uqjbcgI-eyVGgsIsnjLw" },
}).preInit();

此时,一些关键参数都已经得到了,例如 e 的值,m 的值。

以上就是Python爬虫eval实现看漫画漫画柜mhgui实战分析的详细内容,更多关于Python爬虫eval看漫画的资料请关注Devmax其它相关文章!

Python爬虫eval实现看漫画漫画柜mhgui实战分析的更多相关文章

  1. XCode 3.2 Ruby和Python模板

    在xcode3.2下,我的ObjectiveCPython/Ruby项目仍然可以打开更新和编译,但是你无法创建新项目.鉴于xcode3.2中缺少ruby和python的所有痕迹(即创建项目并添加新的ruby/python文件),是否有一种简单的方法可以再次安装模板?我发现了一些关于将它们复制到某个文件夹的信息,但我似乎无法让它工作,我怀疑文件夹的位置已经改变为3.2.解决方法3.2中的应用程序模板

  2. Swift基本使用-函数和闭包(三)

    声明函数和其他脚本语言有相似的地方,比较明显的地方是声明函数的关键字swift也出现了Python中的组元,可以通过一个组元返回多个值。传递可变参数,函数以数组的形式获取参数swift中函数可以嵌套,被嵌套的函数可以访问外部函数的变量。可以通过函数的潜逃来重构过长或者太复杂的函数。

  3. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  4. Swift、Go、Julia与R能否挑战 Python 的王者地位

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 红薯因 Swift 重写开源中国失败,貌似欲改用 Python

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  6. 你没看错:Swift可以直接调用Python函数库

    上周Perfect又推出了新一轮服务器端Swift增强函数库:Perfect-Python。对,你没看错,在服务器端Swift其实可以轻松从其他语种的函数库中直接拿来调用,不需要修改任何内容。以如下python脚本为例:Perfect-Python可以用下列方法封装并调用以上函数,您所需要注意的仅仅是其函数名称以及参数。

  7. Swift中的列表解析

    在Swift中完成这个的最简单的方法是什么?我在寻找类似的东西:从Swift2.x开始,有一些与你的Python样式列表解析相当的东西。(在这个意义上,它更像是Python的xrange。如果你想保持集合懒惰一路通过,只是这样说:与Python中的列表解析语法不同,Swift中的这些操作遵循与其他操作相同的语法。

  8. swift抛出终端的python错误

    每当我尝试启动与python相关的swift时,我都会收到错误.我该如何解决?

  9. 在Android上用Java嵌入Python

    解决方法看看this,它适用于J2SE,你可以尝试在Android上运行.

  10. 如何在android中使用动态字符串名称访问字符串(类似于javascript中的eval)?

    我正在尝试使用动态名称访问字符串变量,具体取决于我的图库位置.要使用固定名称获取字符串的值,我使用以下哪个很好:我的字符串被命名为pic1info,pic2info,pic3info等,我想替换pic1info的静态定义以包含位置,因此传递以下字符串的内容代替上面的pic1info,以便根据当前位置返回不同的字符串:在javascript中,等价物将是eval,我确信有一种简单的方法可以做到这一点,但我无法弄清楚如何!

随机推荐

  1. 10 个Python中Pip的使用技巧分享

    众所周知,pip 可以安装、更新、卸载 Python 的第三方库,非常方便。本文小编为大家总结了Python中Pip的使用技巧,需要的可以参考一下

  2. python数学建模之三大模型与十大常用算法详情

    这篇文章主要介绍了python数学建模之三大模型与十大常用算法详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感想取得小伙伴可以参考一下

  3. Python爬取奶茶店数据分析哪家最好喝以及性价比

    这篇文章主要介绍了用Python告诉你奶茶哪家最好喝性价比最高,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

  4. 使用pyinstaller打包.exe文件的详细教程

    PyInstaller是一个跨平台的Python应用打包工具,能够把 Python 脚本及其所在的 Python 解释器打包成可执行文件,下面这篇文章主要给大家介绍了关于使用pyinstaller打包.exe文件的相关资料,需要的朋友可以参考下

  5. 基于Python实现射击小游戏的制作

    这篇文章主要介绍了如何利用Python制作一个自己专属的第一人称射击小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起动手试一试

  6. Python list append方法之给列表追加元素

    这篇文章主要介绍了Python list append方法如何给列表追加元素,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

  7. Pytest+Request+Allure+Jenkins实现接口自动化

    这篇文章介绍了Pytest+Request+Allure+Jenkins实现接口自动化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. 利用python实现简单的情感分析实例教程

    商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地,下面这篇文章主要给大家介绍了关于利用python实现简单的情感分析的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下

  9. 利用Python上传日志并监控告警的方法详解

    这篇文章将详细为大家介绍如何通过阿里云日志服务搭建一套通过Python上传日志、配置日志告警的监控服务,感兴趣的小伙伴可以了解一下

  10. Pycharm中运行程序在Python console中执行,不是直接Run问题

    这篇文章主要介绍了Pycharm中运行程序在Python console中执行,不是直接Run问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

返回
顶部