评论

收藏

[R语言] jsc 解码窥探

编程语言 编程语言 发布于:2021-07-30 21:21 | 阅读数:568 | 评论:0

先使用 
JS_DecodeScript反编译jsc  得到AST树
AST树词法解析
http://esprima.org/
AST还原成源码: npm install escodegen
AST树遍历:npm install estraverse 
DSC0000.png

DSC0001.png

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

从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;
}



关注下面的标签,发现更多相似文章