js加密的資料python解密
阿新 • • 發佈:2020-09-20
寫在前面
現在前端頁面為了防止爬蟲惡意爬取資料,多多少少會對資料進行加密,有的是重新編碼再解碼,有的是用字型來表示純文字,還有用圖片的。如果直接爬取,由於沒有js動態載入,因此都是原始的加密後的資料,需要通過一定手段還原為可讀資料。正所謂只有魔法才能打敗魔法,也只有程式碼才能打敗程式碼。還是一句話,只要是前端js加密的內容,理論上都是可以通過js來反向還原資料的,只不過大多數js都經過混淆,可讀性差,需要不斷打斷點除錯,確定核心的解密函式。今天遇到一個BT網站,本來想直接爬取的,結果發現名稱都是被加密過的,檢視原始碼後,發現加密過程簡單,非常適合入門。
解密過程分析
網頁顯示的是一行行的標題內容,是通過ul li
<li>[03-07] <a href="/movie.php?id=9523175675421954" target='_blank'> <script type="text/javascript"> document.write(d('OTHlkYblk6Xns7vliJcwMTYt6YWS5bqX5YG35oOFNFPlupfnvo7lpbPplIDllK7pq5jmuIXml6DmsLTljbDlrozmlbTniYg=')); </script> </a> </li>
既然是前端解密,那麼就好辦了,找到d
函式就可以了,這裡使用使用Chrome的F12功能,打斷點找到函式呼叫過程即可,找到的d
函式是孤立的,沒有與其他函式巢狀,所以單獨分析d
函式即可。
function d(input){
rv = window.atob(input);
rv = escape(rv);
rv = decodeURIComponent(rv);
return rv;
}
雖然d
函式中有三個其它函式,但都是js自帶的函式,也就是說只要查閱這三個函式的功能即可。
window.atob
是用於將編碼後的Base64字串轉為ASCII字串。效果如下:
var str = 'javascript';
window.btoa(str) // 編碼結果 "amF2YXNjcmlwdA=="
window.atob("amF2YXNjcmlwdA==") // 解碼結果 "javascript"
escape
函式可對字串進行編碼,這樣就可以在所有的計算機上讀取該字串。該方法不會對 ASCII 字母和數字進行編碼,也不會對下面這些 ASCII 標點符號進行編碼: * @ - _ + . / 。其他所有的字元都會被轉義序列替換。
escape("JavaScript_ _指令碼語言@!");
"JavaScript_%20_%u811A%u672C%u8BED%u8A00@%21"
decodeURIComponent
函式可對encodeURIComponent
函式編碼後的 URI 進行解碼。
我們嘗試將資料解碼後看一下,可以得到如下結果:
// 再也不用擔心被顯示敏感詞了。
d("OTHlkYblk6Xns7vliJcwMTYt6YWS5bqX5YG35oOFNFPlupfnvo7lpbPplIDllK7pq5jmuIXml6DmsLTljbDlrozmlbTniYg=")
"91呆哥系列016-酒店偷情4S店美女銷售高清無水印完整版"
在弄懂了d
函式的實現過程後,還可以寫出其逆過程
function r(input){
res = encodeURIComponent(input);
res = unescape(res);
res = window.btoa(res);
return res;
}
Python實現
import base64
base64.b64decode(input).decode()
from urllib.request import unquote
unquote(base64.b64decode(input).decode()) // 其實不要這步已經可以得到結果了。