缘起
曾经在 2022
年分析过一个崩溃转储,文章在这里。在那个案例中,堆空间大小将近 4GB
。根据上次的结论,这应该是一个运行在 64
位系统下的 32
位进程崩溃产生的转储文件。这让我有了一个疑问?怎么从进程转储文件中得知进程是 32
位的还是 64
位的?如果是 32
位进程,怎么判断是运行在 32
位系统上还是运行在 64
位系统上呢?
说明:
64
位进程只能运行在64
位系统下,不能运行在32
位系统下。如果进程是64
位的,那么系统一定是64
位的。
判断进程位数
判断进程是 32
位进程还是 64
位进程比较简单。通过很多地方都可以判断。
根据寄存器进行判断。
运行在
32
位系统上的进程,并没有用到gs
寄存器,gs
的值一般为0
。如果
gs
的值不是0
,说明是32
位进程运行在64
位系统上或者是64
位进程运行在64
位系统上。具体是
32
位进程还是64
位进程,可以通过r
命令查看寄存器进行判断,如果是32
位寄存器(Exx
),说明是32
位进程。如果是64
位寄存器(Rxx
),说明是64
位进程。使用
!dh
命令查看模块的文件头信息,如果显示了14C machine (i386)
或者characteristic
下显示了32 bit word machine
说明是32
位进程。如果显示了8664 machine (X64)
说明是64
位进程。说明:
!dh
的输出很长,可以用如下命令过滤.shell -ci "!dh -f module_name" findstr "machine"
。
使用
lm
命令查看模块,如果模块中有wow64cpu, wow64win, wow64
中的一个,说明是32
位进程运行在64
位系统下。如果不包含,或者是
32
位进程运行在32
位系统上,或者是64
位进程运行在64
位系统上。具体是哪种情况,可以通过查看寄存器位数进行判断。
说明: 如果是
32
位进程运行在64
位系统上,4
和5
有可能不准确。
判断系统位数
如果进程是 64
位的,其运行的系统一定是 64
位的。如果进程是 32
位的,其运行的系统可能是 32
位的,也可能是 64
位的。如果进程是 32
位的,有可能运行在 32
位系统上,也有可能运行在 64
位系统上。接下来只关心 32
位进程是否运行在 64
位系统上的情况。
通过
!peb
命令查看环境变量进行判断如果环境变量名包含
PROCESSOR_ARCHITEW6432
,说明是32
位进程运行在64
系统上。如果环境变量名以
W6432
结尾(例如,CommonProgramW6432
,PROCESSOR_ARCHITEW6432
,ProgramW6432
等)或者名字中包含(x86)
(例如,CommonProgramFiles(x86)
,ProgramFiles(x86)
等)说明是64
位系统。
通过
lm
查看模块进行判断如果包含
wow64, wow64cpu, wow64win, wowcon, wow64base
中的一个模块,说明是32
位进程运行在64
系统上。
通过
gs
寄存器判断运行在
32
位系统上的进程,并没有用到gs
寄存器,gs
的值一般为0
。如果gs
的值不是0
,说明64
位系统。
通过
wow64exts
进行判断使用
.load wow64exts
加载模块,然后执行!info
命令进程查看。如果Guest (WoW) PEB:
或者Guest (WoW) TEB:
不是0
,说明是32
位进程运行在64
位系统上。
你还知道哪些判断方法呢?欢迎分享。