声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
目标
aHR0cHM6Ly9jbG91ZC50ZW5jZW50LmNvbS9wcm9kdWN0L2NhcHRjaGE=
新版验证码相较于防水墙参数少了很多,关键参数少了vdata
,不过难度都是差不多的。
其中 ans
为缺口坐标,pow_answer
与 pow_calc_time
为 cap_union_prehandle
接口中的数据处理而来,eks
为 tdc
文件中的动态字符串,tlg
为 collect
参数的长度,collect
就是本期要介绍的加密参数。
分析
通过搜索 collect
可以直接定位到参数生成点 window.TDC.getData(!0)
。
从 window.TDC.getData
可以进入一段 vmp
代码中,最开始我也尝试过扣算法,也完成了明文到密文的流程,但是卡在了明文的生成顺序上,可能就差最关键的一步没有走出,最终还是放弃了。
这里主要就来讲解补环境过程中的一些关键点。
首先可以用 proxy
来补部分环境,如 navigator
、 location
、 screen
等等,这部分就不多说了,主要来讲讲关于 dom
操作的一些检测,不仅仅是简单的增删改查操作,也对元素样式进行了检测。如 createElement
getElementById
setAttribute
等,至于如何知道检测了哪些东西就需要插装调试了。
我的插桩点主要在两个地方,D[0]
与 N
处会执行一些 dom
操作,F[F.length - 1]
则可以看到一些关键字的生成,对补环境非常有帮助,可以比较清晰的看到执行了那些方法以及验证了那些属性。
D[0]
中会包含明文信息,在补环境过程中需要时不时的将自己补出来的结果跟网页打印的进行对比,正常的明文会包含以下信息:
{"cd":[231,1080,"",235,"98k",1,1397322462,1698070701,1698070701,[],"Win32","Google Inc. (NVIDIA)",1920,0,"GgoAAAANSUhEUgAAASwAAACWCAYAAAI2CwMlUJSoCAwfIDBAhkBAxWpipBCRdWMQCX4yW9owAAAABJRU5ErkJggg==",2,24,"iframe",1719708211,"https://cloud.tencent.com/product/captcha",6,[360,360],1,"https://cloud.tencent.com/product/captcha?rand=1519713624347","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36","1920-1080-1040-24-*-*-|-0",["zh-CN","zh"],0,"+08","","ANGLE (NVIDIA, NVIDIA GeForce GT 1030 (0x00001D01) Direct3D11 vs_5_0 ps_5_0, D3D11)","UTF-8",0,40,1023,"",1698070661],
其中比较关键的有:
https://cloud.tencent.com/product/captcha?rand=1519713624347 // location.href
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 //请求头
iframe //是否正确创建iframe标签
[360,360] //window.innerHeight window.innerWidth
1920-1080-1040-24---|-0 //screen 中各属性拼接而成
[“zh-CN”,“zh”] // navigator.language
GgoAAAANSUhEUgAAASwAAACWCAYAAAI2CwMlUJSoCAwfIDBAhkBAxWpipBCRdWMQCX4yW9owAAAABJRU5ErkJggg== // canvas.toDataURL()
Google Inc. (NVIDIA) //webgl指纹,通过
getExtension
getParameter
获取
ANGLE (NVIDIA, NVIDIA GeForce GT 1030 (0x00001D01) Direct3D11 vs_5_0 ps_5_0, D3D11) // 同上
1023 // dom检测全部通过后明文中会包含1023
dom
检测的结果可以在 N
中发现,每对一些元素进行检测后,正确为 true
,错误为 false
这里列举一些主要的检测点:
canvas 指纹,fillText,fillRect,fillStyle,font等
webgl 指纹,getExtension,getSupportedExtensions,getParameter等
appendChild,removeChild,setAttribute,cloneNode,replaceChild,insertBefore,createElement,getElementById
window.getComputedStyle,getPropertyValue对元素
color
值的检测document.body,document.head,document.documentElement
localStorage,sessionStorage 设置
session
,获取session
TCaptchaReferrer,matchMedia等
以上为主要检测点,其中需要完成一些简单的dom
操作。在调试过程中,我发现还检测到了RTCPeerConnection
,但是在参数生成后才调用的,因此也不需要补,有兴趣的也可以补一下,这个玩意很多网站都在检测。
RTCPeerConnection = class {
}
RTCPeerConnection.prototype.getLocalStreams = function () {
}
RTCPeerConnection.prototype.createDataChannel = function () {
return {
onopen: function () {
}, onclose: function () {
}, onmessage: function () {
}, send: function () {
}, close: function () {
},
}
}
RTCPeerConnection.prototype.createAnswer = function () {
}
RTCPeerConnection.prototype.createOffer = function () {
return new Promise((resolve, reject) => {
const offer = {
sdp: "v=0\r\no=- 7557661829766968651 2 IN IP4 {ip地址}\r\ns=-\r\nt=0 0\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS\r\n",
type: "offer"
};
resolve(offer);
});
}
RTCPeerConnection.prototype.setLocalDescription = function (sampleDescription) {
return new Promise((resolve, reject) => {
resolve();
});
}
RTCPeerConnection.prototype.setConfiguration = function () {
}
RTCPeerConnection.prototype.addIceCandidate = function () {
}
RTCPeerConnection.prototype.addTrack = function () {
}
RTCPeerConnection.prototype.onicecandidate = function () {
}
RTCPeerConnection.prototype.localDescription = {
sdp: "v=0\r\no=- 7557661829766968651 2 IN IP4 {ip地址}\r\ns=-\r\nt=0 0\r\na=extmap-allow-mixed\r\na=msid-semantic: WMS\r\n",
type: "offer"
}
RTCPeerConnection.prototype.sctp = {}
总而言之,时不时将自己补的结果与网页进行对比,内容基本一致后表示差不多了。这篇文章随便讲的简单,但是基本上关键检测点都提到了,剩下的就靠自己慢慢补了。
附一张结果图: