ngiokweng 发表于 2024-3-19 21:19

浅逆某里227滑块

本帖最后由 ngiokweng 于 2024-3-20 10:28 编辑

> Target:aHR0cHM6Ly9qb2JzLjUxam9iLmNvbS9zdXpob3UtZ3l5cS8xNTMzMDczMjEuaHRtbA== ( 多刷新幾次就會觸發滑塊 )
>

在調試前可先用`fiddler`等工具固定滑塊頁面,這樣會方便很多



## 跟n值生成位置

### 第一種方法

在滑動滑塊前先下個`script`斷點,然後會斷在這裡



這時去看網路面板,可以發現滑塊的驗證是通過`nocaptcha/analyze.jsonp`這個接口,其中最關鍵的參數就是`n`



簡單跟下棧就能找到`n`的生成位置,`o.__fy_options`固定就可以



### 第二種方法

這種方法是在別的大佬的文章看到的,一開始我是用第一種方法找到的,但第二種方法感覺也挺好的,特此記錄一下

下個全局的的`mousedown`斷點



斷下後走幾步會到這裡,看到它添加了一個`mousemove`事件,跟入`s`看看


經過一些操作後進入`i`,繼續深入`i`看看



前面先移除了各種事件,最後進入了`m`函數



然後`m`函數就是`n`值生成的位置



## 本地&瀏覽器調試

通常我找到密文生成位置後,會先嘗試導出相關函數,然後在本地簡單補下環境,先讓其出值( 雖然這個值大概率還不能使用 )

### 本地出值

由於我比較懶,我是直接將幾個可能用到的js文件放到本地的環境,然後通過導出相關函數來生成`n`值。

如下所示,按`awsc.js`、`et_f.js`、`fireyejs.js`、`nc.js`的順序



在導出加密函數`o.__fy.getFYToken`時發現要先初始化一些環境,跟棧找到`m.init`,這裡直接導出`m`



本地調用如下:



然後就可以導出`o.__fy.getFYToken`的`o`對象 ( 代碼最好不要格式化,防止有檢測 )



本地調用如下:



在`awsc.js`、`et_f.js`、`fireyejs.js`、`nc.js`這幾個環境初始化時,或者是在`getFYToken`加密的過程中,需要手動補瀏覽器的環境,以下是部份我遇到要補的環境:

-調用`getComputedStyle`取了body所有的屬性,然後放到pe中



具體效果如這兩句代碼一致

```jsx
t = getComputedStyle(document.body);
pe = [].slice.call(t)
```

-`Performance.prototype.getEntriesByType`
-`font`指紋

```jsx
// 1
ke = Ee != y
// 2
ke = Ee != B
```

補著補著就能出值了,這是個好的開始

### AST解混淆

