先使用 

JS_DecodeScript反编译jsc  得到AST树

 

AST树词法解析

http://esprima.org/

 

AST还原成源码: npm install escodegen

AST树遍历:npm install estraverse 

 
 

jsc 解码窥探_编程

 

 

jsc 解码窥探_编程_02

 

 https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey/Internals/Bytecode

 

 

jsc 解码窥探_编程_03

 

 从CompileScript函数中可以看出它的处理过程, 

用 Parser<FullParseHandler> parse对象,将源代码进行翻译,将代码转成AST结构ParseNode
再将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;
}
 
 
 
 
 

jsc 解码窥探_编程_04