AST實戰(zhàn)|AST入門與實戰(zhàn)星球高頻問題匯總
一.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
四.下面的代碼中:
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)容。