- 在進行瀏覽器跟值這一步前,強烈建議先解一解`fireyejs.js`的混淆( 主要邏輯在這個js文件裡 ),具體做法可以參考大佬的[這篇文章](https://www.52pojie.cn/forum.php?mod=viewthread&tid=1818486&extra=&highlight=226&page=1)。
( 一開始我唔信邪硬剛左一個星期,跟值跟到自閉,無奈只能放棄哩個on9做法… )
- 由於我ast比較菜,所以只解到了`多層switch`→`單switch`那裡,但由於變量作用域等問題,`多層switch`→`單switch`的代碼無法替換瀏覽器裡原本的代碼( 簡單來說就是用不了 )。
雖然不能直接替換使用,但在分析時( 向上跟值、跟調用順序 )卻大有用處,眾所周知控制流平坦化是無法直接通過跟棧來找到上一步的,只能通過控制流的狀態變量一步一步往上跟,而只有一層的switch控制流比起多層嵌套的switch控制流就容易跟值多了。
   
    舉例來說,以下是只有一層的switch控制流,假如狀態變量是`li`,我想跟`case 5157`的上一步是哪,直接搜`li = 5157`,若有多個結果就全部下斷,看它走哪裡
   
    ```jsx
    case 5157:
      S = b = ;
      li = 19041;
      break;
    case 5184:
      R = k = f;
      if (bo = (P = (fe = fe < 15) * fe) > (Y = (A = 215 | (bo = !hi)) << 25)) {
      li = 1349;
      } else {
      li = 14688;
      }
      break;
    case 5185:
      to = Ke = to;
      lo = ao;
      go = ze;
      qo = ho;
      To = (Xo = ne);
      Lo = To(zo);
      Eo = i(Lo, 36, to, 0, lo, 1);
      No = Xo(Eo, eo);
      eo = i(Lo, 36, to, No, go);
      li = 13380;
      break;
    ```
   
- 瀏覽器替換用的是多層switch嵌套的版本,主要處理了三目运算符、逗号表达式等阻礙調試的東西,看大佬的那篇文章有移除自執行函數這步,但在227移除自執行函數會有變量作用域問題,因此我就保留了( 這也導致ast要多判斷一些條件 )
   
    ( 可以看到多層嵌套switch控制流,若要向上跟,要考慮多個狀態變量,十分麻煩!!!! )
   



### 瀏覽器跟值

主要目標是找到軌跡相關的邏輯

跟進`o.__fy.getFYToken`,會走到`i(40, e)`這裡



單步走幾步,發現`s`數組,看它的內容很像是一個環境的特徵數組,`s`還特別像是與軌跡有關,經測試後發現確實如此( 所謂測試就是鼠標多滑幾下或少滑幾下,看看這個`s`的長度是否符合預期 ),接下來看看這個`s`數組的某幾項:





- `s`:`鼠標點擊前的軌跡數組長度 - 1` ( 計mousedown那一下的軌跡 )
- `s`:與`s`類似,但不計mousedown那一下的軌跡,因此比`s`小1,由`i(25)`觸發
- `s`:前兩項是`WebGLRenderingContext`的東西,第3項的`"undefined"`是觸發`DeviceOrientationEvent`事件而來,第4、5項是觸發`MouseEvent`而來,鼠標在頁面不同位置時,對應的`target`( html頁面中的某個元素 )也不一樣,取的是`target["id"]`



- `s`:由`ScriptProcessorNode`的`onaudioprocess`事件生成,而`onaudioprocess`事件是通過觸發全局的`mousedown`而來,具體值的來源是`AnalyserNode.prototype.getFloatFrequencyData`
- `s`:與timestamp有關的數組
- `s`:promise的回調( 看堆棧就知道 )
- `s`:同樣是某個promise的回調觸發的
- `s`:由`FocusEvent`觸發
- `s`:最重要的軌跡數組,有以下幾個要點:
    - 由`mousedown`、`mousemove`觸發( 全局正常會有2個`mousemove`、`mousedown`事件,要用第2個 ),每次會生成一個軌跡
    - 軌跡主要取`MouseEvent.clientX`、`MouseEvent.clientY`、`timestamp`、`MouseEvent.pageY`、`MouseEvent.pageX`等,並進行了異或等咚悖虼酥苯涌碻s`會與軌跡值對不上
    - 這個軌跡數組並非鼠標點擊後才開始push,而是只要在頁面上動就會一直在push,因此軌跡數組可能要分成點擊前和點擊後
    - 有兩種軌跡,分別是length為`17`和length為`18`的,嘗試過找為什麼有兩種不同的軌跡,但放棄了,最後我在本地手動構建軌跡時發現我的`s`同樣有這兩種,就沒有深究了
    - 快速獲取軌跡的方法:在`i`函數一開始下條件斷點
      
      ```jsx
      o instanceof MouseEvent && ( window.slideArr ? window.slideArr.push({"pageX":o.pageX, "pageY":o.pageY, "clientX":o.clientX, "clientY":o.clientY}) : window.slideArr = [], false)
      ```
      
- `s`:由滑塊的與鼠點擊事件觸發

## 本地調用結果



## 參考

感謝大佬們的分享

- (https://blog.csdn.net/weixin_44862184/article/details/135159526)
- (https://www.52pojie.cn/forum.php?mod=viewthread&tid=1818486&extra=&highlight=226&page=1)
- (https://zhuanlan.zhihu.com/p/673660020)
- (https://mp.weixin.qq.com/s/s6e4TmOJHdYTsJ4p1ZJGDw)
- (https://mp.weixin.qq.com/s/almQM3N9VMBk86-Jv2LPow)

starryskyhello 发表于 2024-3-21 20:47

写得好!

adjzhang 发表于 2024-3-20 16:59

太强了@thanks

AnYuDIDIao 发表于 2024-3-20 17:29

感谢大佬分享

LingN 发表于 2024-3-20 17:47

很好,学习了!!!!!

Tsirius 发表于 2024-3-20 08:57

感谢楼主分享

外酥内嫩 发表于 2024-3-20 09:13

赶紧收藏保存下,以后肯定用得着

开枪为你送行 发表于 2024-3-19 22:01

沙发,支持大佬

lippone 发表于 2024-3-20 15:25

路过学习下

兔子哥哥 发表于 2024-3-20 09:06

大佬是外国人吗 怎么又是繁体又是错别字

smartfind 发表于 2024-3-20 09:27

大佬厉害,就是繁体字看着有点难受。

ngiokweng 发表于 2024-3-20 09:39

兔子哥哥 发表于 2024-3-20 09:06
大佬是外国人吗 怎么又是繁体又是错别字

之前沒特別留意,有些字變成亂碼了,我改一下好了

悦来客栈的老板 发表于 2024-3-20 12:54

本帖最后由 悦来客栈的老板 于 2024-3-20 13:01 编辑

感谢大佬的分享。技术又进了一步

ffm1110 发表于 2024-3-20 13:40

感谢楼主分享!!研究研究

一只迷惘的笨虎 发表于 2024-3-20 14:56

{:1_918:}大佬,有对接方式嘛~
页: [1] 2 3 4 5
查看完整版本: 浅逆某里227滑块