Web Spider案例 网洛克 第二题 JJEncode加密 练习(六)

news2024/9/22 21:35:45

在这里插入图片描述


文章目录

  • 一、资源推荐
  • 二、逆向目标
  • 三、抓包分析 & 下断分析逆向
    • 3.1 抓包分析
    • 3.2 下断分析逆向
  • 四、本地JS代码调试 & 完整JS加密代码
    • 4.1 本地JS代码调试
    • 4.2 完整JS加密代码
  • 五、python具体实现
  • 总结


提示:以下是本篇文章正文内容,下面案例可供参考

一、资源推荐

Web Spider 常见混淆EVAL、AA、JJ、JSFUCK:https://blog.csdn.net/EXIxiaozhou/article/details/128767669
网洛者 - 反反爬虫训练平台网址:https://wangluozhe.com/

二、逆向目标

在这里插入图片描述

三、抓包分析 & 下断分析逆向

3.1 抓包分析

1、POST,https://wangluozhe.com/challenge/api/2;
在这里插入图片描述
2、逆向加密参数:_signature;
在这里插入图片描述

3.2 下断分析逆向

JJEncode 解混淆的常见方法

  • 使用在线工具直接解密:http://www.hiencode.com/jjencode.html;
  • 比较通用的方式,就是下断跟到方法里面,最终会在虚拟机(VM)里看到源码;
  • 复制混淆的代码,删除最后一个小括号(),去控制台调试,也能看见源码;

1、通过启动器,进入代码定义处;
在这里插入图片描述
2、下断后,翻页刷新;
在这里插入图片描述
3、来到加密代码处,可以通过两种方式来解决;
在这里插入图片描述
4、第一种,比较通用的方式,就是下断跟到方法里面,即可看见源代码;
在这里插入图片描述
5、第二种,仅针对JJ混淆,复制混淆的代码,删除最后一个小括号(),去控制台打印,也能看见源码;
在这里插入图片描述
删掉最后一个小括号(),在控制台打印,并点击部分源码即可进入源码定义处;
在这里插入图片描述
在这里插入图片描述

四、本地JS代码调试 & 完整JS加密代码

4.1 本地JS代码调试

1、复制加密代码,在pycharm运行,发现缺少window;
在这里插入图片描述
2、在代码开头处,补一个window即可运行成功

window = this;

在这里插入图片描述

4.2 完整JS加密代码

var hexcase = 0;
var chrsz = 8;
function hex_sha1(s) {
    return binb2hex(core_sha1(AlignSHA1(s)));
}
function sha1_vm_test() {
    return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d";
}
function core_sha1(blockArray) {
    var x = blockArray;
    var w = Array(80);
    var a = 1732584173;
    var b = -271733877;
    var c = -1752584194;
    var d = 271733878;
    var e = -1009589776;
    for (var i = 0; i < x.length; i += 16) {
        var olda = a;
        var oldb = b;
        var oldc = c;
        var oldd = d;
        var olde = e;
        for (var j = 0; j < 80; j++) {
            if (j < 16)
                w[j] = x[i + j];
            else
                w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
            var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j)));
            e = d;
            d = c;
            c = rol(b, 30);
            b = a;
            a = t;
        }
        a = safe_add(a, olda);
        b = safe_add(b, oldb);
        c = safe_add(c, oldc);
        d = safe_add(d, oldd);
        e = safe_add(e, olde);
    }
    return new Array(a,b,c,d,e);
}
function sha1_ft(t, b, c, d) {
    if (t < 20) {
        return (b & c) | ((~b) & d);
    }
    if (t < 40) {
        return b ^ c ^ d;
    }
    if (t < 60) {
        return (b & c) | (b & d) | (c & d);
    }
    return b ^ c ^ d;
}
function sha1_kt(t) {
    return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514;
}
function safe_add(x, y) {
    var lsw = (x & 0xFFFF) + (y & 0xFFFF);
    var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
    return (msw << 16) | (lsw & 0xFFFF);
}
function rol(num, cnt) {
    return (num << cnt) | (num >>> (32 - cnt));
}
function AlignSHA1(str) {
    var nblk = ((str.length + 8) >> 6) + 1;
    var blks = new Array(nblk * 16);
    for (var i = 0; i < nblk * 16; i++) {
        blks[i] = 0;
    }
    for (i = 0; i < str.length; i++) {
        blks[i >> 2] |= str.charCodeAt(i) << (24 - (i & 3) * 8);
    }
    blks[i >> 2] |= 0x80 << (24 - (i & 3) * 8);
    blks[nblk * 16 - 1] = str.length * 8;
    return blks;
}
function binb2hex(binarray) {
    var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
    var str = "";
    for (var i = 0; i < binarray.length * 4; i++) {
        str += hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) + hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF);
    }
    return str;
}

