JS逆向實戰20——某頭條jsvm逆向

2023-07-04 15:00:39

宣告

本文章中所有內容僅供學習交流,抓包內容、敏感網址、資料介面均已做脫敏處理,嚴禁用於商業用途和非法用途,否則由此產生的一切後果均與作者無關,若有侵權,請聯絡我立即刪除!

網站

目標網站:aHR0cHM6Ly93d3cudG91dGlhby5jb20v
資料介面:aHR0cHM6Ly93d3cudG91dGlhby5jb20vYXBpL3BjL2xpc3QvZmVlZD9vZmZzZXQ9MCZjaGFubmVsX2lkPTk0MzQ5NTQ5Mzk1Jm1heF9iZWhvdF90aW1lPTAmY2F0ZWdvcnk9cGNfcHJvZmlsZV9jaGFubmVsJmRpc2FibGVfcmF3X2RhdGE9dHJ1ZSZhaWQ9MjQmYXBwX25hbWU9dG91dGlhb193ZWI=

抓包分析

這個網站的的封包有點多,為了更好的篩選,所以我們這裡使用charles去抓包,也為了更加清楚的展示。因為charles的包 是分網站的

抓到了如下的包,我們挨個看下 首先我們看看第一個請求

果然是這個封包,
然後我們看看這個的請求引數 如下圖所示

可以看到除了 | channel_id | _signature 除了這兩個引數,其他值好像都是定值。
為了確保玩意,我們再抓包一次。

哦吼,我們對比一下 發現好像只有 _signature 不太一樣。
第一次:

| channel_id | 94349549395 |
| _signature | _02B4Z6wo00f01z9d1bwAAIDCyiI.IkUKHQM.edEAAKt.NqUmn4ygAiOSxwaKaigCOeg56Ff89u.9vP6b6ub68vuKs2N8MHE1ooq3YQAYT9luKwEo58Z5CbtbU8m9.KvQ5zIywt7.ZVQByMpff7 |

第二次

| channel_id | 94349549395 |
| _signature | _02B4Z6wo00f01NpipegAAIDBLx1PdBeQ8LjaRqFAAFJAobBdiGXrf3fs2SKPrZr3jjY4vZP3kG7vB7l1w4C5LnkJNONZ-driqsx4S8hbVV4x8o4bjxJqi6BYxnSX9CGLBfcQe.nfmtpz8dZ57e |

這個值每次都不一樣,所以我們可以大膽猜測 這個值就是我們所需要的值。

尋找引數生成點。

我們直接開始去搜尋 _signature 這個值

剛好發現第一個地點 就很像引數生成的地方,我們在這裡打上斷點。然後再搜尋一下_signature 這個值

這裡還有個值,我們也打上斷點。

發現這個值雖然對了 ,但是好像傳的引數不是我們所要的那個連結啊


我們繼續往下走,跳過非我們所需的介面 也就是看看 F.getUri(e) 這個值。
在跳過三個請求後 終於找到我們所需要的這個介面了

我們接下里就逐步進棧。然後一直追。這個時候要有些耐心。
在經過幾層跳站,終於找到了 引數生成的地點,這個a.call(n, o) 就是生成簽名的地方。

我們可以看到 這個o 是個物件,裡面是存放的url鍵值對。
而這個n 應該就是函數,我們把這個n摳出來,應該就大功告成了。

網站扣程式碼

接上一段。
我們打上斷點再逐步進棧。

然後發現進到了acrawler.js 這個檔案裡面。我們簡單過一下這個檔案。發現這是個自執行函數啊。那我們直接全部複製下來補環境是不是就ok了。
我們試一試哈。
這裡複製下來。會發現後面執行的引數很長,很影響觀感。pycharm 設定一下js換行。

如上圖設定即可。

我們在下面執行這句話。為什麼是這句話呢。我們跳到外面這個棧去看看

window.byted_acrawler.sign({
    "url":"http://localhost:8080"
})


然後執行。這個時候會報錯

這個時候就奇怪了。這個地方怎麼會報錯呢。我們列印一下282行這個值看看。
分別列印下 S[R] R A 你就全懂了。尤其是是列印 A 這不就是妥妥的環境檢測嗎

我們給他補上

window = global;
window.document = {
    referrer: ''
}

然後我們再次執行,發現還是不行 會報找不到sign這個值

那這就奇怪了,我們放到瀏覽器環境上執行下看看

發現在瀏覽器上流程執行,那就只有一種可能了,就是環境沒補好。有些環境檢測過不去。
我們把斷點打在這個地方,這就是底下傳參的地方

經過不斷的 debugger 測試,將下圖的兩句話 改成 undefined

改好之後還會報一個錯 ,我們再補上

由於這個location裡面東西也不是很多,我們就全補上了

window.location = {
    "ancestorOrigins": {},
    "href": "https://www.toutiao.com/?wid=1688368231201",
    "origin": "https://www.toutiao.com",
    "protocol": "https:",
    "host": "www.toutiao.com",
    "hostname": "www.toutiao.com",
    "port": "",
    "pathname": "/",
    "search": "?wid=1688368231201",
    "hash": ""
}

然後還會報一個 Useragent的錯誤

我們繼續補上

navigator = {
    "userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67'
}

然後就扣程式碼扣成功了。

這個值好短啊。我們對比一下

_02B4Z6wo00f01vfjpbwAAIDBCBxaQ1vn84b3waEAANlo3f
_02B4Z6wo00f01z9d1bwAAIDCyiI.IkUKHQM.edEAAKt.NqUmn4ygAiOSxwaKaigCOeg56Ff89u.9vP6b6ub68vuKs2N8MHE1ooq3YQAYT9luKwEo58Z5CbtbU8m9.KvQ5zIywt7.ZVQByMpff7

足足長了一大截。
我們再挨個進斷點看看。在如圖的位置打上斷點。挨個追棧檢視。

後面發現在之前獲取瀏覽器環境中發現,在出_signature之前,獲取過一次cookie
所以我們還需要加上cookie 直接寫死即可

document.cookie = 'msToken=YT_CAKC4j1yOwgMxbB2jtTTvxroozg34lnY5cf7g7_JSz377gE4XfhP07HZPUjoaoHEVch4egS8RXblHNVYDeiZruwFzZD7GNPayfzsnWyA=; __ac_signature=_02B4Z6wo00f017cKGvwAAIDCQnXwY7ZFvKO3Lh5AAIlpCKNViv2DVvvH6x4q.QT77MgQzrAiF9hMRCiHWWaFPKyKg89Jhy8HzzWEsxOCL0uGv6qSBlqyWa5ptCRdbDDYlnceGFmxuIms3oCRf6; local_city_cache=%E8%8B%8F%E5%B7%9E; csrftoken=a08a7c6e066f7118fe2f379bb779e6f5; _ga_QEHZPBE5HH=GS1.1.1688368982.1.0.1688368982.0.0.0; _ga=GA1.1.1087552243.1688368983; s_v_web_id=verify_ljmjastc_1G6Mv2zQ_Y8pE_4qln_8mk4_sM1M5ze46FYX; tt_scid=F-2KEY1R0ROnAeE9XHLVYZZuLIETYppB9GsM9UL-TAMWFnDlcgdmDViPv9tGci1rf76e'

然後就能執行成功了

然後我們封裝一下 順便替換一下某些值。

結果

部分程式碼如下圖

完成!!