前言图像选择挑战(Image Selection reCAPTCHA)描述:当系统无法通过复选框确认用户身份时,会显示一个图像选择任务,要求用户从一组图片中选择符合特定条件的图片,例如“选择包含交通灯的图片”或“选择包含汽车的格子”。例子:用户可能看到一个 3x3 的图片网格,要求点击包含指定对象的格子(例如街道标志、商店门面等)。有时需要多轮选择,直到系统确认用户为人类。使用场景:用于需要更高安全性的场景,如防止机器人批量注册或提交垃圾信息。
流程分析Protobuf–>一个数组–>分析每个数组的来源—>最后Protobuf编码回去
算法分析(部分算法)123456// Base64编码表 - 标准表和变种表const nU = { 4: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", // reCAPTCHA自定义变种编码表 5: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop ...
前言最近几年web对抗的发展越发激烈由此我产生了一点的心得,在Web安全对抗领域,尤其是针对像TikTok这样使用复杂保护机制的平台,提升对抗水位需要从多个维度入手
代码保护升级虚拟机保护强化多层嵌套VM: 实现VM嵌套执行,增加反编译难度动态指令集: 每次请求使用不同的指令集映射,避免静态分析指令混淆: 添加无效指令和干扰指令,增加分析复杂度加密算法升级自定义加密算法: 避免使用标准MD5等可被识别的算法密钥动态生成: 基于用户环境、时间等因素动态生成密钥分段加密: 将关键数据分段加密,增加完整性保护
请求签名增强设备指纹整合: 将更多设备特征融入签名(屏幕分辨率、已安装字体等)行为特征签名: 将用户行为特征(鼠标轨迹、按键节奏)纳入签名时间敏感性: 增加时间窗口限制,使签名短时间内有效
签名算法复杂化12345678910111213141516function enhancedSignature(url, userAgent, deviceInfo) { // 基础签名 const baseSignature = generateBaseSignature( ...
理解VMP的基本原理VMP将原始JavaScript代码转换为自定义字节码,然后通过虚拟机解释执行。反编译的第一步是理解这个过程:代码被转换为字节码指令字节码通常会被加密或混淆虚拟机解释器执行这些指令
提取加密的字节码12345function() { return "UEsCANrx2RUFw8qokYduI1xVNgRDKWqhnVbRgruykWWmgr+a0vxOrrU4sEpHzotbGM+5pFxeBq3EW1zDneBMRHFe8ABn8QF2c+UVQq1CV2r4Y241MT5m2IUCdaeCjZyizEXolnF3UNYgB9AW3lzuAzJbpOsypAGNokmQQ3fLi/AHYD8nxoMy16Q92gQxKeZvsnEgV5cRHVn0B0IZUXRzWnVWw+wWccxFV7LP03Hbku7Yq8KRUXAnH5dedJpWI319xRzAEBIAD1RMRpXDS8PpW3vRP6I2CxE6DSiLbrKf1X/c+lz7si55sIrH577MzHNabVUE3tr/TNmguhNW47r8 ...
前言Arkose-MatchKey验证码国外有很多的网站在用到,那么话不多说来分析下
抓包分析流程1.请求token生成2.携带token请求图片3.发包校验
跟栈分析
跟到这里大概率是AES加密如果有需要的话可以解下混淆也比较简单每个函数的作用都嵌套了一个解密函数
分析key和iv生成key生成的位置
以下是m生成的算法
1234UA="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Safari/537.36" f = (new Date)["getTime"]() / 1e3,l = navigator["userAgent"],p = Math["round"](f - f % 21600),
剩下的Vr函数其实就是随机的字节数组生成算法
1234function Vr(arrayType, length) { const array = ...
前言前几个星期,做了小红书初步的解混淆发现还是有一些混淆没有解掉那么现在我就开始解析下
花指令回填https://img.131213.xyz/api/cfile/AgACAgUAAx0Eflp52gAC1CVoTTrJ8pa6pXbYT-zrmZZS9hNh6QACF8UxG00ncFYCQVjfYRXMGAEAAwIAA3gAAzYE让我们拆开来分析这个花指令
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411 ...
AST解混淆难点分析变量名分析逻辑指令分析变量重命名https://img.131213.xyz/api/cfile/AgACAgUAAx0Eflp52gACzndoRZbfv_lLdS-0xF5jjpZqRlbl_gACWsUxG6eQMVZioPk7NvjXlAEAAwIAA3cAAzYE
结构分析1yrx_ﱞﱞﱞ < 3408 + -9131 + -1 * -5725 ? yrx_ﱞﱞﱞ < 2 * 1927 + -50 * -38 + 11 * -523 ? (yrx_ﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞ = yrx_ﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞ["slice"](5335 + 170 * 25 + -5 * 1915, yrx_ﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞﱞ["length"]) 技术难点
整体还原https://img.131213.xyz/api/cfile/AgACAgUAAx0Eflp52gACzntoRZ_sp_ODTxPAUjxaEt8WWXdc9QACfsUxG6eQMVawY6REl1hg1AEAAwIAA3kAAzYE发 ...
流程分析1.token的流程 魔改的md5+参数拼接+charAt拼接
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138function toMd5Hex(text) { var hexcase = 0; var chrsz = 8; function core_md5(x, len) { x[len >> 5] |= 0x80 << ((len) % 32); ...
前言补环境就是浏览器上的js代码在我们本地nodejs环境里直接运行运行不了,那么我们就要补充浏览器的webAPI,使得代码可以运行,这个过程就是补环境。
环境代理通过 Proxy 对象实现对浏览器对象的代理,可以监控和记录所有属性的访问和修改操作。代理深度决定了环境模拟的精细程度,包括:
一级代理:只代理顶层对象(如 document, window, navigator)
多级代理:递归代理嵌套对象(如 document.documentElement, navigator.plugins)1234567891011121314151617181920function wacth(obj, name){ return new Proxy(obj, { get(target, p, receiver){ if (p === "Math" || p === "isNaN" || p === "encodeURI" || p === "Uint8 ...
补环境代理1234567891011121314151617181920function wacth(obj, name){ return new Proxy(obj, { get(target, p, receiver){ // 过滤没用的信息,不进行打印 if (p === "Math" || p === "isNaN" || p === "encodeURI" || p === "Uint8Array" || p.toString().indexOf("Symbol(Symbol.") != -1){ let val = Reflect.get(...arguments); return val } else { let val = Reflect.get(...ar ...
前言小红书目前主要的加密是x-s,好像新出的x-s-common不怎么校验这个参数。那么我们将重点讲述x-s的算法部分
前置知识1.AES加密原理2.md5的原理
md5原理标准MD5算法流程
消息填充(Padding)输入消息按位填充,使其长度(以位为单位)满足:length % 512 == 448。填充规则:追加1位1(即0x80字节)。追加0位,直到长度模512等于448。最后附加64位(8字节),表示原始消息长度(小端序)。结果:消息长度是512位的整数倍,分成N个512位分组。
初始化缓冲区使用四个32位寄存器(A, B, C, D),初始值(十六进制,小端序):A = 0x67452301B = 0xEFCDAB89C = 0x98BADCFED = 0x10325476
分组处理每个512位分组(64字节)分为16个32位字(M[0..15])。对每个分组执行64次迭代,分为4轮(每轮16次),每轮使用不同的非线性函数和常量。
核心变换非线性函数(每轮使用一个):F(X, Y, Z) = (X &a ...









