是否可以找到 JavaScript 变量的内存地址?JavaScript 代码是(嵌入到)普通应用程序的一部分,其中 JavaScript 用作 C++ 的前端并且不在浏览器上运行。使用的 JavaScript 实现是 SpiderMonkey。
如何获取 JavaScript 变量的内存地址?
如果可能的话,它将非常依赖于 javascript 引擎。更现代的 javascript 引擎使用即时编译器编译他们的代码,并且弄乱他们的内部变量要么对性能不利,要么对稳定性不利。
如果引擎允许,为什么不为一些本机代码创建一个函数调用接口来交换变量的值?
这或多或少是不可能的 - Javascript 的评估策略是始终使用按值调用,但在对象(包括数组)的情况下,传递的值是对对象的引用,不会被复制或克隆。如果您在函数中重新分配对象本身,则不会更改原始对象,但是如果您重新分配对象的属性之一,则会影响原始对象。
也就是说,你想完成什么?如果只是在 C++ 和 Javascript 之间传递复杂数据,则可以使用 JSON 库进行通信。发送一个 JSON 对象给 C++ 进行处理,并得到一个 JSON 对象来替换旧的。
您可以使用side-channel,但除了攻击浏览器安全性之外,您不能用它做任何有用的事情!
最接近虚拟地址的是 ArrayBuffers。
如果确定了 ArrayBuffer 中的一个虚拟地址,则其余地址也是已知的,因为内存地址和数组索引都是线性的。
虽然虚拟地址本身并不是物理内存地址,但是有一些方法可以将虚拟地址转换为物理内存地址。
浏览器引擎分配 ArrayBuffers 总是页面对齐。因此,ArrayBuffer 的第一个字节位于新物理页的开头,并且将最低有效 12 位设置为“0”。
如果分配了大块内存,浏览器引擎通常使用 mmap 来分配此内存,该内存经过优化以分配 2 MB 透明大页面 (THP),而不是 4 KB 页面。
由于这些物理页面是按需映射的,即一旦第一次访问该页面,遍历数组索引就会导致新页面开始时出现页面错误。解决页面错误的时间明显高于正常的内存访问。因此,您可以知道新的 2 MB 页面开始的索引。在此数组索引处,底层物理页的 21 个最低有效位设置为“0”。
这个答案不是试图提供概念证明,因为我没有时间这样做,但我将来可能会这样做。这个答案试图为提出问题的人指出正确的方向。
消息来源,
我认为这是可能的,但你必须:
- 下载 node.js 源代码。
- 手动添加您的函数(如返回指针的内存地址等)
- 编译它并将其用作节点可执行文件。