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

IT技术 javascript spidermonkey memory-address
2021-03-13 15:38:57

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

4个回答

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

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

是的,我同意,认为需要一些可以与 JavaScript 交互的 C++ 代码。
2021-04-29 15:38:57

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

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

关于重新分配 Object 本身或属性的注意事项。你能以某种方式改变原始指向的对象吗?
2021-05-01 15:38:57
您的意思是,在不同范围内更改对象的引用?不会。这种情况最好利用JS的封装或者面向对象的便利,要么把你想改变的函数体和引用放在同一个作用域,要么把引用和函数成员放在同一个对象中.
2021-05-14 15:38:57

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

最接近虚拟地址的是 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

我认为这是可能的,但你必须:

  1. 下载 node.js 源代码。
  2. 手动添加您的函数(如返回指针的内存地址等)
  3. 编译它并将其用作节点可执行文件。
这是你的假设吗?
2021-05-14 15:38:57