Delphi 读写注册表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi 读写注册表相关的知识,希望对你有一定的参考价值。

用Delphi 怎么创建删除 修改 注册表中的所有类型的值?假设我现在要在下 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft新建一个 new项,删除一个del项.新建一个字符串值 名称为 Str 值为abc新建一个dword值 名称为 Dwo 值为 cba新建一个二进制值 名称为 two 值为 acb请给出这个例子.当然最好用函数写,读写注册表,直接传参数.

给你几个函数,分别是读写字符串与二进制值:

在单元文件中加入Registry
//读取注册表 字符串
function FindRegKeyString(Param_RootKey:HKey;Param_CurrentKey,Param_KeyItem:String):String;
var
MyRegistry:TRegistry;
begin
MyRegistry:=TRegistry.Create;
with MyRegistry do
begin
RootKey:=Param_RootKey;
if OpenKey(Param_CurrentKey,False)=True then
begin
try
Result:=ReadString(Param_KeyItem);
except
Result:=\'\';
end;
CloseKey();
end
else
Result:=\'\';
Free;
end;
end;

//读取注册表,二进制
function FindRegKeyInteger(Param_RootKey:HKey;Param_CurrentKey,Param_KeyItem:String):Integer;
var
MyRegistry:TRegistry;
begin
MyRegistry:=TRegistry.Create;
with MyRegistry do
begin
RootKey:=Param_RootKey;
if OpenKey(Param_CurrentKey,False)=True then
begin
try
Result:=ReadInteger(Param_KeyItem);
except
Result:=0;
end;
CloseKey();
end
else
Result:=0;
Free;
end;
end;

//写进注册表,字符串
procedure WriteRegKeyString(Param_RootKey:HKey;Param_CurrentKey,Param_KeyItem,Param_KeyString:String);
var
MyRegistry:TRegistry;
begin
MyRegistry:=TRegistry.Create;
with MyRegistry do
begin
RootKey:=Param_RootKey;
if OpenKey(Param_CurrentKey,True)=True then
begin
try
WriteString(Param_KeyItem,Param_KeyString);
except
Application.Messagebox(MSG_REGWRITEERROR,MSG_ERROR,MB_ICONSTOP);
end;
CloseKey();
end
else
Application.Messagebox(MSG_REGWRITEERROR,MSG_ERROR,MB_ICONSTOP);
Free;
end;
end;
//写入注册表 二进制
procedure WriteRegKeyInteger(Param_RootKey:HKey;Param_CurrentKey,Param_KeyItem:String;Param_KeyInteger:Integer);
var
MyRegistry:TRegistry;
begin
MyRegistry:=TRegistry.Create;
with MyRegistry do
begin
RootKey:=Param_RootKey;
if OpenKey(Param_CurrentKey,True)=True then
begin
try
WriteInteger(Param_KeyItem,Param_KeyInteger);
except
Application.Messagebox(MSG_REGWRITEERROR,MSG_ERROR,MB_ICONSTOP);
end;
CloseKey();
end
else
Application.Messagebox(MSG_REGWRITEERROR,MSG_ERROR,MB_ICONSTOP);
Free;
end;
end;
参考技术A 你可以使用 REGISTRY的类 声明一个 TREGISTRY的对象 就可以使用函数了 DELPHI自身有支持注册表的类的

