1. 程式人生 > >使用python破解簡單的JavaScript加密的網站

使用python破解簡單的JavaScript加密的網站

目標網站:http://ac.scmor.com/
抓取內容:
主要是抓取網站中的連結地址
第一步 分析這個網站使用什麼請求載入的,get,post,或者ajax非同步載入?大家都知道用fiddler抓包或者F12網頁進行檢視。在這裡筆者就截圖分享了。

第二步 檢視自己所需要的內容進行審查,這裡給大家推薦火狐瀏覽器,看如下圖:
這裡寫圖片描述

從上圖可以看出從上圖可以看出href=”javascript:;” 直接請求獲取href是不可獲取的,而從中也看到這裡使用了函式visit這個函式,那麼現在要做的事情是如何找到這個函式,因為沒有在本網頁中,所以我們需要做的是從其他請求中尋找這個函式的由來。推薦fiddler抓包工具,當然這裡有一個坑需要大家注意下:因為你第一次已經開啟這個網站了,如果你僅僅是重新整理網頁的話用fiddler直接抓包的話js檔案是不會再載入的所以建議清除快取和cookies,(這裡是筆者已經知道函式是放在js檔案中的。)

這裡寫圖片描述
可以看出visit在 http://ac.scmor.com/res/run.js?v=20180402 這個js檔案中,那麼取出這個js檔案中的內容,有很多的js會存在混亂js檔案,這裡筆者推薦大家一個js反混餚的網站也可以對js檔案進行格式化:http://www.bm8.com.cn/jsConfusion/。既然js檔案已經找到那麼進行分析js函式大家請看visit函式:

function visit(url) {
    var newTab = window.open('about:blank');
    if (Gword != '') url = strdecode(url);
    // var newTab = window.open(url);   
newTab.location.href = url; //newTab.location.reload(true); }

從函式中可以看出,這裡首先判斷 if (Gword != ”)即不為空的時候,url = strdecode(url);所以繼續找這個函式:

function strdecode(string) {
    string = base64decode(string);
    key = Gword + 'ok';
    len = key.length;
    code = '';
    for (i = 0; i < string.length
; i++) { var k = i % len; code += String.fromCharCode(string.charCodeAt(i) ^ key.charCodeAt(k)) } return base64decode(code) }

由程式碼可知傳過來的路徑首先進行base64decode進行解密。當然這裡邊存在一個沒有宣告的值“Gword”,這裡需要把這個“Gword”找到,從頁面中我們可以發現
這裡寫圖片描述
這裡筆者採用的方法是:

function strdecode(string) {
    var Gword="[email protected]"  # 直接新增上去放在js檔案中。
    string = base64decode(string);
    key = Gword + 'ok';
    len = key.length;
    code = '';
    for (i = 0; i < string.length; i++) {
        var k = i % len;
        code += String.fromCharCode(string.charCodeAt(i) ^ key.charCodeAt(k))
    }
    return base64decode(code)
}

一系列的邏輯筆者在此就不講了,因為js程式碼不是特別會,正在學習中,所以筆者在這主要是給大家推薦一個工具PyV8,具體安裝本章就不介紹了,等下篇文章主要介紹一下,這裡講解一下如何使用execjs,破解這個網站。我們把js反混餚的js儲存在一個js檔案中。
import execjs
print(execjs.get().name) # 檢視安裝的結果
這裡寫圖片描述

file = ‘./encrypt.js’
ctx = node.compile(open(file).read())
我們知道需要傳入加密的’DSE8WyM3DBsjQX8WNl8aWDoFLRE8BxIHOSxSTw==
“visit(‘DSE8WyM3DBsjQX8WNl8aWDoFLRE8BxIHOSxSTw==’),所以使用requests包直接進行獲取頁面,然後進行獲取這些加密過得內容,這裡筆者分享一下自己所寫的程式碼:

# coding=utf-8
import requests
import execjs
import re

# https://www.aqistudy.cn/html/city_detail.html
node = execjs.get()
# print(execjs.get().name)
source_url = 'http://ac.scmor.com/'
source_headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
}
source_res = requests.get(url=source_url, headers=source_headers)
re_source = re.findall(r'var Gword="[email protected]";(.*);autotag\[1]',source_res.text)
re_source = re_source[0]
file = './encrypt.js'
ctx = node.compile(open(file).read())
re_source = re_source.split(';')
for each_source in re_source:
    each_source = re.findall(r'autourl\[\d+\] = "(.*)"',each_source)
    each_infos = each_source[0]
    md_js = 'strdecode("%s")' % each_infos #破解中的函式,
    href = ctx.eval(md_js)

最終所拿到的結果展示如下圖:
這裡寫圖片描述
ok,本文到這已經很好得解決了這個加密當然你也可以用python程式碼來實現js加密的整個過程。以下為作者的簡單分享解析js程式碼的過程如下:

function strdecode(string) {
    string = base64decode(string);      
    key = ‘[email protected]@scmor.com’;
    len = key.length;                    // 郵箱的長度
    code = '';
    for (i = 0; i < string.length; i++)  // 迴圈string長度
        var k = i % len; //k = i 餘 len
        var n = string.charCodeAt(i) ^ key.charCodeAt(k);//string[i]的ascii數字 ^ key[k]的ascii數字
        code += String.fromCharCode()//轉化為字串
    }
    return base64decode(code)//最後將code進行base64解碼,即為最終的結果

分析過後用python來實現的程式碼即為:

def decode(string):
    result = base64.b64decode(string)
    key = "[email protected]"
    keyLen =  len(key)
    code = ''
    for i in range(len(result)):
        k = i % keyLen
        n = ord(result[i]) ^ ord(key[k])
        code += chr(n)
    return base64.b64decode(code)

if __name__ == '__main__':
    print decode('DycgVRMoFjY/UAlcFldWBzRcCwcpHiYVIhpbUA==')

以上為整個過程的分享,當然筆者的能力有限,分享的解決過程可能不是最好的,歡迎糾正。
本稿原創,任何轉載需要表明作者和來源,違者必究。