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

Posted

技术标签:

【中文标题】如何获取 JavaScript 变量的内存地址?【英文标题】:How can I get the memory address of a JavaScript variable? 【发布时间】:2010-10-12 23:25:29 【问题描述】:

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

【问题讨论】:

“嵌入到普通应用程序中”是指您有一个嵌入了 Javascript 的网页吗? 不,它不在浏览器上运行,不涉及网页。 JavaScript 引擎是普通桌面应用程序的一部分。 【参考方案1】:

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

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

【讨论】:

是的,我同意,认为需要有一些可以与 JavaScript 交互的 C++ 代码。【参考方案2】:

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

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

【讨论】:

关于重新分配对象本身或属性的重要说明。你能以某种方式改变原来指向的对象吗? 你的意思是,在不同的范围内改变一个对象的引用?不可以。在这种情况下,最好利用 JS 的封装或面向对象的工具,或者将要更改的函数体和引用放在同一范围内,或者将引用和函数成员放在同一个对象中.【参考方案3】:

您可以使用 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

【讨论】:

【参考方案4】:

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

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

【讨论】:

这是你的假设吗?

以上是关于如何获取 JavaScript 变量的内存地址?的主要内容,如果未能解决你的问题,请参考以下文章

基础知识 JavaScript

在Postman中如何获取环境变量?

关于JS获取IP的写法!

VS2010如何查变量内存地址

WebAssembly:从 JavaScript 中的参数(带有内存地址)获取字符串的正确方法

Golang channel 的基本使用方法