IE9的JavaScript引擎(代号“Chakra”)的ProgId或CLSID是什么?

23

使用.NET,我可以编写一个应用程序,它托管了遵循微软IActiveScript约定的脚本引擎。这包括来自微软的JScript和VBScript,以及来自第三方的PerlScript、RubyScript等我不知道还有哪些

在代码中实现的方式大致如下:

    Type engine = Type.GetTypeFromProgID(progId, true);
    _engine = Activator.CreateInstance(engine) as IActiveScript;

其中progId可以取值Javascript、JScript、ECMAScript、VBScript等。当使用cscript.exe运行时,您可以通过命令行使用//E选项指定progId。例如,这个命令:

cscript.exe  <file>  //e:JScript

无论文件的扩展名是什么,都可以通过JScript引擎运行指定的文件。

在我的计算机上,如果我查看 HKLM\SW\Classes\ ,三个ProgIds {Javascript、JScript、ECMAScript} 都指向相同的CLSID,我猜这就是JScript 5.8脚本引擎:{f414c260-6ac0-11cf-b6d1-00aa00bbbb58}

是否有一个ProgId或CLSID可以指定来运行IE9的Javascript引擎,也称为“Chakra”?

IE9的引擎是否仍然由IActiveScript加载?
Microsoft的文档表明确实如此, 但没有指定ProgId或CLSID。


我没有确切的答案,但可以试试这个方法:启动IE9,打开一个使用JavaScript的页面,并检查在IE进程中加载了哪些DLL等。缩小相应的DLL范围,然后找出已注册的DLL...从那里就可以确定CLSID。 - Yahia
我认为这个问题现在已经过时了。我认为微软已经正式公开了Chakra作为脚本引擎,所以你不需要做任何这种无聊的事情。但我不知道具体细节,只是一个谣言。 - Cheeso
3个回答

33

安装在IE9中的Chakra JavaScript引擎的CLSID为{16d51579-a30b-4c8b-a276-0ff4dc41e755}

InProcServer32是%windir%\System32\jscript9.dll

我找不到任何ProgId。这有点奇怪;通常,配对的ProgId和CLSID条目互相引用。对于给定的COM对象,注册表中的ProgId键具有一个名为CLSID的子键,而CLSID注册表键具有一个名为ProgId的子键,并且它们相互引用。但是IE9 CLSID的ProgId子键是"JScript",这当然是指v5.8 Jscript CLSID。不确定这是Microsoft的错误还是故意的混淆,因为他们不希望任何人在IE9之外使用Chakra引擎。在我看来,这似乎是有目的的。


我通过在注册表中搜索jscript9.dll来获取CLSID。


如果您有托管脚本引擎的.NET代码,可以直接使用CLSID实例化IE9 javascript引擎(“Chakra”)的IActiveScript对象。代码需要类似于以下内容:

private const string clsIdPattern =
    @"^(?<curly>\{)?[a-zA-Z0-9]{8}(?:-[a-zA-Z0-9]{4}){3}-[a-zA-Z0-9]{12}(?(curly)\})$";

