历经5个月把web逆向给学完了,最后决定进行一个最后解决完成这一段学习过程。选择极验是因为他适合新手具有代表性,同时因为点选前期准备工作需要浪费太多时间设计了太多知识点完成一个点选项目我从0开始学用了小20天今天就来分享一下滑块,和点选解决思路。
首先是load请求把参数给返回了需要的有lot_number、slice、bg、payload、token、protocal、pow_detail。我们需要的pow_msg由version|bits|hashfunc|datetime|captcha_id|lot_number|
|16位随机数。轨迹随意不检验的、距离用ddddocr识别、devide_id随意可以为空“”。最后就是w了。
把gcaptcha4.js文件复制到本地,用jsdom补环境就可以了。
const jsdom = require('jsdom'); const {JSDOM} = jsdom; const dom = new JSDOM(`Hello world
`, { url: '****' }); window = dom.window; XMLHttpRequest = window.XMLHttpRequest; document = window.document; //document对象:代表给定浏览器窗口中的HTML文档, navigator = window.navigator; // 关于运行当前脚本的应用程序的相关信息 location = window.location; //对象包含当前页面的URL信息 history = window.history; // 历史会话 screen = window.screen; // 浏览器屏幕 document.referrer = "" setInterval = function () { } setTimeout = function () { }
完成这两部后就不会报错了,基本不用补什么环境了,如果是阿里227和腾讯的就需要自己手动不了。下面是我w代码部分仅从参考。
function getW(setLeft, passtime, device_id, lot_number, pow_msg, pow_sign) { geetest = 固定 lang = 固定 ep = 固定 jiws = 固定 em =固定 ax4h = fppu(gkl.toString() + fppu(fppu.toString())) + '' s = random() u = new _TT().encrypt(s) r = { "setLeft": x, "passtime": 固定, "userresponse": setLeft/1.0059466666666665+2, "device_id": device_id, "lot_number": lot_number, "pow_msg": pow_msg, "pow_sign": CryptoJS.MD5(pow_msg).toString(), "geetest": geetest, "lang": lang, "ep": ep, "ax4h": ax4h, "jiws": jiws, "em": em } c = _ss.encrypt(JSON.stringify(r), s) // console.log(fppu(fppu.toString())) console.log(_th(c) + u) return (0,_th(c)) + u }
点选就比较麻烦了需要用yolov训练,然后孪生训练,最后还有一堆逻辑要写,重复工作也多建议时间不充裕的可以放一放学安卓或者数据处理先后面再回来学,也可以直接用打码平台我是推荐打码但是钱包不允许我这么做。我后面会把yolov8训练的best.pt放在百度放盘大家可以拿来用,但是孪生的就算了。因为用的cpu训练加上只训练了64次导致最后成功率只有50%。best.pt还可以300张图片截取了896张小图还有几个没训练出来不过够用了后期你可以接着用我best.pt接着训练效果还是可以的我标注的挺认真的。
def y8_detect_xy(result): global targets cls_xy = [] cls_dict = result.names # 使用xyxy属性获取坐标 xyxy_all = result.boxes.xyxy.numpy() if isinstance(result.boxes.xyxy, torch.Tensor) else result.boxes.xyxy cls_all = result.boxes.cls.numpy() if isinstance(result.boxes.cls, torch.Tensor) else result.boxes.cls for i in range(len(xyxy_all)): label_name = cls_dict[int(cls_all[i])] box_xyxy = xyxy_all[i] # box_mid_xy = [(box_xyxy[0] + box_xyxy[2]) / 2, (box_xyxy[1] + box_xyxy[3]) / 2] box_mid_x = (box_xyxy[0] + box_xyxy[2]) / 2 box_mid_y = (box_xyxy[1] + box_xyxy[3]) / 2 final_x = int(round(box_mid_x/ 333.375 * 100 * 100, 0)) final_y = int(round(box_mid_y/ 333.375 * 100 * 100, 0)) final = f'{final_x}_{final_y}' # cls_xy.append([label_name, box_mid_xy,final]) cls_xy.append([box_mid_x,box_mid_y,final]) targets = cls_xy
def main(name): global c,areas # 图片路径 img_path = f'dataSet/train/images/{name}.jpg' # txt文件路径 label_path = f'dataSet/train/labels/{name}.txt' # 读取图片,结果为三维数组 img = cv2.imread(img_path) # 图片宽度(像素) w = img.shape[1] # 图片高度(像素) h = img.shape[0] # 打开文件,编码格式'utf-8','r+'读写 with open(label_path, 'r', encoding='utf-8', errors='ignore') as f: # 循环迭代每行数据 for line in f.readlines(): # 根据空格切割字符串,最后得到的是一个list msg = line.split(" ") x1 = int((float(msg[1]) - float(msg[3]) / 2) * w) # x_center - width/2 y1 = int((float(msg[2]) - float(msg[4]) / 2) * h) # y_center - height/2 x2 = int((float(msg[1]) + float(msg[3]) / 2) * w) # x_center + width/2 y2 = int((float(msg[2]) + float(msg[4]) / 2) * h) # y_center + height/2 # 裁剪 img_roi = img[y1:y2, x1:x2] save_path = f'E:/yolov8/ultralytics-main/dataSet/{c}_.jpg' areas.append([x1,y1,x2,y2,f"{c}_.jpg"]) # print(save_path) # print(x1, ",", y1, ",", x2, ",", y2) cv2.imwrite(save_path, img_roi) c = c + 1 print(f"裁剪结果{areas}")
def add_white_background(image_path, output_path): # 打开图片 img = Image.open(image_path).convert('RGBA') # 获取图片的大小 width, height = img.size # 创建一个新的白色背景图片,大小与原图片相同 white_background = Image.new('RGBA', (width, height), 'white') # 将原图片粘贴到白色背景图片上 white_background.paste(img, (0, 0), img) # 保存新图片 white_background.save(output_path)
def is_target_in_area(target, area): target_x, target_y = target area_x1, area_y1, area_x2, area_y2 = area return area_x1 <= target_x <= area_x2 and area_y1 <= target_y <= area_y2
def md5_encode(input_string): # 创建md5对象 md5 = hashlib.md5() # 使用md5对象的update方法进行加密 md5.update(input_string.encode('utf-8')) # 使用hexdigest()方法获取加密后的字符串 return md5.hexdigest()
忘记说了yolov8的best.pt文件模型是160*160我训练的。但是图片原来大小是300*200获得的坐标你需要进行转化乘个倍数就行了。剩下的我就不说了。
我只说最后的因为和滑块通用相信能看到这里的已经可以解决剩下的了。
var get_challenge = function () { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0; var v = c === 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); }; function getW(lot_number,pow_msg,pow_sign,userresponse) { key = "这里我就不提供了但是很容易找固定写死的" e = { "passtime": 固定, "userresponse": 坐标, "device_id": "", "lot_number": lot_number, "pow_msg": pow_msg, "pow_sign": pow_msg md5, "geetest": 固定, "lang": 固定, "ep": 固定, "biht": 固定, "Yueu": 固定, "em": 固定 } n = _pp() _TT['prototype']['setPublic'](key, '10001') _ = _TT['prototype']['encrypt'](n) e = _ee.stringify(e) w = _ww(_nn.encrypt(e, n)) + _ return w }
最后如果你看到了这里说明你在web逆向方面已经秒杀了80%的人了。不要听别人说人均就人均,点选如果用打码平台确实人均了,但是如果自己全套流程下来对你个人来说绝对是升华的秒杀90%也是有可能的。但是想超越剩下20%还需要走更远的学习更多才可以。有不懂的加我微信a15018601872备注来源后面讲一期瑞数6我就开始学安卓或者鸿蒙了干这行就这样卷的我身心疲惫。
模型我标注了很久本来不想发出来的的但是想了想为了让大家少走弯路节约时间还是发出来吧。
https://pan.baidu.com/s/1logOqF7Myonx7vakgg6F2w 密码1234
如果对你有用可以用支付宝请作者这个卑微的学生仔吃个早餐吗,当然不强求。
1.出于安全考虑,本章未提供完整流程,调试环节省略较多,只提供大致思路,具体细节要你自己还原,相信你也能调试出来。
2.本人写作水平有限,如有讲解不到位或者讲解错误的地方,还请各位大佬在评论区多多指教,共同进步(推荐一个大佬杨如画.多看(他/她)的文章对于我们学习是非常有用的作者也是一个热心的人会解决我们各种疑问)