某紅書旋轉滑塊驗證碼分析與協議算法實現(高通過率)

文章目錄

  • 1. 寫在前面
  • 2. 接口分析
  • 3. 驗證軌跡
  • 4. 算法還原

【🏠作者主頁】:吳秋霖
【💼作者介紹】:擅長爬蟲與JS加密逆向分析!Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并致力于Python與爬蟲領域研究與開發工作!
【🌟作者推薦】:對爬蟲領域以及JS逆向分析感興趣的朋友可以關注《爬蟲JS逆向實戰》《深耕爬蟲領域》
未來作者會持續更新所用到、學到、看到的技術知識!包括但不限于:各類驗證碼突防、爬蟲APP與JS逆向分析、RPA自動化、分布式爬蟲、Python領域等相關文章

作者聲明:文章僅供學習交流與參考!嚴禁用于任何商業與非法用途!否則由此產生的一切后果均與作者無關!如有侵權,請聯系作者本人進行刪除!

1. 寫在前面

??作者在使用紅薯的時候,經常會選擇通過手機驗證的方式去登錄。但是,天公不作美!我甚至有時候第一次登錄,就給我彈出一個驗證碼…有風控固然是好的,但是略微的影響到了用戶的交互體驗,一般用戶只能選擇是手動拖動滑塊進行驗證…

在這里插入圖片描述

但是!作為一名科技行業的程序員。肯定是不會屈服的,于是帶著對技術的好奇心在想過這個旋轉的驗證碼,是否可以自動化呢?當然自動化沒有挑戰!作者選擇通過協議+算法的方式去通過這個驗證碼~

2. 接口分析

這里我們淺拉一下旋轉的滑塊,然后監測register這個接口的發包,如下所示:

在這里插入圖片描述

這幾個參數中verifyUuid是重要的,它在每一次生成彈出驗證碼的時候,給出的一個新且唯一的驗證ID,在后續的驗證接口同樣需要攜帶!獲取方式如下所示:

在這里插入圖片描述

在輸入手機號點擊發送短信驗證碼的時候,假設失敗被風控了。短信接口會正常給到你成功的響應,如下所示:

{"code":0,"success":true,"msg":"成功","data":{}}

但是如果你光通過接口去檢驗,是不知道出驗證的。得看請求狀態,失敗出現驗證碼則是471,這個時候再去頭部分析,拿到驗證碼的UID

通過register的接口,獲取到驗證碼提交所需要的ridcaptchaInfo字段信息

請求同樣是需要頭部帶X-s、X-s-common參數的

第二個我們需要分析的接口則是check,這個是提交驗證檢測的。如下所示:

在這里插入圖片描述

可以看到提交的參數中captchaInfo是最重要的,通過字段信息能夠看到提交的鼠標軌跡相關的一些東西,而且看這樣子應該還是加密的!另外的rid、uid在前面環節都能夠獲取到,checkCount參數則是驗證次數,通不過就會自增

3. 驗證軌跡

接下來如果沒有解決頭部X系列的兩個參數加密,建議先去研究這個兩個參數,再來研究滑塊!當然如果你不知道怎么還原可以去看作者以前的文章!現在開始還原captchaInfo這個參數

JS調試發現軌跡驗證參數的值采用了DES加密,可以拿瀏覽器內的加密軌跡來解密看看,如下所示:

在這里插入圖片描述

軌跡分析后開始實現算法,如下所示:

