安装在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))
{
var guid = new System.Guid(language);
engineType = Type.GetTypeFromCLSID(guid, true);
}
else
{
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行。