吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2681|回复: 43
收起左侧

[Web逆向] 浅逆某里227滑块

[复制链接]
ngiokweng 发表于 2024-3-19 21:19
本帖最后由 ngiokweng 于 2024-3-20 10:28 编辑

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

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

Untitled.png

跟n值生成位置

第一種方法

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

Untitled1.png

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

Untitled2.png

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

Untitled3.png

第二種方法

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

下個全局的的mousedown斷點

Untitled4.png

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

Untitled5.png
經過一些操作後進入i,繼續深入i看看

Untitled6.png

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

Untitled7.png

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

Untitled8.png

本地&瀏覽器調試

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

本地出值

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

如下所示,按awsc.jset_f.jsfireyejs.jsnc.js的順序

Untitled9.png

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

Untitled10.png

本地調用如下:

Untitled11.png

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

Untitled12.png

本地調用如下:

Untitled13.png

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

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

Untitled14.png

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

t = getComputedStyle(document.body);
pe = [].slice.call(t)
  • Performance.prototype.getEntriesByType
  • font指紋
// 1
ke = Ee[re] != y[J]
// 2
ke = Ee[Be] != B[J]

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

AST解混淆

  • 在進行瀏覽器跟值這一步前,強烈建議先解一解fireyejs.js的混淆( 主要邏輯在這個js文件裡 ),具體做法可以參考大佬的這篇文章
    ( 一開始我唔信邪硬剛左一個星期,跟值跟到自閉,無奈只能放棄哩個on9做法… )

  • 由於我ast比較菜,所以只解到了多層switch單switch那裡,但由於變量作用域等問題,多層switch單switch的代碼無法替換瀏覽器裡原本的代碼( 簡單來說就是用不了 )。
    雖然不能直接替換使用,但在分析時( 向上跟值、跟調用順序 )卻大有用處,眾所周知控制流平坦化是無法直接通過跟棧來找到上一步的,只能通過控制流的狀態變量一步一步往上跟,而只有一層的switch控制流比起多層嵌套的switch控制流就容易跟值多了。

    舉例來說,以下是只有一層的switch控制流,假如狀態變量是li,我想跟case 5157的上一步是哪,直接搜li = 5157,若有多個結果就全部下斷,看它走哪裡

    case 5157:
      S = b = [U + 64 * ye];
      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)[ei];
      Lo = To[Wo](zo);
      Eo = i[Je](Lo, 36, to, 0, lo, 1);
      No = Xo[_o](Eo, eo);
      eo = i[Je](Lo, 36, to, No, go);
      li = 13380;
      break;
  • 瀏覽器替換用的是多層switch嵌套的版本,主要處理了三目运算符、逗号表达式等阻礙調試的東西,看大佬的那篇文章有移除自執行函數這步,但在227移除自執行函數會有變量作用域問題,因此我就保留了( 這也導致ast要多判斷一些條件 )

    ( 可以看到多層嵌套switch控制流,若要向上跟,要考慮多個狀態變量,十分麻煩!!!! )

Untitled15.png

瀏覽器跟值

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

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

Untitled16.png

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

Untitled17.png

Untitled18.png

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

Untitled19.png

  • s[23]:由ScriptProcessorNodeonaudioprocess事件生成,而onaudioprocess事件是通過觸發全局的mousedown而來,具體值的來源是AnalyserNode.prototype.getFloatFrequencyData

  • s[48]:與timestamp有關的數組

  • s[91]:promise的回調( 看堆棧就知道 )

  • s[52]:同樣是某個promise的回調觸發的

  • s[3]:由FocusEvent觸發

  • s[90]:最重要的軌跡數組,有以下幾個要點:

    • mousedownmousemove觸發( 全局正常會有2個mousemovemousedown事件,要用第2個 ),每次會生成一個軌跡
    • 軌跡主要取MouseEvent.clientXMouseEvent.clientYtimestampMouseEvent.pageYMouseEvent.pageX等,並進行了異或等咚悖虼酥苯涌碻s[90]`會與軌跡值對不上
    • 這個軌跡數組並非鼠標點擊後才開始push,而是只要在頁面上動就會一直在push,因此軌跡數組可能要分成點擊前和點擊後
    • 有兩種軌跡,分別是length為17和length為18的,嘗試過找為什麼有兩種不同的軌跡,但放棄了,最後我在本地手動構建軌跡時發現我的s[90]同樣有這兩種,就沒有深究了
    • 快速獲取軌跡的方法:在i函數一開始下條件斷點

      o instanceof MouseEvent && ( window.slideArr ? window.slideArr.push({"pageX":o.pageX, "pageY":o.pageY, "clientX":o.clientX, "clientY":o.clientY}) : window.slideArr = [], false)
  • s[36]:由滑塊的與鼠點擊事件觸發

本地調用結果

Untitled20.png

參考

感謝大佬們的分享

免费评分

参与人数 10威望 +2 吾爱币 +108 热心值 +9 收起 理由
JC1916 + 1 谢谢@Thanks!
涛之雨 + 2 + 100 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
HUAJIEN + 1 + 1 我很赞同!
Yangzaipython + 1 + 1 谢谢@Thanks!
liangzaiyi + 1 谢谢@Thanks!
Behind1 + 1 + 1 用心讨论,共获提升!
外酥内嫩 + 1 + 1 牛批啊大佬
铠甲勇士大地锅 + 1 + 1 谢谢@Thanks!
tomhex + 1 + 1 谢谢@Thanks!
liuxuming3303 + 1 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

starryskyhello 发表于 2024-3-21 20:47
写得好!
adjzhang 发表于 2024-3-20 16:59
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
大佬,有对接方式嘛~
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-28 03:27

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表