最近整理書籤 發現有些B站的重複加了
看了一下發現是因為除了 AV/BV 號後面還會偷加一些東西造成網址不同
而 vd_source 這個參數如果在登入狀態下
甚至手動刪除也會幫你加回來
查了一下有人說是 uid 的加鹽 md5 但我一開始沒找到具體的作法
(等我真的自己逆完之後就在知乎搜到了= =)
所以我就試著看 vd_source 怎麼生成的
首先因為沒跳轉 url就變了 應該是 pushState 或 replaceState
hook 這兩個之後打一下 trace
發現一個叫 checkLoginInfoForHeaderV3 的很可疑
跟進去之後果然就中了 之後能追到一個顯然是 md5 的 function
真的看一遍後 發現不是直接 md5 的原因是
如果輸入是 string 則會呼叫他寫的 stringToBytes
但如果不是 string 又不是 array-like 則會呼叫 toString
我看到就 ??? 你到底要 string 還是 bytes
而在 checkLoginInfoForHeaderV3 裡丟的是數所以這裡會被轉成 string
然後因為 32-bit 一組 他執行 bytesToWords 時(所以顯然他要的是 bytes)
做 left shift 操作時把字串隱式轉成 number 了 js魅力時刻
所以假如 uid = 12345 其實最後的結果是 md5("\x01\x02\x03\x04\x05")
並不是什麼加鹽
用我自己 uid 也對的上
後來在知乎查到 實際上B站的 vd_source 有兩種版本
如果是按轉發產生的連結 就是直接 md5(uid)
去查了一下發現果然因為傳進去的是 this.userInfo.mid.toString()
傳進去的是 string 所以有被正常處理
草台班子.jpg
好搞笑 明明是程式寫錯 但碰巧加大了難度
不過以B站頂多 10^9 用戶的數量級
即使在本地慢慢跑 想要從 vd_source 反推 uid 也是綽綽有餘的