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

时间:2009-03-12 16:53:04

标签: javascript spidermonkey memory-address

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

4 个答案:

答案 0 :(得分:15)

如果可能的话,它将非常依赖于javascript引擎。更现代的javascript引擎使用及时编译器编译他们的代码并且弄乱他们的内部变量会对性能有害,或者对稳定性有害。

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

答案 1 :(得分:9)

或多或少不可能 - Javascript的评估策略是始终使用按值调用,但在对象(包括数组)的情况下,传递的值是对Object的引用,不会复制或克隆。如果在函数中重新分配对象本身,则不会更改原始对象,但如果重新分配对象的某个属性,则会影响原始对象。

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

答案 2 :(得分:0)

我认为有可能,但是您必须:

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

答案 3 :(得分:0)

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

最接近虚拟地址的是 ArrayBuffers。

如果 ArrayBuffer 中的一个虚拟地址被识别, 其余地址也是已知的,因为这两个地址 内存和数组索引是线性的。

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

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

如果分配了大块内存,浏览器引擎通常 使用 mmap 分配此内存,优化为 分配 2 MB 透明大页面 (THP) 而不是 4 KB 页。

由于这些物理页面被映射到 需求,即第一次访问页面时, 迭代数组索引会导致页面错误 新页面的开始。解决页面错误的时间是 显着高于正常的内存访问。因此,您可以知道新的 2 MB 页面开始的索引。在 这个数组索引,底层物理页最少有21个 有效位设置为“0”。

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

来源,

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

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