function generate_Track(slideDistance) {var trackList = [];var x = 0;while (x < slideDistance) {x += 2;var y = -(Math.floor(x / 10));var z = 2 * (x - 1) + Math.floor(Math.random() * 7) + 1;trackList.push([x, y, z]);}return JSON.stringify(trackList);
}
function get_mousetrack(distance,time){var mousetrack1=get_trace(distance,time);var mousetrack2=generate_Track(distance);return DES_Encrypt(mousetrack2,"PYrm8rMk")
}
function get_trace(distance,time) {distance = Math.floor(distance);var trace = [];var sy = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0];var st = [15, 16, 17, 18, 15, 16, 17, 18, 15, 16, 17, 18, 15, 16, 17, 18, 15, 16, 17, 18, 15, 16, 17, 18, 15, 16, 17,18, 15, 16, 17, 18, 15, 16, 17, 18, 15, 16, 17, 18, 14, 16, 17, 18, 16, 17, 18, 19, 20, 17];if (distance < 95) {var sx = [1, 2, 1, 2, 1, 2, 1, 1, 2, 1];}else{var sx = [1, 2, 1, 2, 1, 2, 2, 2, 3, 4];}var zt = RandomNum(10, 100);var zx = 0,zy = 0;var random_x = RandomNum(9, 14);var n = 0, x = 0, y = 0, t = 0;while (true){n += 1;if (n < 5){x = 1;}else{x = RandomChoice(sx)}if (distance > 125 && random_x === n){x = RandomNum(14, 18)}y = RandomChoice(sy);t = RandomChoice(st);zx += x;zy += y;zt += t;trace.push([zx, zy, zt]);if (distance - zx < 6){break;}}var value = distance - zx;for (var i = 0; i < value; i++){t = RandomChoice(st);if (value === i + 1){t = RandomNum(42, 56)}if (value === i + 2){t = RandomNum(32, 38)}if (value === i + 3){t = RandomNum(30, 36)}x = 1;zx += x;zt += t;trace.push([zx, zy, zt]);}let csz=RandomNum(1, 10)let elementToInsert0 = [0, 0, csz];let elementToInsert1 = [0, 0, csz+2];trace.unshift(elementToInsert1);trace.unshift(elementToInsert0);return JSON.stringify(trace);
}

4. 算法還原

首先需要封裝register接口的協議請求,核心請求提交封參如下所示:

json_data = {"secretId": "000","verifyType": "102","verifyUuid": v_id,"verifyBiz": "471","sourceSite": "","captchaVersion": "1.1.0"
}
jmurl='url=/api/redcaptcha/v2/captcha/register'+json.dumps(json_data).replace(" ","")a1=ck['a1']
xts = self.ctx.call('get_x_s',jmurl,a1)
xtscommon = self.ctx.call('get_x_s_common',xts,a1)
self.headers['x-s'] = xts['X-s']
self.headers['x-s-common']=xtscommon
self.headers['x-t']=str(xts['X-t'])data=json.dumps(json_data,separators=(',',':'))
response = requests.post(url, headers=self.headers, cookies=ck, data=data)

check驗證接口的提交核心封參請求如下所示:

chainfo={"mouseEnd":self.ctx.call('DES_Encrypt',mouseend,"WquqhEkd"),"time":self.ctx.call('DES_Encrypt',time,"vPMvCY4K"),"track":self.ctx.call('get_mousetrack',mouseend,time),"width":self.ctx.call('DES_Encrypt',width,"WquqhEkd")}json_data={"rid":rid,"verifyType":"102","verifyBiz":"471","verifyUuid":v_id,"sourceSite":"","captchaVersion":"1.1.0","checkCount":str(check_count),"captchaInfo":json.dumps(chainfo)}

當然,請求完成后的過程中我們還需要對旋轉圖片角度的分析與圖像處理(包括裁剪)!主要就是通過對兩個圖像進行分析處理來找出最佳的角度。使得合并后的圖像在梯度上的差異最小,這里我們采用了CV2,通過核心Py。源碼如下所示:

