Python高級爬蟲開發,高難度JS解密教程,絕地求生模擬登陸!

前言

這篇文章因為涉及到JS解密部分,所以難度比較高,Python基礎比較薄弱的同學可以來看看思路。

開始

進入到該網站後我們可以看到如下界面,今天要做的內容就是模擬登陸

Python高級爬蟲開發,高難度JS解密教程,絕地求生模擬登陸!

那麼咱們首先抓到登陸的包看看:

Python高級爬蟲開發,高難度JS解密教程,絕地求生模擬登陸!

登陸的同時總共發送了兩次post請求,在登陸前發送了一次,其中需要攜帶的參數為用戶名,還有一個donotcache不難猜測出是一個時間戳,但是光靠猜不行,要拿出實際證明。

返回值:

Python高級爬蟲開發,高難度JS解密教程,絕地求生模擬登陸!

success: true

publickey_mod: XXX

publickey_exp: "010001"

timestamp: "540205950000"

token_gid: "1c51cb6b00061f39"

這些值我們並不知道是用來做什麼的,然後我們可以繼續看下登陸的包:

Python高級爬蟲開發,高難度JS解密教程,絕地求生模擬登陸!

很明顯,第一眼就可以發現很多問題,cookie與第一次請求必須保持一致,然後第一次請求的返回值timestamp其實就是為了給第二次登陸的包傳參,rsatimestamp=timestamp,然後就是這個也有一個類似時間戳的東西donotcache,最關鍵的就是這個password是加密的!

咱們先解決donotcache是怎麼產生的:

Python高級爬蟲開發,高難度JS解密教程,絕地求生模擬登陸!

沒猜錯,new Date().getTime()本來就是JS取時間戳的語法,這個咱們用Python編程裡的time模塊模擬就可了。

最關鍵的就是password加密的方式了:

Python高級爬蟲開發,高難度JS解密教程,絕地求生模擬登陸!

這就有意思了

var password = form.elements['password'].value;

password = password.replace(/[^\\\\x00-\\\\x7F]/g, ''); // remove non-standard-ASCII characters

var encryptedPassword = RSA.encrypt(password, pubKey);

密碼經過了兩次改動,第一次是替換掉字符串,第二次是RSA加密,而這個加密需要用的pubKey,而

var pubKey = RSA.getPublicKey(results.publickey_mod, results.publickey_exp);

所以說我們還需要知道publickey_mod和publickey_exp,這個時候你再好好回想一下,咱們的第一次請求是不是返回值里正好有一個Mod和EXP?


分享到:


相關文章: