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

84

是否可能查找JavaScript变量的内存地址?该JavaScript代码是嵌入到常规应用程序中,其中JavaScript用作C ++的前端,并且不在浏览器上运行。所使用的JavaScript实现是SpiderMonkey。


“嵌入到普通应用程序”是指您有一个嵌入了Javascript的网页吗? - Juliet
不,它不运行在浏览器上,也没有涉及到任何网页。JavaScript 引擎是普通桌面应用程序的一部分。 - vivekian2
4个回答

26
如果有可能的话,这将非常依赖于JavaScript引擎。较现代的JavaScript引擎使用即时编译器编译其代码,对其内部变量进行干扰会导致性能或稳定性问题。
如果引擎允许,为什么不创建一个函数调用接口来交换变量的值呢?

1
是的,我同意,我认为需要一些C++代码来与JavaScript进行接口。 - vivekian2

15

在Javascript中,使用按值调用的评估策略几乎不可能。但是对于对象(包括数组),传递的值是指向对象的引用,该引用未被复制或克隆。如果您在函数中重新分配对象本身,则原始对象不会更改,但如果您重新分配对象的某个属性,则将影响原始对象。

话虽如此,您想要实现什么?如果只是在C++和Javascript之间传递复杂数据,可以使用JSON库进行通信。发送JSON对象以供C++处理,并获取JSON对象以替换旧对象。


关于重新分配对象本身或属性的注意事项非常重要。您是否可以以某种方式更改原始指向的对象? - Qwerty
1
你的意思是在不同的作用域内更改对象的引用吗?不是的。在这种情况下,最好利用JS的封装或面向对象的功能,将函数体和要更改的引用放在同一作用域中,或者将引用和函数成员放在同一个对象中。 - user2310967

4

你可以使用一个侧信道,但除了攻击浏览器安全性之外,它没有其他有用的功能!

最接近虚拟地址的是ArrayBuffers。

如果确定了ArrayBuffer内的一个虚拟地址, 剩余地址也已知,因为内存地址和数组索引都是线性的。

虚拟地址本身并不是物理内存地址,但有方法将虚拟地址转换为物理内存地址。

浏览器引擎总是按页对齐分配ArrayBuffers。因此,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


0

我认为这是可能的,但你需要:

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

4
这是你的假设吗? - aashir khan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接