public ScriptEngine(string language)
{
    if (language == null)
        throw new ArgumentNullException("language");

    Type engineType = null;

    if (Regex.IsMatch(language, clsIdPattern))
    {
        // it's a CLSID
        var guid = new System.Guid(language);
        engineType = Type.GetTypeFromCLSID(guid, true);
    }
    else
    {
        // assume vanilla progId
        engineType = Type.GetTypeFromProgID(language, true);
    }

    var engine = Activator.CreateInstance(engineType) as IActiveScript;
在上述代码中,clsIdPattern 是一个正则表达式,用于匹配熟悉的 GUID 格式,可以包含或不包含花括号。
给定上述代码,您可以传递 "jscript"、"Javascript" 或 "ECMAScript",并获得 v5.8 JScript 引擎。或者,您可以传递 "{16d51579-a30b-4c8b-a276-0ff4dc41e755}" 并获取 IE9 Javascript 引擎。显然,您需要安装 IE9 才能使此功能正常工作。
我刚试过了一下,对于简单情况,它可以工作。我很快会有更多时间去尝试。
如果您想从 WSH 中运行 Chakra(例如来自 cscript.exe),那么您需要一个 ProgId。
如果我在注册表中创建 "Chakra" 作为 Progid,并引用正确的 CLSID,我可以通过 IE9 的引擎运行 JS 文件,如下所示:
cscript.exe  module.js  //E:Chakra 
例如,在插入新的“Chakra” ProgId之后,给定如下脚本:
WScript.Echo( ScriptEngineMajorVersion() + "." +
              ScriptEngineMinorVersion() + "." +
              ScriptEngineBuildVersion());

输出结果如下:

C:\dev\js>Version.js
5.8.16982

C:\dev\js>cscript.exe Version.js  //E:Chakra
9.0.16434

这里是使用JavaScript进行AES加密的测试结果,比较了Chakra和JScript 5.8:

C:\dev\js\SlowAES>cscript.exe test.aes.js
AES encryption in Javascript.
password  : Albatros1
salt      : saltines (73616c74696e6573)
iterations: 1000
key       : 172,52,20,51,98,71,49,195,14,31,141,51,129,8,94,66
iv        : 212,27,28,156,83,245,0,35,176,157,45,141,209,143,158,248
plaintext : Hello, /r/javascript.
ciphertext: fdebac9f1ed1a13bac58f3cc6558e8b0367a94245dbbfe53cacc4979799fc182
decrypted : Hello, /r/javascript.
elapsed   : 5011ms

C:\dev\js\SlowAES>cscript.exe test.aes.js //E:Chakra
AES encryption in Javascript.
password  : Albatros1
salt      : saltines (73616c74696e6573)
iterations: 1000
key       : 172,52,20,51,98,71,49,195,14,31,141,51,129,8,94,66
iv        : 212,27,28,156,83,245,0,35,176,157,45,141,209,143,158,248
plaintext : Hello, /r/javascript.
ciphertext: fdebac9f1ed1a13bac58f3cc6558e8b0367a94245dbbfe53cacc4979799fc182
decrypted : Hello, /r/javascript.
elapsed   : 2593ms

我使用以下代码在注册表中设置ProgId:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID]
@="Chakra"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID]
@="Chakra"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra]
@="JScript Language"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra\CLSID]
@="{16d51579-a30b-4c8b-a276-0ff4dc41e755}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra\OLEScript]

为了取消暴露Chakra,或恢复注册表,我做了这个:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID]
@="JScript"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Wow6432Node\CLSID\{16d51579-a30b-4c8b-a276-0ff4dc41e755}\ProgID]
@="JScript"

[-HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Chakra]

这个注册表脚本适用于x64 Windows;如果你没有x64,则需要删除WOW6432Node行。


您在上面评论中的链接似乎已经失效。由于我目前正在尝试让活动脚本分析器工作,我很想看看您的示例,希望能给我一些启发。是否仍然有可能下载您的示例? - Uwe Keim

7
可能有点晚了,但是:
您还可以通过 //E 参数简单地指定要使用的引擎的 CLSID:
cscript.exe  <file>  //E:{16d51579-a30b-4c8b-a276-0ff4dc41e755}
编辑:根据 Cheeso 的答案,我发现只需添加以下注册表项即可在不指定 CLSID 的情况下使用 jscript9。我在这里使用键名 JScript9,您可以将其替换为 Chakra(如果您愿意的话)。键名是您在 //E: 后指定的内容:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\JScript9] @="JScript9 Language"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\JScript9\CLSID] @="{16d51579-a30b-4c8b-a276-0ff4dc41e755}"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\JScript9\OLEScript]
然后:
cscript.exe  <file>  //E:JScript9

2

太好了!谢谢,Justin。 - Cheeso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接