極驗滑塊,點選分析

kuangqilin發表於2024-08-03


宣告(微信a15018601872,QQ.2766958292)
本文章中所有內容僅供學習交流使用,不用於其他任何目的,不提供完整程式碼,抓包內容、敏感網址、資料介面等均已做脫敏處理,嚴禁用於商業用途和非法用途,否則由此產生的一切後果均與作者無關!
本文章未經許可禁止轉載,禁止任何修改後二次傳播,擅自使用本文講解的技術而導致的任何意外,作者均不負責,若有侵權,請聯絡作者立即刪除!
前言
歷經5個月把web逆向給學完了,最後決定進行一個最後解決完成這一段學習過程。選擇極驗是因為他適合新手具有代表性,同時因為點選前期準備工作需要浪費太多時間設計了太多知識點完成一個點選專案我從0開始學用了小20天今天就來分享一下滑塊,和點選解決思路。

1.1.python程式碼思路
首先是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了。

1.2.js程式碼思路
把gcaptcha4.js檔案複製到本地,用jsdom補環境就可以了。

const jsdom = require('jsdom');
const {JSDOM} = jsdom;
const dom = new JSDOM(<!DOCTYPE html><p>Hello world</p>, {
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
}
1.3.結果

2.點選
2.1.大致思路流程
點選就比較麻煩了需要用yolov訓練,然後孿生訓練,最後還有一堆邏輯要寫,重複工作也多建議時間不充裕的可以放一放學安卓或者資料處理先後面再回來學,也可以直接用打碼平臺我是推薦打碼但是錢包不允許我這麼做😄。我後面會把yolov8訓練的best.pt放在百度放盤大家可以拿來用,但是孿生的就算了。因為用的cpu訓練加上只訓練了64次導致最後成功率只有50%。best.pt還可以300張圖片擷取了896張小圖還有幾個沒訓練出來不過夠用了後期你可以接著用我best.pt接著訓練效果還是可以的我標註的挺認真的。

2.2.python程式碼思路
2.2.1.獲取座標程式碼
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
2.2.2.剪裁程式碼
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}")

2.2.3.孿生背景圖變白色
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)
2.2.4.進行匹配剪裁框和座標框哪一個是一對和md5加密封裝
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()
2.2.5.注意事項
忘記說了yolov8的best.pt檔案模型是160160我訓練的。但是圖片原來大小是300200獲得的座標你需要進行轉化乘個倍數就行了。剩下的我就不說了。

2.3.js程式碼思路
我只說最後的因為和滑塊通用相信能看到這裡的已經可以解決剩下的了。

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'
_ = _TT['prototype']'encrypt'
e = _ee.stringify(e)
w = _ww(_nn.encrypt(e, n)) + _
return w
}
2.4.結果

3.總結
最後如果你看到了這裡說明你在web逆向方面已經秒殺了80%的人了。不要聽別人說人均就人均,點選如果用打碼平臺確實人均了,但是如果自己全套流程下來對你個人來說絕對是昇華的秒殺90%也是有可能的。但是想超越剩下20%還需要走更遠的🦌學習更多才可以。有不懂的加我微信a15018601872備註來源後面講一期瑞數6我就開始學安卓或者鴻蒙了幹這行就這樣卷的我身心疲憊😔。

4.百度網盤分享
模型我標註了很久本來不想發出來的的但是想了想為了讓大家少走彎路節約時間還是發出來吧。

https://pan.baidu.com/s/1logOqF7Myonx7vakgg6F2w 密碼1234

如果對你有用可以用支付寶請作者這個卑微的學生仔吃個早餐嗎,當然不強求。

5.最後
1.出於安全考慮,本章未提供完整流程,除錯環節省略較多,只提供大致思路,具體細節要你自己還原,相信你也能除錯出來。

2.本人寫作水平有限,如有講解不到位或者講解錯誤的地方,還請各位大佬在評論區多多指教,共同進步(推薦一個大佬楊如畫.多看(他/她)的文章對於我們學習是非常有用的作者也是一個熱心的人會解決我們各種疑問)

!!!!最後如果侵犯到你的合法權益聯絡我刪除文章。

相關文章