function getSign(){
    return window.sign = hex_sha1(Date.parse(new Date).toString());
}

console.log(getSign())

五、python具体实现

import time
import execjs
import requests


class Spider(object):
    def __init__(self):
        with open(file='encode.js', mode='r', encoding='utf-8') as fis:
            js_code = fis.read()  # 读取JS代码文件
        self.js_obj = execjs.compile(js_code)  # 激将JS代码传入
        self.headers = {
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
                          'Chrome/110.0.0.0 Safari/537.36',
            'Cookie': '自己账户登录后的cookie'
        }
        self.url = 'https://wangluozhe.com/challenge/api/2'
        self.count_number = 0

    def getParams(self, page):
        form_data = {
            'page': page,
            'count': 10,
            '_signature': self.js_obj.call("getSign")
        }
        return form_data

    def request_server(self, page):
        form_data = self.getParams(page)
        print("当前参数:", form_data)
        response = requests.post(url=self.url, headers=self.headers, data=form_data)
        for items in response.json()['data']:
            print(f"当前值:{self.count_number} + {items['value']} = {self.count_number+items['value']}")
            self.count_number += items['value']

    def runs(self):
        for page in range(1, 100+1):
            self.request_server(page=page)
            time.sleep(1)
        print(f"100页的所有数据并加和:{self.count_number}")


if __name__ == '__main__':
    Spider().runs()

在这里插入图片描述


总结

推荐:网洛者反爬练习平台第二题:JJEncode 加密 :https://blog.csdn.net/kdl_csdn/article/details/121955374

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/377398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跬智信息全新推出云原生数据底座玄武,助力国产化数据服务再次升级

2月28日&#xff0c;跬智信息&#xff08;Kyligence&#xff09;宣布全新推出国产化云原生数据底座开源项目玄武&#xff08;XUANWU&#xff09;&#xff0c;以助力企业加速数据平台上云&#xff0c;并实现国产化升级。玄武&#xff08;XUANWU&#xff09;是在容器化技术上形成…

分层测试(2)单元测试【必备】

1. 什么是单元测试&#xff1f; 对代码中的逻辑隔离的最小代码片段进行测试&#xff0c;验证其逻辑是否符合预期&#xff0c;单元可以是函数&#xff0c;方法&#xff0c;类&#xff0c;功能模块。 2. 单元测试的优点 掌握代码&#xff1a;单元测试允许开发人员了解单元提供…

35岁的测试被裁,公司地位还不如00后...

国内的互联网行业发展较快&#xff0c;所以造成了技术研发类员工工作强度比较大&#xff0c;同时技术的快速更新又需要员工不断的学习新的技术。因此淘汰率也比较高&#xff0c;超过35岁的基层研发类员工&#xff0c;往往因为家庭原因、身体原因&#xff0c;比较难以跟得上工作…

python公司企业编码条形码二维码生成系统

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;python编码 免费获取完整源码源文件配置说明教程等 在PyCharm中运行《企业编码生成系统》即可进入如图1所示的系统主界面。在该界面中可以选择要使用功能对应的菜单进行不同的操作。在选择功能菜单时&#xff0c;只需要输入…

Javascript的API基本内容(四)

一、日期对象 获取时间戳的方法&#xff0c;分别为 getTime 和 Date.now 和 new Date() // 1. 实例化const date new Date()// 2. 获取时间戳console.log(date.getTime()) // 还有一种获取时间戳的方法console.log(new Date())// 还有一种获取时间戳的方法console.log(Date.n…

maven进阶总结

maven进阶总结1. maven之间可以互相导包2. maven的依赖是具有传递性的3. 可选依赖和排除依赖&#xff1a;4. 继承与聚合4.1聚合4.2 继承5. 属性的配置与使用6. 版本管理8. 多环境开发和跳过测试&#xff08;了解&#xff09;1. maven之间可以互相导包 从当前maven的pom文件中&…

DNS服务器部署的详细操作(图文版)

DNS服务器的部署 打开虚拟机后查看已经开放的端口&#xff0c;可以看到没有TCP53、UDP53&#xff0c;说明DNS服务端口没有打开 打开我的电脑—双击CD驱动器— 选择安装可选的Windows组件 选择网络服务—域名系统&#xff08;DNS&#xff09;— 点击下一步后会弹出如下弹…

Kubernetes08:Controller (有状态应用)

Kubernetes08&#xff1a;Controller 1、无状态和有状态的区别 1&#xff09;无状态&#xff1a; 认为Pod都是相同的没有顺序要求不用考虑我在哪个node上运行随意进行伸缩和扩展 有状态&#xff1a; 上面的因素都需要考虑到让每个Pod都是独立的&#xff0c;保持Pod启动顺序…

mysql去重查询的三种方法

