Jsrpc學習—加密參數Sign變化的網站破解教程
大家好,我是皮皮。前幾天給大家分享jsrpc的介紹篇,Python網絡爬蟲之js逆向之遠程調用(rpc)免去摳代碼補環境簡介,還有實戰篇,Jsrpc學習——網易云熱評加密函數逆向,Jsrpc學習——Cookie變化的網站破解教程感興趣的小伙伴可以戳此文前往。
今天給大家來個jsrpc實戰教程,讓大家加深對jsrpc的理解和認識。
今天我們介紹的這個網站是cookie參數不變,但是加密參數Sign變化的一個網站,一起來使用jsrpc來攻破它吧!
1、這里使用的網站是87aed0b6bc8cb687d63dd7eee0f64d38,MD5加密處理過的。
2、需要提取100個網頁中的數字,然后求和。
3、打開瀏覽器抓包,然后打斷點調試,依次點擊右邊的Call Stack內的東西,直到找到加密函數,里邊的值對應請求參數即可判定。
4、最終在這里找到了一堆人看不懂的東西。
5、仔細尋找,發現加密的函數在這里了。
6、之后可以在控制臺輸入指令window.dcpeng = window.get_sign,其中window.get_sign為加密函數。注意:這個地方挺重要的,很多時候我們會寫成ct.update(),這樣會有問題!加了括號就是賦值結果,沒加就是賦值整個函數!千差萬別。
7、關閉網頁debug模式。注意:這個地方挺重要的,很多時候如果不關閉,ws無法注入!
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工具可以在網絡爬蟲過程中事半功倍,無需仔細的去扣環境,去一步步逆向,只一個黑盒的模式,我們就拿到了想要的結果,屢試不爽。