目录
[captcha/verify 验证码接口](#captcha/verify 验证码接口)
个人声明
本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容、严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!
此文章重在学习调试技巧。模拟参数生成。
目标网站:aHR0cHM6Ly93d3cueXVucGlhbi5jb20vcHJvZHVjdC9jYXB0Y2hh

简述:
云片验证码难度整体不难,加密非常简单,参数也不难找。轨迹和比例缩放有点坑。
接口分析
jsonp/captcha/get获取验证码的接口
请求体:

除了会话ID,其它都是要求的
响应体:

以上四个数是比较重要的,特别注意。滑块宽度,每次请求获取滑块图的宽度都是不一样的。但页面渲染的滑块宽度跟实际获取的滑块宽度不一样,需要转换。
captcha/verify 验证码接口

这里的i值会进行轨迹加密,不过跟验证码接口的加密都是一样。

成功响应内容,code为0,result为true,返回authenticate
逆向分析
验证码接口
跟栈毫无难度


很显然是RSA和AES加密,RSA密钥也直接搜就行。

e和n是随机数,把e和n扣下来就可以
然后先把关键的t扣下来
发现基本可以写死

环境指纹在这里赋值

在这里赋值

这里好像不是MD5加密
e是一大堆环境

这里风控不大,写死写活都行,写活用随机MD5表示即可。同一个浏览器这个指纹值是一样的,不同浏览器不一样。
接下来是uuid

其实也简单扣下来就行,随机uuid,其它用标准库就可以了。
cb也是随机数

扣下来就行。至此第一个接口解决。
验证接口
轨迹模拟
验证接口和验证码接口的加密算法一样,唯一就是多了两个要求轨迹值和x值

就这两个值

跟栈或者搜关键字


进入函数

D函数传参这一段就是原始轨迹了,把这两段函数扣下来即可。不过好像不是从0开始的。
事实轨迹算的是这里距离X和Y

加上你点击这个滑块的长度的随机数


也就是说最开头的那个数可以看作零,然后最后面的那个数可以看作最开始的数加识别滑块的距离X
而且你获取的图片大小和页面渲染的图片大小也是不一样

所以得比例缩放。
X距离比例缩放不能按照背景图宽度得比例去缩放,因为滑块图片宽度也会变。
所以最好的方法就是要么用PIL按实际图片去缩放,然后得出大概比例值,要么跟网页对比,用相同的图片用ocr识别后值对照网页上的值。然后按比例缩放
我在这里掉坑了,一开始按图片缩放是获取值。也不能说没有成功率,成功率非常低罢了。
网页的X坐标
比例值缩放大越是1.45,按实际的值/1.45就是网页的值了。
python
x = int(ocr.slide_match(front_content,bg_content)['target'][0])
x = int(x/1.45)
至于轨迹。也是可以使用轨迹切割法,滑块慢速拖到底。


原始轨迹是D函数里的this.position。要经过两个函数二次处理,不要拿二次处理后的轨迹。
然后把should坐标当为零,末坐标当为首坐标加滑块距离就行。
轨迹生成函数
python
def parse_trace_data(slide_distance):
track = [[1113, 1974, 270], [1114, 1974, 294], [1115, 1974, 319], [1116, 1974, 326], [1118, 1974, 335],
[1119, 1974, 342], [1120, 1974, 358], [1121, 1974, 366], [1122, 1974, 527], [1123, 1974, 536],
[1125, 1974, 551], [1126, 1974, 575], [1127, 1974, 664], [1128, 1974, 671], [1129, 1973, 687],
[1130, 1972, 694], [1131, 1972, 710], [1132, 1972, 726], [1133, 1972, 750], [1134, 1972, 758],
[1135, 1972, 767], [1136, 1972, 782], [1137, 1972, 806], [1138, 1972, 814], [1139, 1972, 825],
[1140, 1972, 871], [1141, 1972, 890], [1142, 1972, 897], [1143, 1972, 907], [1144, 1972, 918],
[1145, 1972, 934], [1146, 1972, 950], [1147, 1972, 958], [1148, 1972, 974], [1149, 1972, 998],
[1150, 1972, 1032], [1151, 1972, 1039], [1152, 1972, 1087], [1154, 1972, 1213], [1156, 1972, 1222],
[1158, 1972, 1230], [1160, 1972, 1238], [1162, 1972, 1246], [1163, 1972, 1254], [1165, 1972, 1262],
[1167, 1972, 1270], [1168, 1972, 1279], [1169, 1972, 1286], [1170, 1972, 1294], [1171, 1972, 1303],
[1172, 1972, 1310], [1173, 1972, 1326], [1174, 1972, 1351], [1175, 1972, 1447], [1176, 1972, 1454],
[1177, 1972, 1463], [1178, 1972, 1473], [1179, 1972, 1480], [1180, 1972, 1495], [1181, 1972, 1502],
[1182, 1972, 1510], [1183, 1972, 1518], [1184, 1972, 1528], [1185, 1972, 1542], [1186, 1972, 1623],
[1187, 1972, 1639], [1188, 1972, 1647], [1189, 1972, 1799], [1190, 1972, 1807], [1191, 1972, 1817],
[1193, 1972, 1824], [1197, 1972, 1833], [1201, 1972, 1839], [1204, 1972, 1847], [1208, 1972, 1853],
[1211, 1972, 1862], [1213, 1972, 1871], [1214, 1972, 1878], [1215, 1972, 1887], [1216, 1972, 1894],
[1218, 1972, 1975], [1221, 1972, 1983], [1223, 1972, 1990], [1226, 1972, 1998], [1229, 1972, 2005],
[1231, 1972, 2014], [1232, 1972, 2022], [1233, 1972, 2030], [1234, 1972, 2054], [1235, 1972, 2078],
[1237, 1972, 2086], [1238, 1972, 2094], [1239, 1972, 2102], [1240, 1972, 2110], [1241, 1972, 2126],
[1242, 1972, 2134], [1243, 1972, 2150], [1244, 1972, 2272], [1245, 1972, 2288], [1246, 1972, 2296],
[1249, 1972, 2305], [1252, 1972, 2311], [1254, 1972, 2319], [1257, 1972, 2326], [1259, 1972, 2334],
[1260, 1972, 2350], [1262, 1972, 2567], [1263, 1972, 3087], [1264, 1972, 3094], [1267, 1972, 3102],
[1271, 1972, 3110], [1273, 1972, 3118], [1274, 1972, 3126], [1275, 1972, 3142], [1276, 1972, 3206],
[1277, 1972, 3223], [1278, 1972, 3536], [1281, 1972, 3543], [1287, 1972, 3553], [1297, 1972, 3558],
[1305, 1972, 3566], [1313, 1972, 3574], [1319, 1972, 3582], [1325, 1972, 3590], [1330, 1972, 3598],
[1335, 1972, 3607], [1337, 1973, 3614], [1338, 1973, 3627], [1339, 1973, 3632], [1340, 1973, 4200],
[1343, 1973, 4206], [1347, 1973, 4214], [1350, 1973, 4222], [1353, 1973, 4230], [1356, 1973, 4238],
[1357, 1973, 4246], [1358, 1973, 4254], [1359, 1973, 4262], [1361, 1973, 4278], [1363, 1973, 4286],
[1365, 1973, 4294], [1368, 1973, 4302], [1371, 1973, 4310], [1374, 1973, 4317], [1379, 1973, 4326],
[1384, 1973, 4334], [1391, 1973, 4342], [1399, 1973, 4350]]
start_x =1112
start_y =1974
start_t = 256
trace_data = [1112,1974,256]
track_arr = [trace_data]
for i in range(len(track)):
if track[i][0] < 1112+slide_distance:
track_arr.append(track[i])
if track[i][0] >=1112+slide_distance:
track[i][0] = 1112+slide_distance
track_arr.append(track[i])
break
return track_arr
坐标解析

this.offsetX 是对比网页的滑块距离
this.alertImgTag.width是网页滑块的宽度

固定尺寸是110 *240
110是第一个接口返回的

再刷新

变成104*240
但实际却是网页渲染的大小66*152

这种长度缩放就可以按照比例缩放了。

比例是1.57

r值就是这个公示
javascript
(304 -(sliderWidth))*(x/(304-42))/304,
sliderWidth是缩放长宽度,除以1.57
x是滑块距离,除以1.45

总结:

成功率差不多八成以上吧。