欢迎各位兄弟 发布技术文章
这里的技术是共享的
在Windows注册表中,HKLM\SOFTWARE 和 HKLM\SOFTWARE\Wow6432Node 的区别主要在于32位和64位应用程序的注册表重定向。
HKLM\SOFTWARE:在64位Windows系统中,64位应用程序的注册表项存储在此处。32位应用程序的注册表项也会有一部分存储在这里,但为了兼容性,32位应用程序的注册表项会被重定向到Wow6432Node。
HKLM\SOFTWARE\Wow6432Node:这是为了在64位系统上运行32位应用程序而设计的。当32位应用程序尝试访问HKLM\SOFTWARE时,系统会将其重定向到HKLM\SOFTWARE\Wow6432Node。这样,32位应用程序就可以在不修改代码的情况下在64位系统上运行,并且与64位应用程序的注册表设置隔离开。
因此,如果一个应用程序是32位的,那么它通常会将注册表信息存储在HKLM\SOFTWARE\Wow6432Node下。而64位应用程序则直接存储在HKLM\SOFTWARE下。
在查询亚信安全软件的注册表信息时,我们需要同时检查这两个位置,因为不确定它安装的是32位还是64位版本。通常,如果安装在“C:\Program Files (x86)”目录下,那么它很可能是32位应用程序,因此其注册表信息可能存储在Wow6432Node下。但是,有些应用程序可能会同时在两个位置存储信息,或者根据安装方式不同而不同。
所以,在编写脚本时,我们应该同时检查这两个注册表路径,以确保能够获取到病毒码版本信息。
这两个注册表路径是Windows注册表在64位系统中的重要区分,主要区别如下:
| 特征 | HKLM\SOFTWARE | HKLM\SOFTWARE\Wow6432Node |
|---|---|---|
| 目标应用 | 64位应用程序 | 32位应用程序 |
| 物理位置 | 真实64位注册表 | 32位注册表重定向区域 |
| 系统类型 | 64位和32位系统都存在 | 仅在64位系统中存在 |
| 访问方式 | 64位进程直接访问 | 32位进程访问SOFTWARE时重定向至此 |
64位Windows系统需要同时支持64位和32位应用程序
为了防止冲突,32位应用程序的注册表被重定向到Wow6432Node
Wow6432 = Windows on Windows 64-32(在64位Windows上运行32位Windows程序)
32位进程访问注册表时:
应用程序请求: HKLM\SOFTWARE\MyApp 实际被重定向到: HKLM\SOFTWARE\Wow6432Node\MyApp
64位进程访问注册表时:
应用程序请求: HKLM\SOFTWARE\MyApp 实际访问: HKLM\SOFTWARE\MyApp(不重定向)
假设安装了两个版本的软件:
# 64位应用程序的注册表位置 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\MyApp64 # 32位应用程序的注册表位置 HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\MyApp32
由于亚信安装在 C:\Program Files (x86)(32位程序目录),因此注册表信息很可能在 Wow6432Node 中:
@echo off echo 查询亚信安全软件注册表信息... echo. :: 优先检查Wow6432Node(因为是32位程序) echo [1. 检查32位注册表区域] reg query "HKLM\SOFTWARE\Wow6432Node\Asiainfo Security" /s 2>nul if %errorlevel% equ 0 ( echo 在Wow6432Node中找到亚信注册表信息 ) else ( echo 未在Wow6432Node中找到信息 ) echo. echo [2. 检查64位注册表区域] reg query "HKLM\SOFTWARE\Asiainfo Security" /s 2>nul if %errorlevel% equ 0 ( echo 在SOFTWARE中找到亚信注册表信息 ) else ( echo 未在SOFTWARE中找到信息 ) :: 专门查询病毒码版本 echo. echo [3. 查询病毒码版本] for /f "tokens=2,*" %%i in ('reg query "HKLM\SOFTWARE\Wow6432Node\Asiainfo Security\Update" /v "EngineVersion" 2^>nul') do ( echo 病毒码版本(32位): %%j ) for /f "tokens=2,*" %%i in ('reg query "HKLM\SOFTWARE\Asiainfo Security\Update" /v "EngineVersion" 2^>nul') do ( echo 病毒码版本(64位): %%j )
@echo off echo 检测亚信安全软件的注册表位置... echo. set "APP_NAME=Asiainfo Security" set "FOUND=0" echo 检查可能的注册表路径: :: 检查32位区域 reg query "HKLM\SOFTWARE\Wow6432Node\%APP_NAME%" >nul 2>&1 if %errorlevel% equ 0 ( echo ✓ 找到 32位 注册表: HKLM\SOFTWARE\Wow6432Node\%APP_NAME% set "FOUND=1" ) else ( echo ✗ 未找到 32位 注册表 ) :: 检查64位区域 reg query "HKLM\SOFTWARE\%APP_NAME%" >nul 2>&1 if %errorlevel% equ 0 ( echo ✓ 找到 64位 注册表: HKLM\SOFTWARE\%APP_NAME% set "FOUND=1" ) else ( echo ✗ 未找到 64位 注册表 ) :: 如果没有找到,尝试其他可能的名称 if %FOUND% equ 0 ( echo. echo 尝试其他可能的名称... for %%a in (AhnLab "Ahn Lab" Asiainfo "Asia Info") do ( reg query "HKLM\SOFTWARE\Wow6432Node\%%a" >nul 2>&1 if !errorlevel! equ 0 echo 可能的相关注册表: HKLM\SOFTWARE\Wow6432Node\%%a reg query "HKLM\SOFTWARE\%%a" >nul 2>&1 if !errorlevel! equ 0 echo 可能的相关注册表: HKLM\SOFTWARE\%%a ) ) echo. pause
32位程序 → 优先检查 HKLM\SOFTWARE\Wow6432Node
64位程序 → 优先检查 HKLM\SOFTWARE
不确定时 → 两个位置都检查
亚信安全软件(安装在Program Files (x86))→ 极大概率在 Wow6432Node 中
这就是为什么在查询亚信病毒码版本时,需要同时检查两个注册表路径的原因。