【JS 逆向百例】X球投资者社区 cookie 参数 acw_sc__v2 加密分析

部署运行你感兴趣的模型镜像

关注微信公众号:K哥爬虫,持续分享爬虫进阶、JS/安卓逆向等技术干货!

声明

本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!

逆向目标

  • 目标:X 球投资者社区 cookie 参数 acw_sc__v2 加密分析
  • 主页:aHR0cHM6Ly94dWVxaXUuY29tL3RvZGF5
  • 逆向参数:Cookie:acw_tc=27608267164066250867189...

抓包分析

我们的爬虫目标是:精华 —> 今日话题 —> X球热帖,热帖是 Ajax 加载的,很容易找到数据接口,接口没有其他的加密参数,主要是 cookie 里有一些值,没有 cookie 是无法访问的,其中,cookie 里又有一个 acw_sc__v2 的值,是通过 JS 生成的,其他值都是首次访问首页得到的,抓包如下:

01.png

加密查找

我们清除一下 cookie,打开 F12 开发者工具,刷新页面,发现会进入反调试,出现了无限 debugger,往上跟调用栈,可以看到这个方法里有一大串混淆后的代码,拼接起来其实就是 debugger,如下图所示:

02.png

过掉 debugger 也很简单,需要注意的是这个站比较刁钻,第一次访问首页直接是混淆的 JS 代码,后面才会跳转到正常的 HTML 页面,如果你想本地替换 JS 的话,debugger 倒是过掉了,不过后续就有可能无法调试了,感兴趣的朋友可以自己试试,这里K哥就直接右键 Never pause here 永不在此处断下了:

03.png

我们观察这个混淆代码,直接搜索 acw_sc__v2,可以看到最后面有设置 cookie 的操作,其中 x 就是 acw_sc__v2 的值:

04.png

参数逆向

我们往上跟调用栈,看看 x 是怎么得来的,这里 setTimeout 时间一到就会执行 '\x72\x65\x6c\x6f\x61\x64\x28\x61\x72\x67\x32\x29',控制台输出一下会发现就是 reload 方法,传入的参数是 arg2,arg2 的值就是 acw_sc__v2 的值,如下图所示:

05.png

arg1 在头部定义了,需要注意的是,每次刷新,这个 arg1 会变,所以我们在后面取值时要动态获取,我们把关键代码单独拿出来分析一下:

var arg1 = '6A6BE0CAF2D2305297951C9A2ADBC2E8D21D48FD';
var _0x5e8b26 = _0x55f3('0x3', '\x6a\x53\x31\x59');
var _0x23a392 = arg1[_0x55f3('0x19', '\x50\x67\x35\x34')]();
arg2 = _0x23a392[_0x55f3('0x1b', '\x7a\x35\x4f\x26')](_0x5e8b26);

可以看到主要就是这个 _0x55f3() 方法,如果你直接把这个方法扣下来的话,本地运行会直接进入死循环,多调试几遍就会发现 _0x5e8b26 调用函数传参每次都是一样的,每次的结果也是一样的,所以可以直接写成定值,arg2 的 _0x23a392[_0x55f3('0x1b', '\x7a\x35\x4f\x26')] 其实就是用了一个匿名函数,如下图所示:

06.png

我们直接跟进这个匿名函数,可以看到里面同样调用了很多 _0x55f3() 方法,我们直接在控制台输出一下,然后把结果直接拿到本地即可:

07.png

所有结果替换掉后,会发现还会依赖另一个匿名函数,最后将这两个匿名函数全部扣下来即可:

08.png

当然如果遇到调用非常多 _0x55f3() 方法的情况,那就不可能挨个替换了,就需要进一步分析该函数里面的逻辑,在本地单步调试,看是由于什么原因进入了死循环,里面非常多的 if-else 语句,肯定是缺少某个环境导致进入 else 语句,从而导致死循环了,直接删除 else 语句、补环境走 if 语句等做法都是可以的。

完整代码

GitHub 关注 K 哥爬虫,持续分享爬虫相关代码!欢迎 star !https://github.com/kgepachong/

以下只演示部分关键代码,不能直接运行! 完整代码仓库地址:https://github.com/kgepachong/crawler/

JavaScript 加密代码

/* ==================================
# @Time    : 2021-12-29
# @Author  : 微信公众号:K哥爬虫
# @FileName: get_acw_sc_v2.js
# @Software: PyCharm
# ================================== */

var _0x5e8b26 = '3000176000856006061501533003690027800375'

