吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 8199|回复: 6
上一主题 下一主题
收起左侧

[Python 转载] 嗨皮漫画JS逆向分析

[复制链接]
跳转到指定楼层
楼主
Amd794 发表于 2020-11-20 21:02 回帖奖励
本帖最后由 Amd794 于 2020-11-21 14:04 编辑

目标分析
  • 首先打开目标网站:https://m.happymh.com/
  • 随便打开一部漫画:百炼成神漫画
  • 再随便点开一章节:https://m.happymh.com/manga/read/bailianchengshen/1021588
  • F12打开调试,开始分析。
    • 打开源代码,大概浏览找到突破。
    • 开始分析里面每一个变量所代表的含义
    • 总结以上分析就是, 我们只需要把ReadJs里面的dct方法扒下了就基本解决了问题。
    • 在控制台双击以下最后的输出函数
    • [JavaScript] 纯文本查看 复制代码
      function dct(_0x3056e8, _0xc88342) {
              var _0x445376 = {
                  'uoYan': function _0x3a05cb(_0x1eaf87, _0x26f548) {
                      return _0x1eaf87 / _0x26f548;
                  }
              };
              var _0x5570f2 = _0x492c('0x3e', 'aLXy')['split']('|')
                , _0x2e3990 = 0x0;
              while (!![]) {
                  switch (_0x5570f2[_0x2e3990++]) {
                  case '0':
                      var _0x2c1614 = _0xc88342;
                      continue;
                  case '1':
                      var _0x52c93f = CryptoJS[_0x492c('0x3f', '5a6s')](_0x3056e8, _0x3857a7, {
                          'hasher': CryptoJS[_0x492c('0x40', 'bLts')][_0x492c('0x41', 'vS2U')],
                          'keySize': _0x445376['uoYan'](0x40, 0x8),
                          'iterations': 0x3e7
                      });
                      continue;
                  case '2':
                      var _0x872444 = CryptoJS['AES'][_0x492c('0x42', 'jE0d')](_0x33163b, _0x52c93f, {
                          'iv': _0x1c5679
                      });
                      continue;
                  case '3':
                      var _0x33163b = _0x2c1614[_0x492c('0x43', 'qO)5')];
                      continue;
                  case '4':
                      var _0x1c5679 = CryptoJS[_0x492c('0x44', 'g[DF')]['Hex'][_0x492c('0x45', 'MQai')](_0x2c1614['iv']);
                      continue;
                  case '5':
                      return _0x872444[_0x492c('0x46', 'F6X1')](CryptoJS[_0x492c('0x47', '$nWG')]['Utf8']);
                  case '6':
                      var _0x3857a7 = CryptoJS['enc'][_0x492c('0x48', 'aq3w')]['parse'](_0x2c1614['salt']);
                      continue;
                  }
                  break;
              }
          },
    • 分析以上代码, 把方法简化。把一些固定不变的结果替换掉。
    • 首先执行ReadJs[_0x492c('0xda', 'MQai')](_0x16e8c8, ss) ,本质上就是执行了dct(_0x16e8c8, ss) , 然而 _0x16e8c8又是一个固定值,最终就是dct('c1zbnttrabim', ss)
    • 然后再分析下dct方法, 把dct方法简化下。由上至下把一些var定义的变量到控制台输出一些, 把其中的固定值替换掉
    • [JavaScript] 纯文本查看 复制代码
      var _0x5570f2 = _0x492c('0x3e', 'aLXy')['split']('|') ----> ["0", "3", "6", "4", "1", "2", "5"]
      _0x492c('0x3f', '5a6s')  ----> PBKDF2, 发现CryptoJS[]里面的东西其实就是加密函数里面的某个方法,换句话说就是一个固定

      通过观察不难发现,其实这个dct方法就是按照上面的列表里面的值的顺序把case里面的东西执行一遍,整理一下最终简化后就是
    • [Asm] 纯文本查看 复制代码
      var a = CryptoJS.PBKDF2('c1zbnttrabim', CryptoJS.enc.Hex.parse(ss['salt']), {
        'hasher': CryptoJS.algo.SHA512,
        'keySize': 8,
        'iterations': 999
      })
      var b = CryptoJS.AES.decrypt(ss['code'], a, {
        'iv': CryptoJS.enc.Hex.parse(ss['iv'])
      });
      // ReadJs['dct']('c1zbnttrabim', ss)
      data = JSON.parse(b['toString'](CryptoJS.enc.Utf8))
      console.log(data)
      

            现在测试以下代码有没有得到想要的         
  
最终代码
[Python] 纯文本查看 复制代码
# !/usr/bin/python3
# -*- coding: utf-8 -*-
# Time    : 2020/10/28 15:35
# Author  : Amd794
# Email   : [url=mailto:2952277346@qq.com]2952277346@qq.com[/url]
# Github  : https://github.com/Amd794
import re

import execjs

from threading_download_images import get_response


class Happymh(object):
    @staticmethod
    def _happymh(detail_url):
        response = get_response(detail_url)
        ss = re.findall('var ss = ({.*?});', response.text)[0].replace('\\', '')
        ctx = execjs.get().compile(open('../js/_m_happymh.js').read(), cwd='../js/node_modules')
        data = ctx.call('getArr', eval(ss))
        image_url = [d['url'] for d in data]
        return image_url


if __name__ == '__main__':
    import sys

    sys.path.append('../js')
    print(Happymh._happymh('https://m.happymh.com/manga/read/bailianchengshen/1021588'))

免费评分

参与人数 2吾爱币 +4 热心值 +1 收起 理由
漁滒 + 3 + 1 我很赞同!
jstt552200 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
hyllin 发表于 2020-11-20 21:33
很好很强大
3#
Because-of-love 发表于 2020-11-20 23:01
4#
BlueZ0514 发表于 2020-11-20 23:49
5#
漁滒 发表于 2020-11-21 00:02
目前已经实现了功能,接下来可以试试脱离node,使用纯python代码完成
6#
小小宇6 发表于 2021-10-12 11:14
图片加载不出来,有完整的吗
7#
明次 发表于 2021-10-12 13:17
为啥打不开呢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-13 12:16

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表