技术背景与目标

目标网址:aHR0cHM6Ly93d3cuY2VhaXIuY29tLw==

JS逆向分析流程

打开目标网址,随便输入手机号,点击获取验证码,会触发验证码。

人工通过验证码后,接口会响应T001.这是正常通过后的请求,相似的还有F015位置不对,F001环境采集不对等等。具体响应解释,可以看官方文档服务端接入-验证码(Captcha)-阿里云帮助中心

观察抓包情况标准v3发包流程。v3发包流程:init初始化-->log1-->upload(可省)-->log2-->log3(动态轨迹)-->veruftCaotcgaV3(验证)

init接口

里面变化参数是:Timestamp时间戳,SceneId(每个厂商分配的标识) signatureNonce(随机数)Signature(签名参数加密)

全局搜一下singatureNonce并打上断点刷新,此时signatureNonce通过dr()方法生成。singature是通过整个参数加上fpOKzILEajkqgSpr9VvU98FwAgIRcX秘钥(可固定)来进行加密

signatureNonce:进入dr方法是一个随机数。可以用uuid代替

sigature:base64+sha1算法

获取完之后得到响应,里面响应了背景图,缺口图,以及pe.js

LOG1

刷新页面,重新触发Log1断点跟栈,此时已经生成data

搜索c.data并打上断点重新触发。u为ab034ec0643f91399eb33e062dc7fae1固定key。第二个参数固定为w,第三个参数f是上一行生成。第四个参数固定W20220202。第六个参数固定CLOUD,第七个固定空

f参数:W.10001.c+ appName+sceneId+"#captcha-front#"+prefix+"cn" 

f = i.PLATFORM + "#" + a + "#" + (i.sceneId || "") + "#captcha-front#" + i.prefix + "#" + i.region,

we加密行数进去是一个AES加密

Log1请求成功会获取一个DeeviceConfig,里面会解密出feilin.js,ip等设备信息

DeviceConfig解密:全局搜一下DeviceCongig并打上断点

继续跟栈会发现AES加密。然后并以#来分割数据。解析的数据分别是:fp_key,switch,session_id(log2/3/deviceToken使用),feilin.js,ts,ip

LOG2

重新触发断点跟栈,在动态feilin.js里面找到变量,t0是生成的log2接口的data

打上断点重新触发此时T0是原始值,继续跟栈

重新打上断点,这里是data的生成。这是外层的加密

继续回到传入数据那里跟栈。往上走。入口在这,

跟栈,具体入口是一个pomise格式

继续跟栈,会进入一个巨大的混淆,用ats结一下。或者慢慢跟栈。会看到生成的值

加密逻辑是先采集浏览器 133 个特征字段拼成指纹串,用 Log1 下发的 fp_key 做第一次 AES 加密,再套上 UPLOAD_KEY 做第二次 AES 加密,最终以 HMAC-SHA1 签名(浏览器采集的指纹特征下面用iv8采集)

LOG3:

检测浏览器插件,自动化检测,环境检测。这一步是来区分机器和人为的。(实测可以忽略,不影响最终结果)

UPLOAD

检测验证码发送时间,用来监控性能(可省略)

VERIFY(验证接口)

重复刚才的断点操作,找到verify接口然后跟栈,最下面的是最初的格式,带着缺口坐标,时间戳,页面的坐标去转换

继续跟栈,还是一个pomise格式。随后进入一个大的混淆循环里面生成。

最终数据生成逻辑是

deviceToken:

enc = AES_CBC_encrypt(fingerprint_133字段, fp_key)   ← 密钥来自 Log1 下发的 fp_key

md5_in = "WEB" + "#" + session_id + "#" + enc + "#" + counter + "#" + "daye,raolewoba!"

deviceToken = base64( "WEB#sessionId#enc#counter#md5的hex" )

data:

nc_json = {"TrackList": {...}, "xPos": "143", "arg": "base64密文", ...}

step 1: checksum(nc_json) + nc_json              ← 32字节校验和 + 原文
step 2: base64( deflate.level6(step1结果) )       ← 压缩
step 3: vm_encode(step2结果, data_key)            ← RC4变体加密

IV8获取feilin

因为feilin版本是动态替换的,每次逻辑一样,但是里面的变量和方法名不一样,所以说。这个feilin采集不能用python代替,否则时不时就要去适配新的版本。用node来实现的话,一方面是跨语言调用,一方面是补环境相对于繁琐,这时候iv8可以拿来使用。跟补环境一样,唯一不足的是iv8有些原生浏览器的api没有(免费的iv8)

log2接口的133字段采集:接口返回的feilin.js下载完,直接加载生成,挂载到iv8里面(图一是iv8的调用,图二是部分加载的环境)

 

成功检验

实测多个版本可适应,无需担心feilin版本替换,成功率在80%左右,缺口识别用自己写的ocr识别。具体思路是:读取图片-->转通道--》降噪--》判断区域噪点来识别缺口

反反爬策略与优化

常见优化:ip代理,ua随机,屏幕大小随机(要确定好比例,不然动态轨迹生成不准确)

法律与伦理边界

  • 逆向技术的合法使用范围
  • 企业防护与用户隐私的平衡
  • 个人观点,禁止商业行为,侵权请联系下架
Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