某手創作服務 __NS_sig3 sig3 | js 逆向

ThankCAT發表於2024-07-11

拿獲取作品列表為例

https://cp.kuaishou.com/rest/cp/works/v2/video/pc/photo/list?__NS_sig3=xxxxxxxxxxx

搜尋__NS_sig3

發現__NS_sig3是一個非同步回撥生成的值

s().call("$encode", [i, {suc: function(e) {t(`__NS_sig3=${e}`)},err: function(t) {e(t)}}])

具體邏輯就是:

  • s().call("$encode", [...]): 這個部分表示呼叫物件 s() 上的 call 方法,並傳遞 $encode 作為第一個引數。這裡的 s() 可能是某個物件或函式的呼叫,它返回了一個物件,該物件具有 call 方法。不明白call方法的可以參考這篇文章https://juejin.cn/post/7158686309211439141
  • "$encode": 這是傳遞給 call 方法的第一個引數
  • [i, { ... }]: 這是傳遞給 call 方法的第二個引數,是一個陣列。陣列的第一個元素 i 就是要加密的原資料。第二個元素是一個包含 sucerr 回撥函式的物件。

打斷點到s()...這裡,看看i是什麼

看起來i也是一個加密的值,有點像md5加密之後的樣子,往上找i生成的地方

const i = m(t, e, n);

其中t是json字串, e是cookies中的kuaishou.web.cp.api_ph的值, n是一個空物件

進到m函式里面發現e被JSON序列化之後有被加到了d(i)後面,最終呼叫a()(s)被加密出來。看到這裡就可以愉快的扣js了,哪裡沒有補哪裡。就不過多贅述了。

搞定i之後就可繼續往下走了,既然__NS_sig3是透過s().call()生成的,自然我們就要搞清楚s()是在哪裡定義的

找到s的定義s = n.n(o) 再找到o的定義o = n(7606),此時我們發現7606這個東西好眼熟,沒錯就是我們的老朋友webpack,接下來就開始扣webpack,如何扣webpack的步驟這裡就不贅述了,網上的教程一抓一大把。

最後驗證一下結果

Nice ,接下來放到python裡面跑一下看看是否能成功

  • 先來一個錯誤的sig看看什麼樣子

  • 再試試我們自己生成的sig的結果

完美執行~

該部分演算法和app中的某部分雷同

**本文僅供學習參考,如有問題詢問或有需要可留言,或加q 1018866051 **請備註演算法交流

相關文章