zoukankan      html  css  js  c++  java
  • 9-爬虫高级实战【js逆向】

    js逆向步骤

    • js调试工具
    • PyExecJs
      • 实现使用python执行js代码
      • 安装环境
        • 安装node.js开发环境
        • pip install PyExecJs
    • js算法改写初探
      • 打断点
      • 代码调试时,如果发现了相关变量的缺失,一般给其定义成空字典即可。
      • 代码调试时,如果js内置对象确实,直接将该内置对象赋值为this。例如:window = this;

    js反混淆

    • 相关概念
      • js混淆:对核心的js代码进行加密
      • js反混淆:对js加密代码进行解密
    • 破解
      • 使用浏览器自带的反混淆工具【推荐】:打开开发者工具 ----> 点击小齿轮 ----> 找到Souces选项卡 ----> 勾选Search in anonymous and scripts框 ----> 刷新页面
      • 暴力破解【迫不得已】:暴力破解网站

    1. 微信公众号平台js算法逆向【MD5算法】

    import execjs
    # 1. 实例化一个node对象
    node = execjs.get()
    
    # 2. js源文件编译
    ctx = node.compile(open('./js源文件./wechat.js',encoding='utf-8').read())
    
    # 3. 执行js函数
    funcName = 'getPwd("{}")'.format('123123123')
    pwd = ctx.eval(funcName)
    print(pwd)
    

    2. Steam游戏平台js算法逆向【RSA算法】

    import requests
    import execjs
    import time
    
    # 动态获取mod和exp串
    url = 'https://store.steampowered.com/login/getrsakey/'
    data = {
        'donotcache': str(int(time.time() * 1000)), # 时间戳
        'username': '123@qq.com',
    }
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
    }
    response_json = requests.post(url=url,headers=headers,data=data).json()
    mod = response_json['publickey_mod']
    exp = response_json['publickey_exp']
    
    # 1. 实例化一个node对象
    node = execjs.get()
    
    # 2. js源文件编译
    ctx = node.compile(open('./js源文件./steam.js',encoding='utf-8').read())
    
    # 3. 执行js函数
    funcName = 'getPwd("{0}","{1}","{2}")'.format('123123123',mod,exp)
    pwd = ctx.eval(funcName)
    print(pwd)
    

    3. 凡科网js算法逆向【MD5算法】

    • 注意:如果需要逆向的js函数的实现时出现在一个闭包中,那么直接将闭包的整个代码拷贝出进行调试即可
    • url:https://i.fkw.com/
    import execjs
    
    # 1. 实例化一个node对象
    node = execjs.get()
    
    # 2. js源文件编译
    ctx = node.compile(open('./js源文件/fanke.js',encoding='utf-8').read())
    
    # 3. 执行js函数
    funcName = 'md5("{0}")'.format('123123123')
    pwd = ctx.eval(funcName)
    print(pwd)
    

    4. 完美世界游戏js算法逆向【RSA算法】

    import requests
    from lxml import etree
    import execjs
    
    # 获取公钥串
    url = 'https://passport.wanmei.com/sso/login?service=passport&isiframe=1&location=2f736166652f'
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
    }
    response_text = requests.post(url=url,headers=headers).text
    tree = etree.HTML(response_text)
    publicKey = tree.xpath('//input[@id="e"]/@value')[0]
    
    # 1. 实例化一个node对象
    node = execjs.get()
    
    # 2. js源文件编译
    ctx = node.compile(open('./js源文件/wanmei.js',encoding='utf-8').read())
    
    # 3. 执行js函数
    funcName = 'getPwd("{0}","{1}")'.format('123123123',publicKey)
    pwd = ctx.eval(funcName)
    print(pwd)
    

    5. 试客联盟js算法逆向【RSA算法】

    import requests
    from lxml import etree
    import execjs
    import re
    # 获取rsa_n串
    url = 'http://login.shikee.com/getkey?v=19b53e441bc51f28a9e6afead8e665ea'
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
    }
    response_text = requests.get(url=url,headers=headers).text
    ex = 'var rsa_n = "(.*?)";'
    rsa_n = re.findall(ex,response_text)[0]
    
    # 1. 实例化一个node对象
    node = execjs.get()
    
    # 2. js源文件编译
    ctx = node.compile(open('./js源文件/shike.js',encoding='utf-8').read())
    
    # 3. 执行js函数
    funcName = 'getPwd("{}","{}")'.format('123123123',rsa_n)
    pwd = ctx.eval(funcName)
    print(pwd)
    

    6. 空中网js算法逆向【RSA算法】

    import requests
    import execjs
    import re
    import json
    
    # 获取j_data['dc']串
    url = 'https://sso.kongzhong.com/ajaxLogin?j=j&jsonp=j&service=https://passport.kongzhong.com/&_=1626875097213'
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
        'Referer': 'https://passport.kongzhong.com/'
    }
    response_text = requests.get(url=url,headers=headers).text
    ex = "KZLoginHandler.jsonpCallbackKongZ((.*?))"
    data = re.findall(ex,response_text)[0]
    dc = json.loads(data)['dc']
    
    # 1. 实例化一个node对象
    node = execjs.get()
    
    # 2. js源文件编译
    ctx = node.compile(open('./js源文件/kongzhong.js',encoding='utf-8').read())
    
    # 3. 执行js函数
    funcName = 'getPwd("{}","{}")'.format('123123123',dc)
    pwd = ctx.eval(funcName)
    print(pwd)
    
    

    7. 长房网js算法逆向【DES算法】

    import execjs
    
    # 1. 实例化一个node对象
    node = execjs.get()
    
    # 2. js源文件编译
    ctx = node.compile(open('./js源文件/changfang.js',encoding='utf-8').read())
    
    # 3. 执行js函数
    funcName = 'getPwd("{}")'.format('123123123')
    pwd = ctx.eval(funcName)
    print(pwd)
    

    8. 有道翻译js算法逆向【MD5算法】

    import time
    import random
    import execjs
    import requests
    
    word = input("Please input a English word:")
    r = str(int(time.time() * 1000))
    i = r + str(random.randint(0,9))
    
    # 1. 实例化一个node对象
    node = execjs.get()
    
    # 2. js源文件编译
    ctx = node.compile(open('./js源文件/youdao.js',encoding='utf-8').read())
    
    # 3. 执行js函数
    funcName = 'getSign("{}","{}")'.format(word,i)
    sign = ctx.eval(funcName)
    
    url = 'https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
    headers = {
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36',
        'Referer': 'https://fanyi.youdao.com/',
        'Cookie': 'OUTFOX_SEARCH_USER_ID_NCOO=512615467.85577774; OUTFOX_SEARCH_USER_ID="-673357154@10.169.0.82"; _ga=GA1.2.446310143.1622377950; _ntes_nnid=4ef5ec83bdbbbe870ec8f8c735810336,1622941677257; JSESSIONID=aaa-vW4aILneN-aFSiiRx; ___rl__test__cookies=1626879075736',
    }
    data = {
        'i': word,
        'from': 'AUTO',
        'to': 'AUTO',
        'smartresult': 'dict',
        'client': 'fanyideskweb',
        'salt': i,
        'sign': sign,
        'lts': r,
        'bv': '24ecb70ba6203e4453baed50aa26b78e',
        'doctype': 'json',
        'version': '2.1',
        'keyfrom': 'fanyi.web',
        'action': 'FY_BY_REALTlME',
    }
    response_json = requests.post(url=url,headers=headers,data=data).json()
    print(response_json)
    

    9. CTE四六级js算法逆向【DES算法】

    import execjs
    # 1. 实例化一个node对象
    node = execjs.get()
    
    # 2. js源文件编译
    ctx = node.compile(open('./js源文件/CTE.js',encoding='utf-8').read())
    
    # 3. 执行js函数
    funcName = 'getPwd("{}")'.format('123123123')
    pwd = ctx.eval(funcName)print(pwd)
    
  • 相关阅读:
    UVA 1513
    《ArcGIS Runtime SDK for Android开发笔记》——问题集:.geodatabase创建,创建时内容缺失问题总结
    《ArcGIS Runtime SDK for Android开发笔记》——问题集:使用TextSymbol做标注显示乱码
    《ArcGIS Runtime SDK for Android开发笔记》——(7)、示例代码arcgis-runtime-samples-android的使用
    《ArcGIS Runtime SDK for Android开发笔记》——(6)、基于Android Studio的ArcGIS Android工程结构解析
    《ArcGIS Runtime SDK for Android开发笔记》——(5)、基于Android Studio构建ArcGIS Android开发环境(离线部署)
    《ArcGIS Runtime SDK for Android开发笔记》——(4)、基于Android Studio构建ArcGIS Android开发环境
    《ArcGIS Runtime SDK for Android开发笔记》——(3)、ArcGIS Runtime SDK概述
    《ArcGIS Runtime SDK for Android开发笔记》——(2)、Android Studio基本配置与使用
    《ArcGIS Runtime SDK for Android开发笔记》——(1)、Android Studio下载与安装
  • 原文地址:https://www.cnblogs.com/borntodie/p/15042669.html
Copyright © 2011-2022 走看看