Python爬虫eval实现看漫画漫画柜mhgui实战分析

目录
  • ️ 看漫画MHG mhgui 实战分析
    • 通过开发者工具的 DOM 事件绑定器
    • 截取相应的代码文件
    • eval 函数解析

️ 看漫画MHG mhgui 实战分析

本文所有MHG使用 MHG 替代~

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

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

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

https://i.看评论区.com/ps1/u/17287/cmdty/%E7%AC%AC01%E8%AF%9D/3.jpg.webp?e=1654230046&m=T-uqjbcgI-eyVGgsIsnjLw

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

  • %E7%AC%AC01%E8%AF%9D:第一话;
  • 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",
    "%E4%BD%9C%E5%93%81%E9%A1%B5%2821.4.1%29.jpg.webp",
    "%E6%8B%9B%E5%8B%9F%E5%88%86%E9%85%8D%E9%A1%B5.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看漫画的资料请关注我们其它相关文章!

(0)

相关推荐

  • python处理json字符串(使用json.loads而不是eval())

    eval 跟json.loads 是不一样的函数,是有实现不一样功能的地方,但是在某些地方它们两个函数的功能是一样的,在这个时候如果对执行效率有一定要求的话,建议不要用eval,改用json.loads会有惊喜哦. 一.eval eval() 函数用来执行一个字符串表达式,并返回表达式的值. 二.json.loads json.loads 用于解码 JSON 数据.该函数返回 Python 字段的数据类型. json.loads与eval都能将json字符串转成python中的对象,但在实际工作

  • Python eval函数介绍及用法

    我们之前跟大家描述了在Python里面一些函数的不同使用,以及一些函数的潜藏使用技巧,可是大家有没有听说过,有一个函数一直被誉为最神奇的函数,神奇的地方在哪里?到底怎么神奇?请看下文. 关于eval(): 将字符串string对象转化为有效的表达式参与求值运算返回计算结果. 语法上: 调用的是:eval(expression,globals=None, locals=None)返回的是计算结果 其中: 1.expression是一个参与计算的python表达式 2.globals是可选的参数,如

  • Python中eval函数的表达式作用示例

    目录 eval 是干嘛的? 语法格式 最简单的表达式栗子 带上 globals 带上 locals 字符串转字典 带上 globals 带上 locals 内置函数栗子 报错的栗子 eval 是干嘛的? 解析字符串表达式并执行,并返回一个值 语法格式 eval(expression[, globals[, locals]]) expression:表达式字符串 globals:必须是一个字典 locals:可以是任何 map 对象 最简单的表达式栗子 栗子一 print(eval("123&qu

  • Python eval函数原理及用法解析

    eval函数就是实现list.dict.tuple与str之间的转化 str函数把list,dict,tuple转为为字符串 一.字符串转换成列表 a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]" print(type(a)) b = eval(a)print(type(b)) print(b) 二.字符串转换成字典 a = "{1: 'a', 2: 'b'}" print(type(a)) b = eval(a) print(ty

  • python内置函数之eval函数详解

    目录 一.简介 二.语法 三.举例 1.计算str表达式的值 2.将str转换成list 3.将str转换成dict 四.Reference 总结 一.简介 eval()函数用来执行一个字符表达式的值,并返回表达式的值 二.语法 具体语法:eval(expression[, globals[, locals]]) 参数: expression – 表达式. globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象. locals– 变量作用域,局部命名空间,如果被提供,可以

  • python eval()函数使用详情

    目录 一.eval()函数是什么? 二.eval()函数语法解析 三.eval()函数应用举例 3.1 eval()基本应用举例 3.2 eval()危害举例 3.3 ast.literal_eval()替代eval()实现数据类型转换 一.eval()函数是什么? Python的一个内置函数: 返回传入字符串的表达式结果(官方) 二.eval()函数语法解析 三.eval()函数应用举例 3.1 eval()基本应用举例 上述例子中,展示了eval()的3个应用: 把字符串转化为代码表达式求结

  • Python爬虫eval实现看漫画漫画柜mhgui实战分析

    目录 ️ 看漫画MHG mhgui 实战分析 通过开发者工具的 DOM 事件绑定器 截取相应的代码文件 eval 函数解析 ️ 看漫画MHG mhgui 实战分析 本文所有MHG使用 MHG 替代~ 本次爬虫采集的案例是MHG,该站点貌似本身就游走在法律的边缘. 站点地址直接检索即可进入,在该目标站点,橡皮擦发现了 eval 加密的双重用法. 页面所有点位都无太大难点,而且漫画超多,但是当点击详情页的时候,发现加密点位了. https://i.看评论区.com/ps1/u/17287/cmdty

  • python爬虫常用的模块分析

    本文对Python爬虫常用的模块做了较为深入的分析,并以实例加以深入说明.分享给大家供大家参考之用.具体分析如下: creepy模块 某台湾大神开发的,功能简单,能够自动抓取某个网站的所有内容,当然你也可以设定哪些url需要抓. 地址:https://pypi.python.org/pypi/creepy 功能接口: set_content_type_filter: 设定抓取的content-type(header中的contenttype).包括text/html add_url_filter

  • python实现模拟按键,自动翻页看u17漫画

    python 适用于windows平台 使用 win32gui,win32api,win32con 包 simu_read.py 复制代码 代码如下: #-*- coding=utf-8 -*- ''' 模拟按键翻页 Usage:python simu_read.py 10 1.5 10表示翻10页,1.5表示在一页中按pgdn的时间间隔为1.5s 一页pgdn 3 次,之后按→翻到下一页 把浏览器打开到u17要看的漫画中,之后启动该程序,再切回u17 便可以自动翻页看漫画了. 仅供娱乐,了解p

  • Python实现数据可视化看如何监控你的爬虫状态【推荐】

    今天主要是来说一下怎么可视化来监控你的爬虫的状态. 相信大家在跑爬虫的过程中,也会好奇自己养的爬虫一分钟可以爬多少页面,多大的数据量,当然查询的方式多种多样.今天我来讲一种可视化的方法. 关于爬虫数据在mongodb里的版本我写了一个可以热更新配置的版本,即添加了新的爬虫配置以后,不用重启程序,即可获取刚刚添加的爬虫的状态数据. 1.成品图 这个是监控服务器网速的最后成果,显示的是下载与上传的网速,单位为M.爬虫的原理都是一样的,只不过将数据存到InfluxDB的方式不一样而已, 如下图. 可以

  • Python爬虫获取数据保存到数据库中的超详细教程(一看就会)

    目录 1.简介介绍 2.Xpath获取页面信息 3.通过Xpath爬虫实操 3-1.获取xpath 完整代码展示: 总结 1.简介介绍 -网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫.-一般在浏览器上可以获取到的,通过爬虫也可以获取到,常见的爬虫语言有PHP,JAVA,C#,C++,Python,为啥我们经常听到说的都是Python爬虫,这是

  • Python中eval带来的潜在风险代码分析

    0x00 前言 eval是Python用于执行python表达式的一个内置函数,使用eval,可以很方便的将字符串动态执行.比如下列代码: >>> eval("1+2") >>> eval("[x for x in range(10)]") [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 当内存中的内置模块含有os的话,eval同样可以做到命令执行: >>> import os >>&g

  • Python爬虫如何破解JS加密的Cookie

    通过Fiddler抓包比较,基本可以确定是JavaScript生成加密Cookie导致原来的请求返回521. 发现问题: 打开Fiddler软件,用浏览器打开目标站点(http://www.kuaidaili.com/proxylist/2/) .可以发现浏览器对这个页面加载了两次,第一次返回521,第二次才正常返回数据.很多没有写过网站或是爬虫经验不足的童鞋,可能就会觉得奇怪为什么会这样?为什么浏览器可能正常返回数据而代码却不行? 仔细观察两次返回的结果可以发现: 1.第二次请求比第一次请求的

  • python爬虫爬取淘宝商品比价(附淘宝反爬虫机制解决小办法)

    因为评论有很多人说爬取不到,我强调几点 kv的格式应该是这样的: kv = {'cookie':'你复制的一长串cookie','user-agent':'Mozilla/5.0'} 注意都应该用 '' ,然后还有个英文的 逗号, kv写完要在后面的代码中添加 r = requests.get(url, headers=kv,timeout=30) 自己得先登录自己的淘宝账号才有自己登陆的cookie呀,没登录cookie当然没用 以下原博 本人是python新手,目前在看中国大学MOOC的嵩天

  • Python爬虫逆向分析某云音乐加密参数的实例分析

    本文转自:https://blog.csdn.net/qq_42730750/article/details/108415551 前言   各大音乐平台是从何时开始收费的这个问题没有追溯过,印象中酷狗在16年就已经开始收费了,貌似当时的收费标准是付费音乐下载一首2元,会员一月8元,可以下载300首.虽然下载收费,但是还可以正常听歌.陆陆续续,各平台不仅收费,而且还更在乎版权问题,因为缺少版权,酷狗上以前收藏的音乐也不能听了,更过分的是,有些歌非VIP会员只能试听60秒(•́へ•́╬).   版权

  • Python爬虫之爬取2020女团选秀数据

    一.先看结果 1.1创造营2020撑腰榜前三甲 创造营2020撑腰榜前三名分别是 希林娜依·高.陈卓璇 .郑乃馨 >>>df1[df1['排名']<=3 ][['排名','姓名','身高','体重','生日','出生地']] 排名 姓名 身高 体重 生日 出生地 0 1.0 希林娜依·高 NaN NaN 1998年07月31日 新疆 1 2.0 陈卓璇 168.0 42.0 1997年08月13日 贵州 2 3.0 郑乃馨 NaN NaN 1997年06月25日 泰国 1.2青春有

随机推荐