注册表与木马——注册表读写

 木马是什么?

    木马(网络程序) = 客户端程序(控制端) + 服务端(被控端)

    服务端程序开启远程后门

    客户端使用Telnet进行远程控制

    服务端程序需要在每次电脑开机时运行,这就需要在注册表中添加开机启动

   注册表:

               木马的自启动,在Windows启动时,自动加载。

      注册表编辑器 :  RegEdit (一个有关Windows的巨大的数据库)

         

    

      

    有关注册表关于开机启动的键值可以自行百度。(除了最基础的3种,其实expleror.exe这个进程所在的键值也是病毒木马经常用来实现自启动的位置)

    

  接下来是Windows关于注册表读写的方法

      注册表内部结构:

          Key -> subkey -> value -> 名称,类型,数据

      读写函数:

         RegCreateKey()           |      RegCreateKeyEx()

         RegOpenKey()    |   RegOpenKeyEx()

         RegQueryValue()   |   RegQueryValueEx()

         RegDeleteKey()     |    RegDeleteKeyEx()

         RegCloseKey()      |

                                                 (分为新旧两种)

   

 

   读取实例  读取CPU信息 :

 1 #include<stdio.h>
 2 #include<windows.h>
 3 #include<iostream>
 4 #include <tchar.h>
 5 using namespace std ;
 6 
 7 int main(){
 8     HKEY hkey ;
 9     TCHAR p[64] ;
10     long ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("HARDWARE\\\\DESCRIPTION\\\\System\\\\CentralProcessor\\\\0"),0,KEY_QUERY_VALUE,&hkey) ;
11     if(ret==ERROR_SUCCESS){
12         // 打开成功
13         cout << "Open  !" << endl ;
14         DWORD size = sizeof(p) ;
15         ret = RegQueryValueEx(hkey,_T("ProcessorNameString"),NULL,NULL,(LPBYTE)p,&size);
16         if(ret==ERROR_SUCCESS){
17             // 读取成功
18             cout << "Read  !" << endl ;
19             cout << p << endl;
20         }else {
21             cout << "Read error !" << endl ;
22         }
23     }else {
24         cout << "Open error !" << endl ;
25     }
26     return 0 ;
27 }

  运行结果:

 

    

  写入实例  :

  接上CPU信息读取方法,在同一 subkey 下写入键值 hello :  helloRegedit 

  代码如下:

 1 #include<stdio.h>
 2 #include<windows.h>
 3 #include<iostream>
 4 #include <tchar.h>
 5 using namespace std ;
 6 
 7 int main(){
 8     HKEY hkey ;
 9     TCHAR p[64] ;
10     long ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE,_T("HARDWARE\\\\DESCRIPTION\\\\System\\\\CentralProcessor\\\\0"),0,KEY_QUERY_VALUE,&hkey) ;
11     if(ret==ERROR_SUCCESS){
12         // 打开成功
13         cout << "Open  !" << endl ;
14         DWORD size = sizeof(p) ;
15         ret = RegQueryValueEx(hkey,_T("ProcessorNameString"),NULL,NULL,(LPBYTE)p,&size);
16         if(ret==ERROR_SUCCESS){
17             // 读取成功
18             cout << "Read  !" << endl ;
19             cout << p << endl;
20             ret = RegCreateKey(HKEY_LOCAL_MACHINE,_T("HARDWARE\\\\DESCRIPTION\\\\System\\\\CentralProcessor\\\\0"),&hkey);
21             if(ret==ERROR_SUCCESS){
22                 ret = RegSetValueEx(hkey,_T("hello"),0,REG_SZ,(const BYTE*)("helloRegedit"),12);
23                 if(ret==ERROR_SUCCESS){
24                     // 写入成功
25                     cout << "Write Ok !"
26                 }else {
27                     // 写入失败
28                     cout << "Write filed !"
29                 }
30             }
31         }else {
32             cout << "Read error !" << endl ;
33         }
34     }else {
35         cout << "Open error !" << endl ;
36     }
37     return 0 ;
38 }

运行结果:

 

 

 

 可以发现已经写入了注册表中,利用注册表的读写,可以使木马的自启动,隐藏用户等操作很容易实现

以上是关于Delphi 读写注册表的主要内容,如果未能解决你的问题,请参考以下文章

枚举delphi中的注册表子项

delphi 中 如何注册ocx文件

Delphi7装控件失败后打不开delphi7,怎么决解呢

delphi 获取本地IP地址的几种方法

delphi注册/反注册OCX

如何注册DELPHI3中的HTML.OCX控件?