是否可能查找JavaScript变量的内存地址?该JavaScript代码是嵌入到常规应用程序中,其中JavaScript用作C ++的前端,并且不在浏览器上运行。所使用的JavaScript实现是SpiderMonkey。
是否可能查找JavaScript变量的内存地址?该JavaScript代码是嵌入到常规应用程序中,其中JavaScript用作C ++的前端,并且不在浏览器上运行。所使用的JavaScript实现是SpiderMonkey。
在Javascript中,使用按值调用的评估策略几乎不可能。但是对于对象(包括数组),传递的值是指向对象的引用,该引用未被复制或克隆。如果您在函数中重新分配对象本身,则原始对象不会更改,但如果您重新分配对象的某个属性,则将影响原始对象。
话虽如此,您想要实现什么?如果只是在C++和Javascript之间传递复杂数据,可以使用JSON库进行通信。发送JSON对象以供C++处理,并获取JSON对象以替换旧对象。
你可以使用一个侧信道,但除了攻击浏览器安全性之外,它没有其他有用的功能!
最接近虚拟地址的是ArrayBuffers。
如果确定了ArrayBuffer内的一个虚拟地址, 剩余地址也已知,因为内存地址和数组索引都是线性的。
虚拟地址本身并不是物理内存地址,但有方法将虚拟地址转换为物理内存地址。
浏览器引擎总是按页对齐分配ArrayBuffers。因此,ArrayBuffer的第一个字节位于新物理页的开头,并且具有最不重要的12位设置为“0”。
如果分配了大块内存,浏览器引擎通常使用mmap来分配该内存,该内存被优化为分配2 MB的透明巨大页面(THP)而不是4 KB页面。
由于这些物理页面是按需映射的,即在第一次访问页面时立即进行映射, 迭代数组索引会导致在新页面开头发生页面错误。解决页面错误所需的时间显着高于正常内存访问。因此,您可以知道新2 MB页面开始的索引。在此数组索引处,底层物理页面的最低有效的21位设置为“0”。
这个答案并不是尝试提供一个概念证明,因为我没有这个时间,但我可能会在未来能够提供。这个答案是试图指向问问题的人正确的方向。
参考资料,
我认为这是可能的,但你需要: