爬虫做js逆向分析的思路

2023-11-03

1. 为什么要做逆向

在这里插入图片描述
正常我们访问一个网站是由html css js 文件组成的,下图是某网站的正常访问。
当然我们也可以看到是谁调用了这个请求执行了什么(2图为某网站登录链接)
在这里插入图片描述
在这里插入图片描述

分析URL

我们可以看到这个链接他的请求参数,传输方式等。我们可以看到左图和右图的差距;同样的请求方式和fromdata会有这样的差距。如果有些经验的同学就会去找相关js了
在这里插入图片描述
在这里插入图片描述

如何快速查找js

  • 我们可以在搜索查找或者链接js调用中查找相关js
  • 可以看到出现了两个搜索到的结果
    在这里插入图片描述

如何分析调用及复写js

如何准确无误的找到相关加密以及调试

我们在找到相关js后需要去找到一些疑似加密的函数,比如哈希,base64等
还可以从链接调用开始着手,这都是可以的。并没有一定哪种更加简便。这是其中的一个加密函数被我提取出来了。像这种加密很少的js我们可以用python复写,但是一旦加密函数过于庞大就需要将js抽取出用python+node或是webdriver来执行相关函数。
在这里插入图片描述
python复写hmac加密

import hmac
def get_singa_true(timestamp):
    sha1 = hmac.new("d1b964811afb40118a12068ff74a12f4".encode('utf8'), digestmod='sha1')
    sha1.update("password".encode('utf8'))
    sha1.update("c3cef7c66a1843f8b3a9e6a1e3160e20".encode('utf8'))
    sha1.update("com.zhihu.web".encode('utf8'))
    sha1.update(str(timestamp).encode('utf8'))
    return sha1.hexdigest()

另外一个混淆加密函数的查找

查找方法方式和调试技巧
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 下面是我提取出的另外一个加密函数大概有400多行

  • 这个函数因为使用了windows对象,所以构造了相关的函数
    在这里插入图片描述

这么大的混淆加密js我们如何处理呢?

  • 400行的混淆js用python复写其实也不是不能,但是开发时间和破解效率都是一个很关键的问题

  • 如果说开发时间紧急,那么此时我们就需要使用其他的方式来执行这段js

**第一种:**使用selenium+webdriver来执行本地文件,然后调用本地html上的js运行
**第二种:**使用python下的库exec.js来调用node来执行

如何验证这个混淆加密函数是否有效?

我们可以将这个js函数写到一个空白的html中,再用console.log进行调试。查看是否结果相同
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用node执行混淆js

在这里插入图片描述
使用node执行混淆js
在这里插入图片描述

上面几图中分别有如下几个坑

  1. 他会判断window对象是否为undifined
  2. 一个浏览器aotb的解码函数,需要从node中找到对应函数
  3. 需要构造一个windows对象,和部分变量;函数

相关代码

测试混淆加密函数

import execjs, os

os.environ["EXECJS_RUNTIME"] = "Node"
IMAGE_LIST = [[17, 25.1875], [44, 28.1875], [69, 28.1875], [93, 25.1875], [109, 28.1875], [140, 26.1875],
              [177, 13.1875]]

def get_js(js_location):
    f = open(js_location, 'r', encoding='UTF-8')
    line = f.readline()
    htmlstr = ''
    while line:
        htmlstr = htmlstr + line
        line = f.readline()
    return htmlstr

def get_encrypt(ctx, all_args):
    return ctx.call('get_encrypt', all_args)

if __name__ == '__main__':
    all_args = "client_id=c3cef7c66a1843f8b3a9e6a1e3160e20&grant_type=password&timestamp=1551496362379&source=com.zhihu.web&signature=b92f67a96cc1fde5db2a93ed87a482a6ceda29ee&username=%2B8613252798967&password=123456qwe&captcha=&lang=cn&ref_source=homepage&utm_source="
    ctx = execjs.compile(get_js('jiami.js'))
    post_ctx = ctx.call("Q", all_args)
    print(post_ctx)

倒立图片的验证码坐标

import requests, json, base64,urllib.parse
from io import BytesIO
from PIL import Image
IMAGE_LIST = [[17, 25.1875], [44, 28.1875], [69, 28.1875], [93, 25.1875], [109, 28.1875], [140, 26.1875],
              [177, 13.1875]]

def get_image_addr(img_str):
    if "," in img_str:
        img_str = img_str.replace(",", ",")
    img_list = img_str.split(",")
    captcha = {"img_size": [200, 44], "input_points": []}
    for i in img_list:
        captcha['input_points'].append(IMAGE_LIST[int(i) - 1])
    return captcha

    url = "https://www.zhihu.com/api/v3/oauth/captcha?lang=cn"
    headers = {
        "Referer": "https://www.zhihu.com/signup?next=%2F",
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36",
        "x-requested-with": "fetch",
    }
    response = session.get(url, headers=headers)
    print(response.text)
    response = session.put(url, headers=headers)
    print(response.status_code)
    content = json.loads(response.content.decode())
    image = Image.open(BytesIO(base64.b64decode(content['img_base64'])))
    image.show()
    captcha = input("请输入图片验证码 倒立图片请输入第几个文字以,为间隔(输入数字)")
    image.close()
    captcha = get_image_addr(captcha)
    captcha = urllib.parse.quote(json.dumps(captcha).replace(" ", ""))
    url = "https://www.zhihu.com/api/v3/oauth/captcha?lang=cn"
    response = session.post(url, headers=headers, data={"input_text": captcha})
    print(response.text)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫做js逆向分析的思路 的相关文章

