今日網站:python
aHR0cHM6Ly9zZWFyY2guZG91YmFuLmNvbS9ib29rL3N1YmplY3Rfc2VhcmNoP3NlYXJjaF90ZXh0PSVFNCVCOCU5QyVFOSU4NyU4RSVFNSU5QyVBRCVFNSU5MCVCRSZjYXQ9MTAwMQ==算法
上面就是此次須要分析的網站了,先簡單看看抓包的結果。【圖1-1】ide
圖1-1網站
抓包很清楚沒什麼幺蛾子,此次分析的網站加密的地方實際上是他的搜索結果。this
經過查看網頁源碼能夠看到加密的地方。【圖1-2】編碼
圖1-2加密
這裏的 window._ _DATA 的值就是搜索的結果。prototype
咱們直接搜索這個值就能夠找到解密的地方。【圖1-3】3d
圖1-3調試
這個網站的加密算法不一樣於以前咱們分析的固定算法,咱們先打上斷點看看。
經過調試咱們能夠看到解密的核心算法的位置。【圖2-1】
圖2-1
先看看他解密後的值是什麼樣,確認下沒有找錯位置。【圖2-2】
圖2-2
解密後的明文經過比對就是咱們須要的內容。
接下來就是分析解密算法的部分了。
鹹魚本身動手扣了一下,加密在前半段的地方不難,不過有許多部分須要從新改寫,因此建議你們自學Javascript部分語法,特別是實例化和原型對象的內容以及運算符中的三元表達式。
例如:
三元表達式
// 表達式1 ?表達式2 : 表達式3 var b = 1, c = 1; var a = b == c ? 3:6 console.log(a)
原型對象
function xianyu(){ this.name = 'xianyu', this.age = '18' } xianyu.prototype.hair = function(){ return '茂密' } var xianyu1 = new xianyu() var xianyu2 = new xianyu() console.log(xianyu1.hair) console.log(xianyu2.hair) console.log(xianyu1.hair == xianyu2.hair)
同時須要注意的是這裏的加密代碼都是用n、a、c、S、s這類無語義的代碼替換而成的。且由於許多部分須要從新改寫因此在改寫的時候方法命名必定要用使用規範,不要直接複製。
咱們先看下核心解密的部分代碼
var a = e.from(r, "base64"), s = Math.max(Math.floor((a.length - 2 * i) / 3), 0), u = a.slice(s, s + i); a = e.concat([a.slice(0, s), a.slice(s + i)]); var c = Object(o.hash)(e.concat([u, e.from(t)])); return n((l = {},l[c] = a,l)); var l
前三行的方法沒有什麼難度,到關於c的定義部分的時候,o.hash這個方法裏面有不少三元表達式以及原型對象的使用,須要逐步打斷點的,逐個補齊。(適合新手)
或者直接將原型對象xxx.prototype這種總體摳出來再改寫也是能夠的(適合老手)
可以弄清楚上面的兩塊內容,特別是原型的內容,這個加密就很簡單了。
接下來就是摳出代碼的時候,使用 Python 運行出現編碼報錯的坑。
這個在前人的文章中有提到,鹹魚這裏就直接指出修改的地方,就不贅述了。
subprocess.py 這個 python 文件中 類的初始化位置改下編碼類型爲 utf-8 便可
接下來 po 下運行截圖:
EOF
這裏要感謝 s 哥以前的分析文章,給了我很大幫助。
你們也能夠看看 s 哥的解密,全網第一篇關於XX讀書的解密