Jsrpc學習——加密引數Sign變化的網站破解教程
大家好,我是皮皮。前幾天給大家分享jsrpc的介紹篇,Python網路爬蟲之js逆向之遠端呼叫(rpc)免去摳程式碼補環境簡介,還有實戰篇,Jsrpc學習——網易雲熱評加密函式逆向,Jsrpc學習——Cookie變化的網站破解教程感興趣的小夥伴可以戳此文前往。
今天給大家來個jsrpc實戰教程,讓大家加深對jsrpc的理解和認識。下面是具體操作過程,不懂的小夥伴可以私我。
今天我們介紹的這個網站是cookie引數不變,但是加密引數Sign變化的一個網站,一起來使用jsrpc來攻破它吧!
1、這裡使用的網站是87aed0b6bc8cb687d63dd7eee0f64d38,MD5加密處理過的。
2、需要提取100個網頁中的數字,然後求和。
3、開啟瀏覽器抓包,然後打斷點除錯,依次點選右邊的Call Stack內的東西,直到找到加密函式,裡邊的值對應請求引數即可判定。
[圖片上傳失敗...(image-b0f02b-1648287067493)]
4、最終在這裡找到了一堆人看不懂的東西。
5、仔細尋找,發現加密的函式在這裡了。
6、之後可以在控制檯輸入指令window.dcpeng = window.get_sign,其中window.get_sign為加密函式。注意:這個地方挺重要的,很多時候我們會寫成ct.update(),這樣會有問題!加了括號就是賦值結果,沒加就是賦值整個函式!千差萬別。
7、關閉網頁debug模式。注意
8、此時在本地雙擊編譯好的檔案win64-localhost.exe,啟動服務。
9、之後在控制檯注入ws,即將JsEnv.js檔案中的內容全部複製貼上到控制檯即可(注意有時要放開斷點)。
10、連線通訊,在控制檯輸入命令var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=para&name=test");
11、隨後繼續輸入命令:
// 註冊一個方法 第一個引數get_v為方法名, // 第二個引數為函式,resolve裡面的值是想要的值(傳送到伺服器的) // param是可傳參引數,可以忽略 demo.regAction("get_para", function (resolve) { dcpeng(); var res = window.sign resolve(res); })
也許有小夥伴會覺得奇怪,window.sign明明是在list這個變數中,為啥我們通過window.get_sign()可以獲取到,莫非window.get_sign()和window.sign返回的值是一樣的?其實window是整個全域性,它只是聲名一個list物件裡面有signature等於全域性的sign,這個全域性的sign的值通過window.get_sing()得到。
dcpeng()就是一個函式,裡面寫的最後結果就是window.sign=window.get_sign(),並沒有return東西。
12、之後就可以在瀏覽器中訪問資料了,開啟網址 http://127.0.0.1:12080/go?group={}&name={}&action={}¶m={} ,這是呼叫的介面 group和name填寫上面注入時候的,action是註冊的方法名,param是可選的引數,這裡續用上面的例子,網頁就是:http://127.0.0.1:12080/go?group=para&name=test&action=get_para
13、如上圖所示,我們看到了那個變化的引數v的值,直接通過requests庫可以發起get請求。
14、現在我們就可以模擬資料,進行請求傳送了。
15、將拷貝的內容可以丟到這裡進行貼上:http://tool.yuanrenxue.com/curl
16、之後將右側的程式碼複製到Pycharm中即可用,非常便利。
17、之後就可以構造請求了,加一個整體迴圈,然後即可獲取翻頁的內容,整體程式碼如下所示。
import requests
import json
cookies = {
'session': '6c78df1c-37aa-4574-bb50-99784ffb3697.Qcl0XN6livMeZ-7tbiNe-Ogn8L4',
'v': 'A7s8gqX6XgjWtmKFwCNKPNdQSpQgEM9-ySWTzq14lzDRLtVKNeBfYtn0IxW-',
}
headers = {
'Connection': 'keep-alive',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 Edg/97.0.1072.69',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Origin': 'http://spider.wangluozhe.com',
'Referer': 'http://spider.wangluozhe.com/challenge/2',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
}
all_data = []
for page_num in range(1, 101):
sign_url = 'http://127.0.0.1:12080/go?group=para&name=test&action=get_para'
sign = requests.get(url=sign_url).json()["get_para"]
# print(sign)
data = {
'page': f'{page_num}',
'count': '10',
'_signature': sign
}
print(f'Crawlering page {page_num}')
response = requests.post('87aed0b6bc8cb687d63dd7eee0f64d38', headers=headers, cookies=cookies, data=data, verify=False).json()
for item in response["data"]:
all_data.append(item["value"])
# print(item["value"])
print(sum(all_data))
執行結果如上圖所示,和網頁上呈現的資料一模一樣。
18、至此,請求就已經完美的完成了,如果想獲取全部網頁,構造一個range迴圈翻頁即可實現。
17、也歡迎大家挑戰該題目,我已經挑戰成功了,等你來戰!
總結
大家好,我是皮皮。這篇文章主要給大家介紹了jsrpc的實戰教程,使用jsrpc工具可以在網路爬蟲過程中事半功倍,無需仔細的去釦環境,去一步步逆向,只一個黑盒的模式,我們就拿到了想要的結果,屢試不爽。
初次接觸jsrpc的小夥伴可能看不懂,這裡還有黑哥錄製的一個視訊,大家可以對照著視訊進行學習,地址:https://www.bilibili.com/video/BV1EQ4y1z7GS,黑哥全程無聲演示,視訊的BGM很大,建議大家可以靜音播放,領會其中奧義。
關於jsrpc工具,可以點選原文前往獲取。
小夥伴們,快快用實踐一下吧!如果在學習過程中,有遇到任何問題,歡迎加我好友,我拉你進Python學習交流群共同探討學習。