文章目录前言一、插入测试数据二、剔除重复数据方法1.方法一&#xff1a;使用distinct2.方法二&#xff1a;使用group by3.方法三&#xff1a;使用开窗函数总结前言 数据库生成环境中经常会遇到表中有重复的数据&#xff0c;或者进行关联过程中产生重复数据&#xff0c;下面介…

【API网关】Kong安装和基本操作

文章目录前言一、API网关选型和Kong的安装1. 什么是API网关2. API网关技术选型3. 安装postgresql和migrations4. 安装kong5. 安装konga二、基本的路由转发配置1. kong的8001、8000和1337端口号的关系2. 基本的路由转发配置3. kong集成consul实现服务发现和负载均衡4. kong配置j…

程序员推荐的良心网站合集!

今天来给大家推荐几个程序员必看的国外良心网站合集。 IBM developer 技术性很强的博客网站&#xff0c;网站自带真实示例代码和架构解决方案&#xff0c;大家可以在上面找到适合自己的语言方向开始学习交流。 https://developer.ibm.com/ infoq 技术论坛社区&#xff0c;内…

【JavaScript】根据元素内容遍历元素的方案

▒ 目录 ▒&#x1f6eb; 导读需求1️⃣ jQuery2️⃣ XPATH&#xff08;document.evaluate&#xff09;3️⃣ 原生js&#xff08;querySelectorAll & Array&#xff09;&#x1f6ec; 文章小结&#x1f4d6; 参考资料&#x1f6eb; 导读 需求 因业务需要&#xff0c;根据元…

文献阅读笔记 # 面向大规模多版本软件系统的代码克隆检测加速技术

面向大规模多版本软件系统的代码克隆检测加速技术&#xff0c;方维康 吴毅坚 赵文耘&#xff0c;《计算机应用与软件》复旦大学软件学院、复旦大学上海市数据科学重点实验室2022 April 面向大规模多版本软件系统的代码克隆检测加速技术 摘要 很多代码克隆检测方法主要针对软…

_Linux (网络版计算器简易实现)

文章目录1. 协议2. 网络版计算器简易实现代码链接3. 网络版计算器2-1. 约定的协议方案有两种2-3. 协议代码框架1. 自定义的协议方案2. json(库里的完整协议方案&#xff09;2-4. send和recv单独使用不安全2-5. 剩余代码写法讲解参考如下&#xff1a;2-6. 代码运行结果示意图&am…

9.5 PIM-SM

实验目的 熟悉PIM-SM的应用场景掌握PIM-SM的配置方法 实验拓扑 实验拓扑如图9-40所示&#xff1a; 图9-40&#xff1a;PIM-SM 实验步骤 &#xff08;1&#xff09;配置IP地址 MCS1的配置 MCS1的配置如图9-41所示&#xff1a; 图9-41&#xff1a;配置MCS1的IP地址 R1的配置 …

VMware安装FreeBSD虚拟机

1. 下载FreeBSD镜像地址 国内阿里云下载地址&#xff1a; freebsd-releases-ISO-IMAGES安装包下载_开源镜像站-阿里云 选择自己需要的版本下载。 2. 创建FreeBSD虚拟机 2.1. 选择操作系统类型 2.2. 导入FreeBSD镜像 3. 安装FreeBSD 第1步&#xff1a;保持默认让其自动进入…

复习知识点十之方法的重载

目录 方法的重载 练习1: 练习1: 数组遍历 练习2: 数组的最大值 练习3: 练习4: 复制数组 基本数据类型和引用数据类型 方法的重载 Java虚拟机会通过参数的不同来区分同名的方法 练习1: public class Test4 {public static void main(String[] args) {//调用方法 // …

grid宫格布局新手快捷上手-f

前言 grid 网上有很多&#xff0c;但都是大而全的&#xff0c;感觉新人上手很吃力&#xff0c;本文仅以最快捷的方式进行介绍&#xff0c;如何使用grid宫格布局 本文是新人上手&#xff0c;若想了解更多grid布局&#xff0c;请阅读其他文章 使用 声明布局 display: grid;声…

springboot+pgbouncer+postgres数据库连接池集成方案及问题解决

期望通过每一次分享&#xff0c;让技术的门槛变低&#xff0c;落地更容易。 —— around 前言 旨在解决微服务项目全是连接池并影响数据库并发连接&#xff0c;作者的环境是基于sprongboot微服务连接postgres数据库&#xff0c;每个微服务的DAO层配置都使用了连接池技术。后续…

一个线程两次调用start()方法会出现什么情况?

第17讲 | 一个线程两次调用start()方法会出现什么情况&#xff1f; 今天我们来深入聊聊线程&#xff0c;相信大家对于线程这个概念都不陌生&#xff0c;它是 Java 并发的基础元素&#xff0c;理解、操纵、诊断线程是 Java 工程师的必修课&#xff0c;但是你真的掌握线程了吗&am…