先使用
JS_DecodeScript反編譯jsc 得到AST樹
AST樹詞法解析
AST還原成源碼: npm install escodegen
AST樹遍歷:npm install estraverse
https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Internals/Bytecode
從CompileScript函數中可以看出它的處理過程,
用 Parser<FullParseHandler> parse對象,將源代碼進行翻譯,將代碼轉成AST結構ParseNode
再將AST數據結構
再將AST數據結構
經過BytecodeEmitter bce對象處理,變成字節碼。 這個字節碼是JSScript數據結構的一部分。
注意:這個字節碼是bce編譯產生的存儲在jsscript對象中, 最后一步是經過xdr數據處理,(調用的是JS_EncodeScript)存儲在文件中了,也就是jsc文件的內容。
所以js解釋器想運行jsc的代碼,必須先JS_DecodeScript一下,然后才能運行。
反編譯的過程:
讀取jsc文件,然后 用JS_DecodeScript函數 得到JScript 對象, 然后將JScript轉成
BytecodeParser parser(cx, script);
ASTSerializer serialize;
serialize.setParser(&parser);
ParseNode *pn = parser.parse(nullptr);
if (!pn)
return false;
RootedValue val(cx);
if (!serialize.program(pn, &val)) {
args.rval().setNull();
return false;
}