You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于指针运算的_Is64BitOS函数工作原理及内存疑问

关于_Is64BitOS函数的工作机制与内存地址疑问解答

一、_Is64BitOS函数工作机制拆解

先看逆向得到的函数代码:

bool   _Is64BitOS(void) {
    unsigned int version = *(unsigned int*)0x7FFE026C;
    unsigned int address = version == 10 ? 0x7FFE0308 : 0x7FFE0300;
    ILog("Running %u-bit system\n", *(void**)address ? 32 : 64);

    return (*(void**)address ? false : true);
};

逐行解析逻辑:

  • 读取0x7FFE026C处的无符号整数:这个地址是32位进程中PEB(进程环境块)的固定偏移,存储Windows系统的主版本号(比如Win10对应十进制10,即十六进制0x0A)。
  • 根据系统版本选择目标地址:Win10用0x7FFE0308,其他旧版本(如Win7/8)用0x7FFE0300。这个地址指向PEB中的Wow64Process字段——该字段的作用是标记当前32位进程是否运行在64位系统的Wow64兼容层:
    • 若32位进程运行在64位系统,Wow64Process会被填充为非空指针(指向Wow64层的PEB结构);
    • 若当前是纯64位进程,或32位进程运行在32位系统,该字段为空。
  • 日志输出逻辑:判断目标地址的指针是否为空——非空则输出"32-bit"(表示当前是32位进程,或运行在Wow64层),为空则输出"64-bit"(表示当前是纯64位进程)。
  • 返回值逻辑:指针非空时返回false,为空时返回true。这里函数名_Is64BitOS的实际逻辑是:返回true表示当前进程是64位(间接说明系统是64位),返回false表示当前是32位进程(可能在32位或64位系统上)。

二、64位Windows下0x7FFE026C地址值为0x0A的原因

  • 0x7FFE026C是32位进程中PEB的固定偏移,PEB是Windows为每个进程维护的核心结构,存储进程与系统的关键元数据。Win10系统的主版本号是十进制10,对应十六进制0x0A,所以该地址处的值为0x0A。
  • 关于地址超出32位模块空间:32位进程的常规模块加载范围通常是0x00000000到0x7FFFFFFF,但0x7FFE0000起始的区域是系统预留的PEB/TEB(线程环境块)专用内存区,属于进程地址空间的高地址段,虽然不在模块加载的常规区域,但进程拥有访问权限,因此可以正常读取。它紧邻堆之前是因为堆的高地址通常落在0x7xxxxxxx区域,而PEB/TEB位于更高的0x7FFExxxx区域,位置上自然相邻。

内容的提问来源于stack exchange,提问作者Pulpo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:10:15