var getAcwScV2 = function (arg1) {
    String['prototype']['hexXor'] = function (_0x4e08d8) {
        var _0x5a5d3b = '';
        for (var _0xe89588 = 0x0; _0xe89588 < this['length'] && _0xe89588 < _0x4e08d8['length']; _0xe89588 += 0x2) {
            var _0x401af1 = parseInt(this['slice'](_0xe89588, _0xe89588 + 0x2), 0x10);
            var _0x105f59 = parseInt(_0x4e08d8['slice'](_0xe89588, _0xe89588 + 0x2), 0x10);
            var _0x189e2c = (_0x401af1 ^ _0x105f59)['toString'](0x10);
            if (_0x189e2c['length'] == 0x1) {
                _0x189e2c = '0' + _0x189e2c;
            }
            _0x5a5d3b += _0x189e2c;
        }
        return _0x5a5d3b;
    };
    String['prototype']['unsbox'] = function () {
        var _0x4b082b = [0xf, 0x23, 0x1d, 0x18, 0x21, 0x10, 0x1, 0x26, 0xa, 0x9, 0x13, 0x1f, 0x28, 0x1b, 0x16, 0x17, 0x19, 0xd, 0x6, 0xb, 0x27, 0x12, 0x14, 0x8, 0xe, 0x15, 0x20, 0x1a, 0x2, 0x1e, 0x7, 0x4, 0x11, 0x5, 0x3, 0x1c, 0x22, 0x25, 0xc, 0x24];
        var _0x4da0dc = [];
        var _0x12605e = '';
        for (var _0x20a7bf = 0x0; _0x20a7bf < this['length']; _0x20a7bf++) {
            var _0x385ee3 = this[_0x20a7bf];
            for (var _0x217721 = 0x0; _0x217721 < _0x4b082b['length']; _0x217721++) {
                if (_0x4b082b[_0x217721] == _0x20a7bf + 0x1) {
                    _0x4da0dc[_0x217721] = _0x385ee3;
                }
            }
        }
        _0x12605e = _0x4da0dc['join']('');
        return _0x12605e;
    };
    var _0x23a392 = arg1['unsbox']();
    arg2 = _0x23a392['hexXor'](_0x5e8b26);
    return arg2
};

// 测试输出
// var arg1 = '2410463826D86A52A5BB43A13A80BAE6C4122A73';
// console.log(getAcwScV2(arg1))

Python 测试代码

# ==================================
# --*-- coding: utf-8 --*--
# @Time    : 2021-12-29
# @Author  : 微信公众号:K哥爬虫
# @FileName: main.py
# @Software: PyCharm
# ==================================


import re
import execjs
import requests


index_url = "脱敏处理,完整代码关注 GitHub:https://github.com/kgepachong/crawler"
news_test_url = "脱敏处理,完整代码关注 GitHub:https://github.com/kgepachong/crawler"
headers = {
    "Host": "脱敏处理,完整代码关注 GitHub:https://github.com/kgepachong/crawler",
    "Referer": "脱敏处理,完整代码关注 GitHub:https://github.com/kgepachong/crawler",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36",
}


def get_complete_cookie():
    complete_cookie = {}
    # 第一次不带参数访问首页,获取 acw_tc 和 acw_sc__v2
    response = requests.get(url=index_url, headers=headers)
    complete_cookie.update(response.cookies.get_dict())
    arg1 = re.findall("arg1='(.*?)'", response.text)[0]
    with open('get_acw_sc_v2.js', 'r', encoding='utf-8') as f:
        acw_sc_v2_js = f.read()
    acw_sc__v2 = execjs.compile(acw_sc_v2_js).call('getAcwScV2', arg1)
    complete_cookie.update({"acw_sc__v2": acw_sc__v2})
    # 第二次访问首页,获取其他 cookies
    response2 = requests.get(url=index_url, headers=headers, cookies=complete_cookie)
    complete_cookie.update(response2.cookies.get_dict())
    return complete_cookie


def news_test(cookies):
    response = requests.get(url=news_test_url, headers=headers, cookies=cookies)
    print(response.json())


