一、注册表简介
windows的注册表主要存储了计算机的各种配置信息,包括各种软件安装信息,系统外观,系统软件运行等等。
注册表按层次结构来组织,由项、子项、配置单元和值项组成。
注册表中包括如下各项:
●HKEY_CURRENT_USER:包含当前登录用户的配置信息的根目录。用户文件夹、屏幕颜色和“控制面板”设置存储在此处。该信息被称为用户配置文件。
●HKEY_USERS:包含计算机上所有用户的配置文件的根目录。HKEY_CURRENT_USER是HKEY_USERS的子项。
●HKEY_LOCAL_MACHINE:包含针对该计算机(对于任何用户)的配置信息。
●HKEY_CLASSES_ROOT:是HKEY_LOCAL_MACHINE\Software的子项。此处存储的信息可以确保当使用Windows资源管理器打开文件时,将使用正确的应用程序打开对应的文件类型。
●HKEY_CURRENT_CONFIG:包含本地计算机在系统启动时所用的硬件配置文件信息。
二、程序思路
现在有个需求,需要通过程序实现检测系统注册表中,是否已经将相应的网站添加至信任站点并打开activex的功能。网页上通常JavaScript调用Shell实现,由于需要调用activex控件,所以如果未打开客户端IE中关于activex的限制,则会报出错误。
信任站点的注册表项如下
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range[*]
ActiveX的注册表项
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\[0-4]\[*]
-------------------------------------------------------------------------------------------------------------
[0-4]
值 设置
------------------------------
0 我的电脑
1 本地 Intranet 区域
2 受信任的站点区域
3 Internet 区域
4 受限制的站点区域
[*]
1001 下载已签名的 ActiveX 控件
1004 下载未签名的 ActiveX 控件
1200 运行 ActiveX 控件和插件
1201 对没有标记为安全的 ActiveX 控件进行初始化和脚本运行
1405 对标记为可安全执行脚本的 ActiveX 控件执行脚本
2201 ActiveX 控件自动提示 **
----------------------------------------------------------------------------------------
js中操纵注册表主要用到WScript.Shell
写操作RegWrite(注册表中项的路径,值,类型(例如REG_DWORD))
读操作RegRead(注册表中项的路径)
删除操作RegDelete(注册表中项的路径)
该程序主要用到的是读操作,具体的实现代码如下
function checkRegistry()
{
var text = "注册表导入失败,可能的原因有以下几种:\r\n\r\n"
+ "********************************************\r\n"
+ "* 1、您当前的用户不是管理员权限; *\r\n"
+ "* 2、您系统中的防火墙或杀毒软件阻止了修改;*\r\n"
+ "* 3、您的注册表已被锁定; *\r\n"
+ "* 请速与系统管理员联系! *\r\n"
+ "********************************************"
try
{
var WshShell = new ActiveXObject("WScript.Shell");
var ip1 = WshShell.RegRead("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Ranges\\Range9\\:Range");
var ip2 = WshShell.RegRead("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap\\Ranges\\Range19\\:Range");
if( ip1 != "XXXXXXX" || ip2 != "XXXXXXXXXXXX")
alert(text);
else
alert("Success!");
}
catch(e)
{
alert(text);
}
}
如果需要在桌面端实现该功能,能用到的语言就太多了。这里主要讲用一种独特的语言来实现,叫做AutoIt。安装之后就可以在它的IDE环境里开发了。代码如下
;打开注册表锁
Func EnableRegistry()
RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableRegistryTools", "REG_DWORD", "00000001")
$isLock = RegRead("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableRegistryTools")
If $isLock = 1 Then
RegDelete("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableRegistryTools")
EndIf
EndFunc ;==>EnableRegistry
;读取注册表键值
Func GetValueByKey($keyName, $valueName)
$key = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\"
$var = RegRead($key & $keyName, $valueName)
Return $var
EndFunc ;==>GetValueByKey
Func CheckRegistry()
$ip1 = GetValueByKey("ZoneMap\Ranges\Range19", ":Range")
$ip2 = GetValueByKey("ZoneMap\Ranges\Range9", ":Range")
$activeX1 = GetValueByKey("Zones\2", "1001")
$activeX2 = GetValueByKey("Zones\2", "1004")
$activeX3 = GetValueByKey("Zones\2", "1200")
$activeX4 = GetValueByKey("Zones\2", "1201")
$activeX5 = GetValueByKey("Zones\2", "1405")
$activeX6 = GetValueByKey("Zones\2", "2201")
If $ip1 = "XXXXXXXXXX" _
And $ip2 = "XXXXXXX" _
And $activeX1 = "0" _
And $activeX2 = "0" _
And $activeX3 = "0" _
And $activeX4 = "0" _
And $activeX5 = "0" _
And $activeX6 = "0" Then
Return 1
Else
Return 0
EndIf
EndFunc ;==>CheckRegistry
;主程序运行
Func Main()
If IsAdmin() Then
$title = "检测注册表";
$text = "注册表导入失败,可能的原因有以下几种: " _
& @LF & "1、您当前的用户权限不够 " _
& @LF & "2、您电脑中的杀毒软件阻止了修改 " _
& @LF & "3、您的注册表已锁定 " _
& @LF & "请速与系统管理员联系!"
EnableRegistry()
If CheckRegistry() = 0 Then
RegistryValue()
If CheckRegistry() = 0 Then
MsgBox(16, $title, $text)
EndIf
Else
MsgBox(64, $title, "注册表导入成功!")
EndIf
Else
MsgBox(16, $title, "您当前的用户权限不够,导致注册表导入失败")
EndIf
EndFunc ;==>Main
Main()
另外我还用汇编调用win32的dll实现了一个,用的编辑器是masm32,代码如下
; #########################################################################
.386
.model flat, stdcall
option casemap :none
; #########################################################################
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
include \masm32\include\advapi32.inc
includelib \masm32\lib\advapi32.lib
; #########################################################################
.data
szRegKey db "SOFTWARE\360safe\scan\",0
szRegValueKey db "SScanDate",0
.data?
szRegValue db 4 dup (?)
hKey dd ?
hValue dd ?
.code
start:
invoke RegOpenKeyEx,HKEY_LOCAL_MACHINE,offset szRegKey,NULL,\
KEY_QUERY_VALUE,addr hKey
.if eax == ERROR_SUCCESS
invoke RegQueryInfoKey,hKey,0,0,0,0,0,0,0,0,addr hValue,0,0
invoke RegQueryValueEx,hKey,addr szRegValueKey,0,0,addr szRegValue,addr hValue
invoke MessageBox,NULL,ADDR szRegValue,ADDR szRegValueKey,MB_OK+MB_ICONINFORMATION
.endif
invoke RegCloseKey,hKey
invoke ExitProcess,NULL
end start