影者东升 发表于 2021-7-30 21:21:28

jsc 解码窥探

先使用 
JS_DecodeScript反编译jsc  得到AST树
AST树词法解析
http://esprima.org/
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数据结构
经过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;
}



文档来源:51CTO技术博客https://blog.51cto.com/dzqdzq/3230487
页: [1]
查看完整版本: jsc 解码窥探