随机推荐

  • moment.js 时间处理的使用方法--含有CDN链接

    范例 https cybozudev kf5 com hc kb article 211149 CDN链接 https cybozudev kf5 com hc kb article 206405
  • ORACLE等待事件类型(一)

    author skate tiime 2009 11 18 ORACLE等待事件类型 Classes of Wait Events 每一个等待事件都属于某一类 下面给出了每一类等待事件的描述 Every wait event belongs
  • linux模拟网络丢包、延迟、数据包损坏

    环境 工具 linux TC tc默认系统自带 只对物理网卡生效 不对虚拟网卡生效 如果对关联了虚拟网卡的物理网卡使用会同时生效 模拟网络延迟 tc qdisc add dev eth0 root netem delay 1000ms ro
  • 解读es6 class 中 constructor 方法 和 super 的作用

    ES6 的 class 属于一种 语法糖 所以只是写法更加优雅 更加像面对对象的编程 其思想和 ES5 是一致的 类和模块的内部 默认就是严格模式 所以不需要使用use strict指定运行模式 定义类 class Point constr
  • c++ 文件类型判断

    要判断文件类型 即判断文件名是否包含文件的后缀 例如 txt文件的判断 string str abcd txt string str1 txt 当 str find str1 string npos时则说明字符串str中不存在 txt 这个
  • MonoField MonoReflectionField FieldInfo

    mono mcs class corlib System Reflection MonoField cs StructLayout LayoutKind Sequential internal class MonoField RtField
  • 环形链表问题

    题目 给定一个链表的头节点 head 返回链表开始入环的第一个节点 如果链表无环 则返回 null 如果链表中有某个节点 可以通过连续跟踪 next 指针再次到达 则链表中存在环 为了表示给定链表中的环 评测系统内部使用整数 pos 来表示
  • linux 软件安装各种方法

    一 简单介绍 1 软件安装卸载 分几种情况 A RPM包 这种软件包就像windows的EXE安装文件一样 各种文件已经编译好 并打了包 哪个文件该放到哪个文件夹 都指定好了 安装非常方便 在图形界面里你只需要双击就能自动安装 如何卸载 1
  • SE-ResNet的实现

    见 D pythonCodes 深度学习实验 4 1 经典分类网络 inference代码汇总 models se resnet py 一 SE ResNet的实现方法 读了senet这篇论文之后 可以知道senet并没有提出一个新的网络
  • Easyui combobox 判断输入项是否存在于下拉列表中

    combobox的getValue方法很诡异 当输入项是存在于下拉列表时 返回的是需要的ID 但是当输入项是不存在于下拉列表时 却直接返回用户的输入结果 从而导致没法判断用户是否输入了下拉框不存在的项 本来第一时间想到直接判断getValu
  • 蓝绿发布、滚动发布、灰度发布,有什么区别?

    目录 01 蓝绿发布 02 滚动发布 03 灰度发布 04 A B测试 在项目迭代的过程中 不可避免需要 上线 上线对应着部署 或者重新部署 部署对应着修改 修改则意味着风险 目前有很多部署发布的技术 这儿将常见的做一个总结 举一个情景例子
  • 第一次使用Xshell服务器跑程序(保姆教程)

    前期准备 1 提前下载好Xshell和Xftp 2 有自己的服务器账号名 密码 服务器IP 默认端口号 我的是组里师兄给我创建的 以上两步下载注册步骤可以参考文章1和文章2 3 我的服务器默认安装好了Anaconda3和cuda11 1 1
  • Flutter之状态管理Provider使用和详解

    在前端页面 状态管理和消息传递一直是我们开发一个交互性好 体验好的前端应用或者APP必须要提到的东西 设想一下我们需要两个组件之间共享数据 而且两个组件之间具有联动效果 对于Flutter来说我们能够把数据保存到一个全局变量 然后每次使用的
  • Spring源码分析之createBean主流程分析

    我们知道 在调用getBean获取bean实例的实例 首先会从缓存中获取bean实例 如果没有获取到 就会去创建bean的时候 关于获取bean实例 可以参考Spring源码分析之getBean主流程分析 而本文将会对创建bean实例的主流
  • 分享一个前后端分离的web项目(vue+spring boot)

    Github地址 https github com smallsnail wh 前端项目名为wh web 后端项目名为wh server 项目展示地址为我的github pages https smallsnail wh github io
  • simple and useful command lines

    pip list grep package name 显示获取已安装包的信息 包名与版本号 pip show package name 能显示该安装的包的相关信息 其中包括它的安装路径 实际上包通常被安装在python安装目录下的lib s
  • Numpy学习笔记

    文章目录 常用函数 np linspace numpy arange start end step dtype numpy tile A reps np array numpy ndim A np flatten np reshape np
  • RPA机器人有效解决低效能业务流程升级难点

    企业的数字化 自动化转型是一个综合命题 RPA也绝非是低效套用的通用模板 在决策各个阶段的关键要点都需要量体裁衣 细致考量 为了达到更好的效果 企业在从厘清内部需求阶段就应引入专业的咨询人员有针对性地开展交流和指导 以结果为导向 协助企业全
  • ue4 命令行编译 烘焙 打包 存档

    首先是官方wiki的说明 How to package your game with commands Jump to navigation search Template Rating This aims to be a quick gu
  • 爬虫做js逆向分析的思路

    1 为什么要做逆向 正常我们访问一个网站是由html css js 文件组成的 下图是某网站的正常访问 当然我们也可以看到是谁调用了这个请求执行了什么 2图为某网站登录链接 分析URL 我们可以看到这个链接他的请求参数 传输方式等 我们可以