问题标签 [virtualquery]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 有没有比解析 /proc/self/maps 更好的方法来找出内存保护?
在 Linux(或 Solaris)上,有没有比/proc/self/maps
反复手动解析更好的方法来确定您是否可以读取、写入或执行存储在内存中一个或多个地址的任何内容?
例如,在 Windows 中,您有VirtualQuery
.
在 Linux 中,我可以mprotect
更改这些值,但我无法将它们读回。
此外,除了做一些非常侵入性的事情并在进程中的所有线程上使用并拦截任何可能影响内存的尝试之外,还有什么方法可以知道这些权限何时更改(例如,当有人mmap
在我背后使用文件时)地图?ptrace
syscall
更新:
不幸的是,我在 JIT 内部使用了它,它几乎没有关于它正在执行的代码的信息来获得常量的近似值。是的,我意识到我可以拥有可变数据的常量映射,例如 Linux 使用的 vsyscall 页面。我可以放心地假设初始解析中未包含的任何内容都是可变且危险的,但我对该选项并不完全满意。
现在我要做的是阅读/proc/self/maps
并构建一个结构,我可以通过二进制搜索来获得给定地址的保护。任何时候我需要了解一个不在我的结构中的页面,我会重新阅读 /proc/self/maps 假设它已经被同时添加,否则我将要进行段错误。
似乎解析文本以获取此信息并且不知道它何时更改是非常笨拙的。(/dev/inotify
几乎对任何东西都不起作用/proc
)
virtualquery - VirtualQuery 给出非法结果。它是一个错误吗?
我的代码:
结果:
笔记:
(1) AllocationBase 为 NULL 而 BaseAddress 不为 NULL
(2) AllocationProtect 为 0(不是保护值)
它是 VirtualQuery 的错误吗?
c++ - Win API VirtualQueryEx 函数,ERROR_BAD_LENGTH
嗨,我尝试调用 VirtualQueryEx 函数来获取有关内存保护的一些信息,但是我的代码给了我错误 0x18 (ERROR_BAD_LENGTH),我不知道我的代码有什么问题;
代码片段:
PMEMORY_BASIC_INFORMATION 替代;
VirtualQueryEx(进程句柄,(LPVOID)(地址),alte,sizeof(PMEMORY_BASIC_INFORMATION));
感谢您的帮助
c++ - VirtualProtect 是否需要页面开头的地址?
我需要使用 VirtualProtect,我的问题是关于传递给函数的区域地址。它说(在 MSDN 上)“描述起始页面的地址”,它必须是页面开头的地址还是该页面中的任何地址?也就是说,我应该先用VirtualQuery来确定页面的起始地址吗?
c++ - 扫描进程内存导致崩溃
我已将我的 DLL 注入进程,我尝试扫描内存以查找与我的值相同的地址,但在我获得第一个地址后它导致崩溃,它应该是 10 个地址
我相信我的保护检查是错误的,但不太确定。
windows - BaseAddress 和 AllocationBase 以及 _MEMORY_BASIC_INFORMATION 结构中的 AllocationProtect 和 Protect 有什么区别?
_MEMORY_BASIC_INFORMATION
包含描述地址空间的字段。BaseAddress
我想知道和 A 有什么区别llocationBase
。 BaseAddress
是区域的基地址,什么是AllocationBase
?
AllocationProtect
另外,我想知道和之间的区别Protect
。我有点明白,但不确定,我认为AllocationProtect
是我们保留区域时的保护属性,并且是我们使用参数Protect
调用时的保护属性。如果是这样,当我们只保留区域时,字段是什么?VirtualAlloc
MEM_COMMIT
Protect
windows - 不同区域有相同的分配地址
我检查了 Windows 7 中进程的地址空间。我使用VirtualQueryEx
函数,这是我的示例的一部分,handleOfProcess_
某些进程的句柄在哪里:
当我进行调试时,我看到0x00020000AllocationBase
是0x00020000,而0x00021000是0x00000000 ,这是另一个区域的。Allocationbase
allocationBase
怎么会发生?
谢谢大家。
windows - 为什么不能从具有 PAGE_GUARD 保护的块中读取数据?
我使用 ReadProcessMemory 函数从地址空间读取数据。我尝试从所有具有 MEM_PRIVATE 类型的块中读取。但是当该块具有 PAGE_GUARD 保护时,我得到错误(函数返回 0),为什么?
谢谢大家。
android - VirtualQueryEx 返回完整的 000000000 数组
我很难在进程的内存中搜索一个值(以及值模式)。这个进程是一个“VBoxHeadless”进程(就像一个普通的 VM 进程,但没有 GUI 可以在需要时远程运行)。它由 Android 模拟器 Andy 创建。
我可以从这个过程中得到一个句柄,但是当使用 VirtualQueryEx 时,我唯一得到的是一个长度合适但只包含“00000000000”值的数组。
我尝试了不同的方法来访问这些信息,但结果是一样的。
任何想法?
c++ - 无法在 VirtualQuery 返回的空闲区域上进行 VirtualAlloc
我试图在 Windows 应用程序中加载的 DLL 中的某个内存范围内分配一定数量的内存。
我这样做的方式是使用VirtualQuery()
搜索标记为空闲并且在我需要进行分配的边界内的内存区域。我所看到的是,即使该区域被标记为MEM_FREE
VirtualAlloc()
有时无法分配内存。
代码非常接近以下内容:
VirtualAlloc()
失败时GetLastError()
返回ERROR_INVALID_ADDRESS
(487).
我解决它的方法是,如果它足够大,则mbi.RegionSize
使用页面大小步骤扫描以找到一个地址,该地址将允许我分配我需要的内存。
为什么根据VirtualQuery
整个区域应该是免费的,我应该能够在我想要的任何地址内分配,但通常当第一次VirtualAlloc
失败时,我必须循环几个步骤,直到它最终成功。