Mojo JavaScript 绑定 API
01 为 mojom 编译js脚本
官网说明:
https://chromium.googlesource.com/chromium/src/+/refs/heads/main/mojo/public/js/README.md
src\services\test\echo
有一个echo_service demo。可以结合使用。
注意编译生成 mojom 的 js 接口文件的命令
ninja -C out\Debug services\test\echo\public\mojom:mojom_js
生成c++的指令
ninja -C out\Debug services\test\echo\public\mojom:mojom
// js mojo 接口需要的依赖文件在 gen\mojo\public\js\
目录下:
gen\mojo\public\js\ mojo_bindings.js
gen\mojo\public\js\ mojo_bindings_lite.js
02 Mojo js的绑定权限
Mojo的js功能,并不是哪里都可以用的。可以通过命令行增加参数启用,还有就是默认的新标签页。
默认renderer和扩展进程是不能使用js的Mojo功能的。
可以通过注释掉子进程的限制条件,来对所有情况开启js的mojo功能。
void RenderFrameImpl::DidCreateScriptContext(v8::Local<v8::Context> context,
int world_id) {
v8::MicrotasksScope microtasks(blink::MainThreadIsolate(),
v8::MicrotasksScope::kDoNotRunMicrotasks);
//if (((enabled_bindings_ & BINDINGS_POLICY_MOJO_WEB_UI) ||
// enable_mojo_js_bindings_) &&
// IsMainFrame() && world_id == ISOLATED_WORLD_ID_GLOBAL) {
// // We only allow these bindings to be installed when creating the main
// // world context of the main frame.
// blink::WebV8Features::EnableMojoJS(context, true);
//}
if (IsMainFrame()) {
blink::WebV8Features::EnableMojoJS(context, true);
}
for (auto& observer : observers_)
observer.DidCreateScriptContext(context, world_id);
}
其他相关代码:
void RenderFrameHostImpl::EnableMojoJsBindings()
void RenderFrameImpl::EnableMojoJsBindings()
js要导出的接口在 src\third_party\blink\renderer\core\mojo\mojo.idl
里面定义的。
03 给扩展增加一些js接口
chrome/browser/resources/extensions/BUILD.gn
添加
excludes = [ "chrome://resources/js/cr.m.js",
"chrome://resources/mojo/mojo/public/js/bindings.js",
"chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js",
"chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom-lite.js",
"chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js",
"chrome://resources/mojo/mojo/public/mojom/base/text_direction.mojom-lite.js",
"chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js",
"chrome://resources/mojo/mojo/public/mojom/base/unguessable_token.mojom-lite.js",
"chrome://resources/mojo/skia/public/mojom/skcolor.mojom-lite.js",
"chrome://resources/mojo/skia/public/mojom/skcolor.mojom-webui.js",
"chrome://resources/mojo/url/mojom/origin.mojom-lite.js",
"chrome://resources/mojo/url/mojom/url.mojom-lite.js",
]
chrome/browser/resources/extensions/extensions.js
添加
import 'chrome://resources/mojo/mojo/public/js/bindings.js';
import 'chrome://resources/mojo/mojo/public/js/mojo_bindings_lite.js';
import 'chrome://resources/mojo/mojo/public/mojom/base/big_buffer.mojom-lite.js';
import 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-lite.js';
import 'chrome://resources/mojo/mojo/public/mojom/base/text_direction.mojom-lite.js';
import 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-lite.js';
import 'chrome://resources/mojo/skia/public/mojom/skcolor.mojom-lite.js';
import 'chrome://resources/mojo/url/mojom/url.mojom-lite.js';
添加如下内容后,可以看到chrome中,增加了 mojo
和 mojoBase
(小写的 mojo
)
参考
chrome sandbox escape case study and plaidctf2020 mojo writeup
chromium 添加 javascript 扩展 即 C++与javascript互操作
chrome sandbox escape case study and plaidctf2020 mojo writeup (推荐)