開篇閑聊
最近也是看完了崔慶才爬蟲52講里面JavaScript逆向部分,里面介紹了從簡單到復雜整個JavaScript逆向的方法,里面也有一些實戰案例(可以練習的),跟著視頻練習之后,雖然也成功了,但是跟著一步一步的分析,總是不知道自己哪里懂了,哪里不懂,就想著自己找個網站實戰練習一下,偶然的機會跟學姐閑聊的時候學姐給我發了一個網站,讓我練一下手,就有了下面的分析,因為是初次自己獨立的進行JavaScript實戰,難免會出現一些問題,期間也少不了大佬的幫助,
廢話不多說了,請出我們今天的主角:藝恩-中國電影票房資料
網站分析
抓包
首先我們先看一下document里面有沒有資料

通過預覽我們發現資料并沒有在document里面,我們猜測資料可能是通過Ajax加載出來的,點到XHR選項,果然抓到了一個名為GetData的檔案,

這個應該就是我們要的資料檔案了,之后點開,發現是post請求,并且data里面沒有加密引數,


心中一喜,這沒有加密引數不是很簡單嗎,之后我們預覽一下,

傻眼了,這也不是資料啊!猜測應該是JavaScript加密了,但是這也沒辦法搜索關鍵字,這怎么辦呢,沒辦法只能用最笨的方法,找到發起程式這個選項,慢慢的一點一點的排除吧,

中間的send和ajax引起了我的注意,不管了點開看一下吧,來到了一個js檔案,展開打斷點,重繪

單步除錯,發現了這樣一段js陳述句,引起了我的注意

其中還有中文注釋,這段js陳述句挺好懂的,大致的意思就是構建一個url,發送一個請求,成功發送就把data傳過去,然后回呼,我們不關心它是怎么請求又回呼的,我們關心的只是這個data是怎么決議的,其中這句引起了我的注意

用python的代碼來解釋就是,呼叫了webInstace庫里面的shell方法,傳入一個data引數然后再決議一下,滑鼠放在這個方法的上面,會顯示這個方法的庫,點進去

這下徹底看不懂了,看不懂沒關系,我們之間把這個庫扒下來,然后利用execjs這個庫直接決議就行,我們傳入個data引數就好,
不懂execjs用法的朋友可以參考一下這個篇文章execjs的使用
我用的是pycharm,不會配置node.js環境的朋友可以參考一下這篇文章Pycharm配置node.js
代碼實作
我們把這個庫復制下來隨便命名為一個js檔案,然后再檔案的表頭添加一下這個行代碼
global.navigator={ userAgent: 'node.js', };

之后直接用python模擬請求即可,
附上源代碼
import requests
import execjs
def get_data(YEAR):
for i in range(14):
data = {
'year': YEAR,
'MethodName': 'BoxOffice_GetYearInfoData'
}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.63'}
url = 'https://www.endata.com.cn/API/GetData.ashx'
response = requests.post(url,headers=headers,data=data)
result = response.text
print(result)
with open("a.js","r",encoding='utf-8') as f:
js = f.read()
# 編譯js代碼
resp = execjs.compile(js)
# 呼叫方法
response = resp.call('webInstace.shell',result)
print(response)
YEAR = YEAR + 1
def main():
YEAR = 2008
get_data(YEAR)
if __name__ == '__main__':
main()
這里我只是把資料列印出來,后續的決議,朋友們可以自行選擇方法,
附帶上代碼運行的結果

PS:這只是簡單的一個JavaScript逆向實戰,大佬勿噴哈,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/261391.html
標籤:python