def perform_angle_analysis(self,query_image_path, background_image_path):def calculate_gradient_difference(image, cx, cy, circle_radius):circle_inner_mask = np.zeros_like(image, dtype=np.uint8)cv2.circle(circle_inner_mask, (cx, cy), circle_radius, 255, -1)circle_outer_mask = np.zeros_like(image, dtype=np.uint8)cv2.circle(circle_outer_mask, (cx, cy), circle_radius + 30, 255, -1)inner_pixels = cv2.bitwise_and(image, circle_inner_mask)outer_pixels = cv2.bitwise_and(image, circle_outer_mask)inner_sobel_x = cv2.Sobel(inner_pixels, cv2.CV_64F, 1, 0)inner_sobel_y = cv2.Sobel(inner_pixels, cv2.CV_64F, 0, 1)inner_gradient_magnitude = cv2.magnitude(inner_sobel_x, inner_sobel_y)outer_sobel_x = cv2.Sobel(outer_pixels, cv2.CV_64F, 1, 0)outer_sobel_y = cv2.Sobel(outer_pixels, cv2.CV_64F, 0, 1)outer_gradient_magnitude = cv2.magnitude(outer_sobel_x, outer_sobel_y)gradient_diff = np.sum(outer_gradient_magnitude) - np.sum(inner_gradient_magnitude)return gradient_diffdef merge_images(query_result, bg_image, radius, angle):query_height, query_width = query_result.shape[:2]rotation_matrix = cv2.getRotationMatrix2D((query_width / 2, query_height / 2), angle, 1)rotated_result = cv2.warpAffine(query_result, rotation_matrix, (query_width, query_height))center = (bg_image.shape[1] // 2, bg_image.shape[0] // 2)cv2.circle(bg_image, center, radius, (0, 0, 0), -1)bg_height, bg_width = bg_image.shape[:2]circle_height, circle_width = rotated_result.shape[:2]x = (bg_width - circle_width) // 2y = (bg_height - circle_height) // 2overlay = np.zeros_like(bg_image)overlay[y:y + circle_height, x:x + circle_width] = rotated_resultresult = cv2.bitwise_or(bg_image, overlay)return resultdef split_circular_region(image, radius):height, width, _ = image.shapecenter = (width // 2, height // 2)mask = np.zeros_like(image)cv2.circle(mask, center, radius, (255, 255, 255), -1)result = cv2.bitwise_and(image, mask)return resultdef enlarge_image(image, scale_factor):circle_height, circle_width = image.shape[:2]new_height = int(circle_height * scale_factor)new_width = int(circle_width * scale_factor)result = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_LINEAR)return resultquery_image = cv2.imread(query_image_path)bg_image = cv2.imread(background_image_path)query_result = split_circular_region(query_image, 89)query_result = enlarge_image(query_result, 1.1)min_difference = float('inf')min_angle = 0for angle in range(0, 360, 5):result = merge_images(query_result, bg_image, 89, angle)gradient_difference = calculate_gradient_difference(result, bg_image.shape[1] // 2, bg_image.shape[0] // 2, 70)if gradient_difference < min_difference:min_difference = gradient_differencemin_angle = angleresult = merge_images(query_result, bg_image, 89, min_angle)cv2.imwrite('./jpg/result.png', result)return min_angle

在這里插入圖片描述

最后完成所有的編碼后,把滑塊驗證部署成一個API服務,這樣的話更加方便調用,如下:

在這里插入圖片描述

本地直接通過檢測471驗證碼,拿到uid、cookie調用純協議滑塊驗證服務,效果如下:

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21513.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21513.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21513.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

力扣SQL50 學生們參加各科測試的次數 查詢 三表查詢

Problem: 1280. 學生們參加各科測試的次數 &#x1f468;?&#x1f3eb; 參考題解 join等價于inner join&#xff0c;不用關聯條件的join等價于cross join Code select stu.student_id,stu.student_name, sub.subject_name,count(e.subject_name) attended_exams from Stud…

關于windosw打開安全中心空白的解決方案

關于windosw打開安全中心空白的解決方案 問題如下 問題如下 之后點擊一片空白 解決方案如下 按下WINR&#xff0c;輸入regedit回車找到路徑&#xff1a;“HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SecurityHealthService”&#xff0c;然后雙擊右邊的“start”…

【最新鴻蒙應用開發】——關系型數據庫簡單上手(RDB)

關系型數據庫&#xff08;RDB&#xff09; 關系型數據庫&#xff08;Relational Database&#xff0c;RDB&#xff09;是一種基于關系模型來管理數據的數據庫。關系型數據庫基于SQLite組件提供了一套完整的對本地數據庫進行管理的機制&#xff0c;對外提供了一系列的增、刪、改…

【cocos sreator】判定多邊形和多邊形相交

核心代碼&#xff1a; cc.Intersection.polygonPolygon(points2, points) 拖拽物品拖到多個目標位置判定&#xff0c;取最近的&#xff1a; getTargetItem(collider2: cc.PolygonCollider, touchPos: cc.Vec2, targetRoot: cc.Node) {let length 99999;let target null;//col…

windows 下編譯 TessRact+leptonica 識別圖片文字

目錄 1、下載 2. 編譯基礎依賴庫 1.1 zlib 1.2 jpegsr9f 1.3 lpng1643 1.4 libgif 3. 編譯tifflib 4. 配置nasm到系統環境中 5. 編譯 libjpeg-turbo 6 編譯leptonica 7. 編譯tesseract 8. 測試驗證 1、下載 下載tesseract5.3.2 下載leptonica1.83.1 下載l…

1638. 統計只差一個字符的子串數目

題目 給你兩個字符串 s 和 t&#xff0c;請找出 s 中的非空子串的數目&#xff0c;這些子串滿足替換一個不同字符以后&#xff0c;是 t 串的子串。換言之&#xff0c;請你找到 s 和 t 串中恰好只有一個字符不同的子字符串對的數目。 一個子字符串是一個字符串中連續的字符。 …

【全開源】旅游門票預訂系統(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp開發的旅游門票預訂系統&#xff0c;支持景點門票、導游產品便捷預訂、美食打卡、景點分享、旅游筆記分享等綜合系統&#xff0c;提供前后臺無加密源碼&#xff0c;支持私有化部署。 ?便捷你的每一次出行&#x1f30d; &#x1f31f; 輕松預訂…

PMP中的各種圖

單、雙代號網絡圖 區別 內容 箭線圖&#xff08;ADM&#xff09;-雙 箭線活動 節點依賴關系 箭線圖只能表示一種FS的關系 規劃和控制項目活動進度的項目 &#xff08;建筑、軟件&#xff09; 前導圖&#xff08;PDM&#xff09;-單 節點代表活動 前導圖法可以體現多種邏…

語義化版本控制:軟件工程的實用之道

語義化版本控制&#xff1a;軟件工程的實用之道 在軟件開發過程中&#xff0c;版本控制是確保項目穩定、有序進行的關鍵環節。隨著項目的發展&#xff0c;功能的增加、錯誤的修復以及API的修改變得日益頻繁。為了有效管理這些變化&#xff0c;并確保團隊成員、用戶以及依賴該軟…

Python中的上下文管理:深入探索contextlib模塊

Python中的上下文管理&#xff1a;深入探索contextlib模塊 在Python編程中&#xff0c;上下文管理器扮演著至關重要的角色&#xff0c;它們允許我們以一種非常優雅和高效的方式來管理資源&#xff0c;如文件操作、鎖的獲取與釋放等。contextlib模塊是Python標準庫中的一個模塊…

骨傳導藍牙耳機買哪款好?年度精選五款骨傳導藍牙耳機推薦

作為音樂愛好者的我&#xff0c;也一直在尋找一款好的骨傳導耳機&#xff0c;聽音樂對我來說不僅僅是一種消遣方式&#xff0c;更多是一種對生活、工作上壓力和困難的舒緩&#xff0c;所以今天給大家推薦幾款骨傳導耳機。今天推薦這幾款骨傳導耳機都是比較有性價比&#xff0c;…

計算機網絡學習實踐:模擬RIP動態路由

計算機網絡學習實踐&#xff1a;模擬RIP動態路由 模擬動態路由RIP協議 1.實驗準備 實驗環境&#xff1a;華為模擬器ENSP 實驗設備&#xff1a; 3個路由器&#xff0c;3個二層交換機&#xff08;不是三層的&#xff09;&#xff0c;3個PC機 5個網段 192.168.1.0 255.255.…

【Linux】文件IO基礎

man手冊 通過man手冊可以獲取詳細的Linux操作命令共有8章&#xff0c;查詢使用man ls即可查詢ls的相應命令&#xff0c;也可以使用相應的章節man 2 open查詢第二章的open如何使用。 常用文件IO函數 功能函數描述實例打開文件int open(const char *pathname, int flags);打開…

21data 數據可視化 代碼合集

<!-- <!DOCTYPE html> <html> <head><title>視覺映射和圖例</title><meta charset"utf-8"><script src"echarts.js"></script> </head> <body> <div style"width: 600px;height:4…

電腦視頻錄制工具,推薦3款,讓你的作品更專業!

隨著信息技術的飛速發展&#xff0c;電腦視頻錄制工具在日常工作和娛樂中扮演著越來越重要的角色。它們不僅能幫助我們記錄電腦屏幕上的精彩瞬間&#xff0c;還能為教學、演示、游戲直播等多種場景提供便利。本文將詳細介紹三款電腦視頻錄制工具&#xff0c;并分步驟闡述它們的…

【TB作品】msp430f5529單片機,dht22,煙霧傳感器

功能 //硬件&#xff1a;msp430f5529、dht22、LCD1602、蜂鳴器、煙霧傳感器、藍牙模塊。 //功能&#xff1a;讀取溫濕度、煙霧濃度顯示到屏幕&#xff1b; //按鍵調節三個報警數值&#xff1b; //溫度、濕度、煙霧濃度&#xff0c;任意一個大于報警數值就蜂鳴器報警&#xff1…

如何編輯pdf文件內容?編輯技巧大揭秘,秒變辦公達人!

如何編輯pdf文件內容&#xff1f;在數字化辦公日益普及的今天&#xff0c;PDF文件因其跨平臺、格式穩定的特點&#xff0c;成為我們日常工作和學習中不可或缺的一部分。然而&#xff0c;PDF文件的編輯卻常常令人頭疼&#xff0c;許多人面對需要修改內容的PDF文件時感到無從下手…

【RPG Maker MV 仿新仙劍 戰斗場景UI (九)】

RPG Maker MV 仿新仙劍 戰斗場景UI 九 前言角色戰斗精靈精靈圖設置攻擊 戰斗背景圖 前言 前段天研究并完成了主角人物行走圖部分的開發&#xff0c;完成了對應的8方向行走&#xff0c;及精靈的展示。現在開始重新回到戰斗場景的開發中&#xff0c;回顧下&#xff0c;已完成功能…

如何手動批準內核擴展 Tuxera NTFS for mac內核擴展需要批準 內核擴展怎么打開

在了解如何手動批準內核擴展之前&#xff0c;我們應該先了解什么叫做內核擴展。內核擴展又被稱為KEXT&#xff0c;通過它可以實現macOS系統與軟件組件之間的交互&#xff0c;例如磁盤管理、任務管理和內存管理等等。 kext 是內核擴展&#xff08;Kernel Extension&#xff09;…

【漏洞復現】海康威視綜合安防管理平臺 orgManage/v1/orgs/download 任意文件讀取漏洞復現

0x01 產品簡介 海康威視綜合安防管理平臺是一套“集成化”、“智能化”的平臺,通過接入視頻監控、一卡通、停車場、報警檢測等系統的設備。海康威視集成化綜合管理軟件平臺,可以對接入的視頻監控點集中管理,實現統一部署、統一配置、統一管理和統一調度。 0x02 漏洞概述 海康…