如何获取 JavaScript 变量的内存地址?

是否有可能找到一个 JavaScript 变量的内存地址?JavaScript 代码是一个普通应用程序的一部分(嵌入到) ,在这个应用程序中,JavaScript 被用作 C + + 的前端,并且不能在浏览器上运行。所使用的 JavaScript 实现是 SpiderMonkey。

57885 次浏览

如果可能的话,它将非常依赖于 javascript 引擎。更现代的 javascript 引擎使用一个即时编译器来编译他们的代码,并且扰乱它们的内部变量,这要么不利于性能,要么不利于稳定性。

如果引擎允许,为什么不创建一个函数调用接口到一些本机代码来交换变量的值呢?

这或多或少是不可能的—— Javascript 的求值策略是始终使用按值调用,但是对于 Objects (包括数组) ,传递的值是对 Object 的引用,它不会被复制或克隆。如果在函数中重新分配 Object 本身,原始对象将不会改变,但是如果重新分配 Object 的属性之一,将影响原始对象。

也就是说,你想达到什么目的?如果只是在 C + + 和 Javascript 之间传递复杂的数据,那么可以使用 JSON 库进行通信。发送一个 JSON 对象到 C + + 进行处理,并获取一个 JSON 对象来替换旧对象。

我觉得有可能,但你必须:

  1. 下载 node.js 源代码。
  2. 手动添加函数(如返回指针的内存地址等)
  3. 编译它并将其用作节点的可执行文件。

您可以使用 副频道,但是除了攻击浏览器安全之外,您不能使用它做任何有用的事情!

最接近虚拟地址的是 ArrayBuffers。

如果在 ArrayBuffer 中标识了一个虚拟地址, 其余的地址也称为两个地址 存储器和阵列索引是线性的。

尽管虚拟地址本身不是物理内存地址,但是有一些方法可以将虚拟地址转换为物理内存地址。

浏览器引擎总是分配 ArrayBuffers 页面 因此,ArrayBuffer 的第一个字节位于 开始一个新的物理页面,并且具有最不重要的 12位设置为“0”。

如果分配了大量的内存,浏览器引擎通常 使用 mmap 来分配这个内存,它被优化为 分配2 MB 透明巨型页面(THP)而不是4 KB 页数。

映射到这些物理页时 即,一旦首次访问该页面, 对数组索引进行迭代会导致 解决页面错误的时间为 明显高于正常的内存访问。因此,您可以知道新的2MB 页面从哪个索引开始。在 该数组索引时,基础物理页的最小值为21 设置为“0”的有效位。

这个答案不是试图提供一个概念的证明,因为我没有时间做这个,但我可能会在未来这样做。这个答案是试图为提出问题的人指出正确的方向。

消息来源,

Http://www.misc0110.net/files/jszero.pdf

Https://download.vusec.net/papers/anc_ndss17.pdf