在现有Windows可执行文件中存放自定义变量的方案咨询
固定地址自定义变量的存储方案(Windows应用修改场景)
针对你需要跨子程序访问的固定地址自定义变量,以下是几种可行的存储方案,各有优劣:
1. 代码洞穴内直接存储(你考虑的方案)
这个方案完全合理,是修改现有程序时的常规操作。代码洞穴默认权限一般是PAGE_EXECUTE_READ(仅允许执行和读取),所以确实需要调用VirtualProtect将目标区域权限改为PAGE_EXECUTE_READWRITE或PAGE_READWRITE,才能写入变量。
操作要点:
- 确认代码洞穴有足够空闲空间(变量大小+内存对齐需求,比如4字节或8字节对齐)
- 调用
VirtualProtect时,仅修改变量所在的小范围内存权限,不要扩大到整个洞穴(减少风险) - 如果变量是长期存储,保持读写权限即可,不会影响洞穴内代码的执行
2. 手动分配进程内固定地址内存
通过VirtualAlloc(内部修改场景)或VirtualAllocEx(外部注入场景)指定固定地址来分配内存:
LPVOID varAddr = (LPVOID)0x70000000; // 选定的固定高地址 SIZE_T varSize = sizeof(你的变量类型); VirtualAlloc(varAddr, varSize, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
这种方案的优势是变量存储区和代码洞穴完全分离,不需要修改洞穴的权限。但要注意:
- 提前用
VirtualQuery检查目标地址是否已被原程序映射,避免地址冲突 - 优先选择高地址区域(比如0x70000000以上),这类地址被原程序占用的概率更低
3. 利用原程序的全局变量段空闲空间
分析目标程序的PE结构,找到.data或.bss段的未使用区域(比如段末尾的空白空间):
.data段本身就是读写权限,不需要修改权限.bss段是未初始化的全局变量区域,同样自带读写权限- 可以用x64dbg、PEview等工具查看段的起始地址、大小,计算出空闲空间的地址
这个方案的好处是完全贴合原程序的内存布局,不需要额外修改权限,但需要你对PE结构有一定了解,且要确保所选空间未被原程序使用。
总结
如果你的代码洞穴有足够空闲空间,第一种方案是最直接的,VirtualProtect是Windows下合法且常规的内存操作,不存在不合理的问题。如果想避免修改代码洞穴的权限,手动分配固定地址内存或利用原程序的全局变量段空闲空间是更稳妥的选择。
内容的提问来源于stack exchange,提问作者teslasystems
相关产品推荐
相关产品推荐

