AST實戰(zhàn)|AST入門實戰(zhàn)星球高頻問題匯總

      網(wǎng)友投稿 828 2025-03-31

      一.t.isStringLiteral...中的t是什么變量?

      答:早期的一些代碼,我都是參考官方寫的,但由于ob混淆在還原的時候,會用到eval函數(shù),這樣可能導致變量名污染,所以我在后面統(tǒng)一改成了 types

      const types = require("@babel/types");

      二.下面的代碼中:

      let {node,scope} = path;

      代碼中的{}是什么意思?

      答:這是ES6的語法,是變量的解構(gòu)賦值。

      在之前,我們一般這么寫:

      let?node ?=?path.node;

      let scope = path.scope;

      但是在ES6語法中,我們可以簡寫為:

      let {node,scope} = path;

      具體知識參考這個鏈接:https://wangdoc.com/es6/destructuring.html

      三.下面的代碼中:

      path.findParent(p => p.isConditionalExpression());

      p是什么,哪里傳來的?

      答:問題的本質(zhì)不是p,而是箭頭函數(shù)。

      箭頭函數(shù)的詳細介紹可以參考這篇文章:

      https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arrow_functions

      AST實戰(zhàn)|AST入門與實戰(zhàn)星球高頻問題匯總

      四.下面的代碼中:

      StringLiteral({node}) {...}

      這個函數(shù)中{}是啥?

      答: 和問題二是一樣的,也是變量的解構(gòu)賦值罷。

      原本應該是

      StringLiteral(path) {...}

      而node是path的一個屬性,因此可以這么簡寫:

      StringLiteral({node})

      你甚至還可以根據(jù)自己的需求寫成:

      StringLiteral({node,scope})

      五.下面的代碼中:

      scope.traverse(scope.block,?{...})

      scope.traverse是什么,scope.block是什么?

      答:scope.traverse 這個和 @babel/traverse 中的 traverse 用法是一樣的,

      scope.block表示當前scope的node,可以參見源代碼:

      node_modules\@babel\traverse\lib\scope\index.js

      中對 Scope 的定義。

      六.編寫的插件報錯該怎么定位和處理?

      答:插件報錯后,一般我會在插件的第一行打印報錯的源代碼:

      console.log(path.toString());

      觀察當前源代碼的特征,如果不符合所遍歷的規(guī)則,可以進行return。

      也可以進行判斷,只處理需要處理的path。

      七.為什么運行插件后報 "Maximum call stack size exceeded"的錯誤?該怎么處理?

      答: 根據(jù)我的實踐總結(jié),絕大部分的情況,用了path.replacexxx函數(shù),而替換前后的類型是一致的。

      比如,你當前遍歷的節(jié)點是 StringLiteral 類型,而你在path.replacexxx函數(shù)里的實參節(jié)點也是 StringLiteral 類型,這樣就導致一直在訪問這個插件,

      最后提示 RangeError: Maximum call stack size exceeded。

      一個簡單的實例:

      var s = "abc";

      想要把"abc",變成"hello",也許會這么寫插件:

      const visitor = {

      StringLiteral(path)

      {

      path.replaceWith(t.StringLiteral("hello"));

      }

      }

      運行后就報錯了。

      建立一個 if-return 機制就可以解決這樣的問題了。

      八.JS逆向時找不到加密參數(shù)在哪里生成的怎么辦?

      答:

      第一步:先全局搜索,搜不到轉(zhuǎn)第二步;

      第二步:抓包加密請求的URL,看看其 Initiator里面的 Request call stack,跟進去看看哪里打斷點合適。還是不行轉(zhuǎn)第三步;

      第三步:看看有沒有被混淆了的js,有的話先還原,如果沒有轉(zhuǎn)第四步;

      第四步:看看能不能打XHR斷點或者其他的斷點,不能打轉(zhuǎn)第五步;

      第五步:hook,看看是否為全局變量,或者某些需要經(jīng)過系統(tǒng)函數(shù)加密的,注意觀察加密字符串的特征,md5:32位英數(shù)混合;所有的字符是否屬于base64碼表內(nèi).......如果hook不到轉(zhuǎn)第六步;

      第六步:網(wǎng)上搜一搜教程,大廠的東西肯定有教程的。

      建議直接跳到第六步。

      總結(jié):

      學習是一個觀摩的過程,先看看別人怎么弄的,然后再自己實戰(zhàn)。

      學習嘛,先得學,別一上來就自己搞自己的,然后報錯了各種問題打擊自信心...一般官方文檔都會有例子。

      JavaScript

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:LOOKUP函數(shù)的七種經(jīng)典用法
      下一篇:生產(chǎn)運作管理系統(tǒng)(生產(chǎn)運作管理系統(tǒng)的成本控制需要經(jīng)過哪些環(huán)節(jié))
      相關文章
      亚洲AV美女一区二区三区| 亚洲日韩国产精品乱| 亚洲日产韩国一二三四区| 亚洲综合久久夜AV | 亚洲高清无码专区视频| 色噜噜的亚洲男人的天堂| 国产精品亚洲专区无码唯爱网| 亚洲精品国产国语| 亚洲六月丁香婷婷综合| 亚洲高清视频在线| 亚洲午夜精品一区二区麻豆| 亚洲性色精品一区二区在线| 亚洲精品天堂成人片AV在线播放| 亚洲中文字幕无码mv| 亚洲精品人成网线在线播放va| 亚洲欧美日本韩国| 久久久亚洲精华液精华液精华液 | 亚洲毛片αv无线播放一区| 亚洲综合色在线观看亚洲| 亚洲日韩中文字幕日韩在线| 亚洲午夜成人精品电影在线观看| MM131亚洲国产美女久久| 亚洲人成网亚洲欧洲无码久久| 亚洲成AV人片在线观看无码| 亚洲AV成人无码久久精品老人 | 亚洲精品无码一区二区| 亚洲AV永久无码精品一福利| 小说专区亚洲春色校园| 亚洲视频人成在线播放| 亚洲一区二区三区自拍公司| 久久综合日韩亚洲精品色| 老汉色老汉首页a亚洲| 亚洲人成网网址在线看| 涩涩色中文综合亚洲| 亚洲精品精华液一区二区 | 91天堂素人精品系列全集亚洲| 亚洲国产av美女网站| 亚洲熟妇无码八V在线播放| 日本系列1页亚洲系列| 国产亚洲精品a在线观看| 久久久久久a亚洲欧洲AV|