if __name__ == '__main__':
    complete_cookie = get_complete_cookie()
    news_test(complete_cookie)

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>嗯,用户想了解如何逆向acw_sc__v3,这通常和反爬虫技术有关。首先,我需要确认acw_sc__v3的具体应用场景,比如它可能是一个网站使用的反爬机制,比如在请求中生成特定的参数,比如acw_sc__v3这个cookie或者参数,用来防止爬虫。常见的反爬手段包括加密参数、动态token、JavaScript挑战等。 接下来,我应该回忆一些常见的逆向方法。比如,通过浏览器的开发者工具分析网络请求,查看acw_sc__v3是如何生成的,是否由前端JavaScript生成。可能需要找到生成该参数JavaScript代码,理解其逻辑,然后尝试用Python或其他语言重现。 另外,可能需要使用工具如Chrome的开发者工具中的断点调试,或者使用Fiddler、Charles抓包工具来监控请求和响应,看看在获取acw_sc__v3之前,服务器是否返回了某些特定的JS代码或挑战,比如obfuscated JavaScript,然后前端执行这段代码生成所需的参数。 比如,有些反爬机制会返回一个JavaScript挑战,需要客户端计算出一个值,比如通过特定的算法处理一个字符串,生成acw_sc__v3的值。这时候需要分析这段JS代码,找到关键的计算部分,可能涉及hex编码、位运算、或者其他加密方法。 如果JS代码被混淆,可能需要使用反混淆工具或者手动分析,找到关键函数。比如,可能在代码中搜索acw_sc__v3这个关键字,找到设置该参数的地方,然后回溯代码逻辑,找到生成它的函数。 然后,用户可能需要用Python中的execjs库来执行这段JS代码,或者将JS逻辑翻译成Python代码,以便在爬虫中生成正确的acw_sc__v3参数,从而绕过反爬机制。 此外,可能还需要注意其他相关的参数cookie,是否有时间戳、其他动态值,或者是否需要维护会话(session)来保持状态,因为有些反爬机制会检测请求的连贯性。 还需要注意法律和道德问题,确保逆向的目的是合法的,遵守网站的robots.txt和相关法律法规,避免侵犯隐私或版权。 总结来说,逆向acw_sc__v3可能需要以下步骤:分析网络请求定位参数生成的来源,解混淆并理解JS逻辑,用代码重现生成过程,处理可能的动态挑战,最后在爬虫中模拟生成正确的参数。过程中可能需要调试和反复测试,确保生成的参数有效。</think>逆向 `acw_sc__v3` 通常涉及分析网站的反爬虫机制,尤其是针对生成该参数的前端 JavaScript 逻辑。以下是通用步骤和思路(仅供学习参考,请遵守法律法规和网站规则): --- ### **1. 定位参数生成位置** - **使用浏览器开发者工具**(F12): - 在 **Network** 选项卡中筛选请求,找到携带 `acw_sc__v3` 的请求。 - 检查该请求的 **Initiator** 或 **调用栈**,定位生成参数JavaScript 代码位置。 --- ### **2. 分析 JavaScript 逻辑** - **关键代码搜索**: - 在网站的 JS 文件中搜索关键词 `acw_sc__v3`,找到设置该参数的代码段。 - 通常参数生成逻辑会涉及加密、哈希或特定算法(如将字符串转换为特定编码)。 - **案例参考**: - 某些场景下,网站会返回一段混淆的 JS 代码作为“挑战”,要求客户端计算出一个值(例如 `hexXOR` 或 `CRC` 操作)。 - 例如:服务器返回一个待处理的字符串 `arg1`,前端通过算法生成 `acw_sc__v3`。 --- ### **3. 解混淆与逻辑提取** - **处理混淆代码**: - 使用工具(如 `AST` 解析器、在线反混淆网站)简化代码结构。 - 手动跟踪关键变量和函数,提取核心计算逻辑。 - **核心算法示例**(假设): ```javascript function generateACWSCv3(arg1) { let hexArray = []; for (let i = 0; i < arg1.length; i++) { hexArray.push(arg1.charCodeAt(i).toString(16)); } let xorResult = hexArray.map(c => parseInt(c, 16) ^ 0x1).join(''); return xorResult + 'a3e0'; // 假设的固定后缀 } ``` --- ### **4. 用代码复现逻辑** - **Python 实现示例**: ```python def generate_acw_sc_v3(arg1): hex_chars = [hex(ord(c))[2:] for c in arg1] xor_result = ''.join([format(int(c, 16) ^ 0x1, 'x') for c in hex_chars]) return xor_result + 'a3e0' ``` --- ### **5. 处理动态挑战** - **自动化流程**: 1. 发送初始请求,获取服务器返回的 `arg1`(可能隐藏在响应内容或 Set-Cookie 中)。 2. 调用复现的算法生成 `acw_sc__v3`。 3. 携带该参数重新发起请求,验证是否绕过反爬。 --- ### **6. 工具与技巧** - **调试工具**:使用 Chrome 的 **Debugger** 或 **VSCode + JavaScript Debugger** 跟踪变量。 - **中间人代理**:通过 **Charles** 或 **Mitmproxy** 拦截修改请求,测试参数有效性。 - **自动化库**:结合 `requests`、`execjs`(执行 JS) 或 `PyExecJS` 处理复杂计算。 --- ### **注意事项** - **法律风险**:确保逆向行为符合目标网站的 `robots.txt` 和服务条款。 - **动态更新**:反爬逻辑可能频繁变动,需定期维护代码。 - **性能优化**:复杂算法可考虑用 Python 重写,避免依赖 JS 解释器。 如果需要具体网站的案例分析,请提供更多上下文(如示例 URL 或请求响应片段),但请确保不涉及隐私或侵权内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值