木马编程DIY之注册表管理

.





九九重阳了,再发篇文章,意思意思..........



木马编程DIY之注册表管理 文/图 冷风

前几期分别讨论了,系统服务,文件传输,网络文本语音和其它方面的内容,现在我们来讨论在木马中注册表的实现,就我自己感觉在木马中对注册表的使用并不多,写其它程序时反倒用的不少.不过注册表还是比较重要的学会它不会吃亏呵呵,我们自己实现的效果如图所示

木马编程DIY之注册表管理

木马编程DIY之注册表管理一些基础
木马编程DIY之注册表管理
木马编程DIY之注册表管理开始前先了解一些基础知识,对后面的工作会方便不少,其码不会出现散晕的现像,对注册表的历史也就不再说了有兴趣可以
木马编程DIY之注册表管理查查新华字典呵呵.注册表的组织方式跟文件目录比较相似,主要分为跟键,子键,键值项三部分跟文件目录对应的话就是
木马编程DIY之注册表管理跟目录,子目录,和文件.分别介绍一下,跟键为分5个分别为HKEY_CLASSES_ROOT,HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE
木马编程DIY之注册表管理HKEY_USERS,HKEY_CURRENT_CONFIG把它们理解成磁盘的五个分区可以了,子键可以有多个子键和键值项,就像一个目录中可
木马编程DIY之注册表管理以有多个子目录和多个文件一样,而键值项可以理解为文件它由三部分组成,分别为名称,类型,数据.类型又分为多种主要
木马编程DIY之注册表管理包括如下:
木马编程DIY之注册表管理
木马编程DIY之注册表管理REG_BINARY二进制数据
木马编程DIY之注册表管理
木马编程DIY之注册表管理REG_DWORD32位双字节数据
木马编程DIY之注册表管理
木马编程DIY之注册表管理REG_SZ以0结尾的字符串
木马编程DIY之注册表管理
木马编程DIY之注册表管理REG_DWORD_BIG_ENDIAN高位排在底位的双字
木马编程DIY之注册表管理
木马编程DIY之注册表管理REG_EXPAND_SZ扩展字符串,可以加入变量如
%PATH%
木马编程DIY之注册表管理
木马编程DIY之注册表管理REG_LINKUNICODE符号链接
木马编程DIY之注册表管理
木马编程DIY之注册表管理REG_RESOURCE_LIST设备驱动程序资源列表
木马编程DIY之注册表管理
木马编程DIY之注册表管理REG_MULTI_SZ多字符串
木马编程DIY之注册表管理
木马编程DIY之注册表管理注册表数据项的数据类型有8种但最常用的主要是前3种而以,有了这些基础下面我们讨论如何编程实现对注册表的操作
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理打开
/关闭注册表句柄
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理在对注册表操作前应该先打开指定的键,然后通过键的句柄进行操作,打开键句柄可以用APIRegOpenKeyEx来实现其原形如下
木马编程DIY之注册表管理
木马编程DIY之注册表管理RegOpenKeyEx(
木马编程DIY之注册表管理hKey,
//父键句柄
木马编程DIY之注册表管理
lpSubKey,//子键句柄
木马编程DIY之注册表管理
dwOptions,//系统保留,指定为0
木马编程DIY之注册表管理
samDesired,//打开权限
木马编程DIY之注册表管理
phkResult,//返回打开句柄
木马编程DIY之注册表管理
)
木马编程DIY之注册表管理
木马编程DIY之注册表管理其中打开权限有多种想方便的话可以指定为KEY_ALL_ACCESS这样什么权限都有了,当函数执行成功时返回ERROR_SUCCESS
木马编程DIY之注册表管理
木马编程DIY之注册表管理其实例代码如下:
木马编程DIY之注册表管理
木马编程DIY之注册表管理HKEYkey;
木马编程DIY之注册表管理LPCTSTRdata
="SOFTWARE/Microsoft/Windows/CurrentVersion/Run";
木马编程DIY之注册表管理
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,data,0,KEY_ALL_ACCESS,&key)==ERROR_SUCCESS)
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理木马编程DIY之注册表管理
/**//*需要执行的操作...*/
木马编程DIY之注册表管理}

木马编程DIY之注册表管理::RegCloseKey(key);
木马编程DIY之注册表管理要注意的是在使用后应该调用RegCloseKey();函数为关闭句柄.
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理木马编程DIY之注册表管理文
/图冷风
木马编程DIY之注册表管理获取子键
/键值信息
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理在现实的编程操作中我们常常需要获取子键
/键值的信息比如:子键/键值的数量,长度,以及数据的最大长度等等这些信息可以
木马编程DIY之注册表管理通过RegQueryInfoKey函数来获取
木马编程DIY之注册表管理
木马编程DIY之注册表管理它的原型如下:
木马编程DIY之注册表管理
木马编程DIY之注册表管理RegQueryInfoKey(
木马编程DIY之注册表管理hkey,
//要获取信息的句柄
木马编程DIY之注册表管理
lpClass,//接受创建健时的Class字符串
木马编程DIY之注册表管理
lpcbClass,//lpClass的长度
木马编程DIY之注册表管理
lpReserved,//系统保留,指定为0
木马编程DIY之注册表管理
lpcSubKeys,//子键数量
木马编程DIY之注册表管理
lpcbMaxSubKeyLen,//子键中最长名称的长度
木马编程DIY之注册表管理
lpcbMaxClassLen,//子键中最长Class字符串长度
木马编程DIY之注册表管理

木马编程DIY之注册表管理lpcVlaues,
//键值数量
木马编程DIY之注册表管理
lpcbMaxValueNameLen,//键值项中最长名称的长度
木马编程DIY之注册表管理
lpcbMaxValueLen,//键值项数据最大长度
木马编程DIY之注册表管理
lpcbSecurityDescriptor,//安全描述符长度
木马编程DIY之注册表管理
lpftLastWriteTime,//FILETIME结构,最后修改时间
木马编程DIY之注册表管理
)
木马编程DIY之注册表管理哈哈是不是挺吓人的
?其实看实际情况接受自己需要的就好了,不需要的可以放个NULL就OK了,还有一点需要注意就是它所返回
木马编程DIY之注册表管理的长度都不包括结尾的0字符,所以在使用时应该用长度
+1
木马编程DIY之注册表管理
木马编程DIY之注册表管理其实例代码如下
木马编程DIY之注册表管理
木马编程DIY之注册表管理DWORDdwIndex
=0,NameSize,NameCnt,NameMaxLen,Type;
木马编程DIY之注册表管理DWORDKeySize,KeyCnt,KeyMaxLen,DateSize,MaxDateLen;
木马编程DIY之注册表管理
木马编程DIY之注册表管理
if(RegQueryInfoKey(key,NULL,NULL,NULL,&KeyCnt,&KeyMaxLen,NULL,&NameCnt,&NameMaxLen,&MaxDateLen,NULL,NULL)!=ERROR_SUCCESS)
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理printf(
"RegQueryInfoKey错误");
木马编程DIY之注册表管理
return;
木马编程DIY之注册表管理}

木马编程DIY之注册表管理
木马编程DIY之注册表管理用的时候套用格式就成了,不然会很麻烦的.....有了这些信息我们就可以枚举子键和键值的信息了
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理枚举子键信息
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理枚举子键可以用API函数RegEnumKeyEx来实现调用RegEnumKeyEx时将返回子键的名称,长度和一些相关数据,如果想得到一个
木马编程DIY之注册表管理键下的全部子键的话应该循环调用,直到返回ERROR_NO_MORE_ITEMS为至,就说明以枚举完了所有数据其函数原型如下
木马编程DIY之注册表管理
木马编程DIY之注册表管理RegEnumKeyEx(
木马编程DIY之注册表管理hkey,
//被枚举的键句柄
木马编程DIY之注册表管理
dwIndex,//子键索引编号
木马编程DIY之注册表管理
lpName,//子键名称
木马编程DIY之注册表管理
lpcbName,//子键名称长度
木马编程DIY之注册表管理
lpReserved,//系统保留,指定为0
木马编程DIY之注册表管理
lpClass,//子键类名
木马编程DIY之注册表管理
lpcbClass,//子键类名长度
木马编程DIY之注册表管理
lpftLastWriteTime//最后写入时间
木马编程DIY之注册表管理
)
木马编程DIY之注册表管理因为在之前我们以通过RegQueryInfoKey函数获取了键的有关数据,所以在这里不再跟据ERROR_NO_MORE_ITEMS来实现了
木马编程DIY之注册表管理
木马编程DIY之注册表管理其实现代码如下:
木马编程DIY之注册表管理
木马编程DIY之注册表管理
for(dwIndex=0;dwIndex<KeyCnt;dwIndex++)//枚举子键
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理KeySize
=KeyMaxLen+1;//因为RegQueryInfoKey得到的长度不包括0结束字符,所以应加1
木马编程DIY之注册表管理
szKeyName=(char*)malloc(KeySize);
木马编程DIY之注册表管理木马编程DIY之注册表管理
/**//*参数定义请参照获取子键/键值信息部分...*/
木马编程DIY之注册表管理RegEnumKeyEx(hKey,dwIndex,szKeyName,
&KeySize,NULL,NULL,NULL,NULL);//枚举子键
木马编程DIY之注册表管理
printf(szKeyName);
木马编程DIY之注册表管理}

木马编程DIY之注册表管理
木马编程DIY之注册表管理最后需要注意的是在每次调用RegEnumKeyEx前必须重新将KeySize的值设为KeyMaxLen缓冲区的大小,因为每次函数返回时
木马编程DIY之注册表管理KeySize的值会变成返回的键值的名称长度,随着循环次数这个值会变小,而可能出现无法枚举所有键值项的情况.
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理枚举键值信息
木马编程DIY之注册表管理
木马编程DIY之注册表管理枚举键值信息的方法与枚举子键信息极为相似,可以用RegEnumValue函数实现,其函数原型如下:
木马编程DIY之注册表管理
木马编程DIY之注册表管理RegEnumValue(
木马编程DIY之注册表管理hkey,
//被枚举的键句柄
木马编程DIY之注册表管理
dwIndex,//子键索引编号
木马编程DIY之注册表管理
lpValueName,//键值名称
木马编程DIY之注册表管理
lpcbValueName,//键值名称长度
木马编程DIY之注册表管理
lpReserved,//系统保留,指定为0
木马编程DIY之注册表管理
lpType,//键值数据类型
木马编程DIY之注册表管理
lpDate,//键值数据
木马编程DIY之注册表管理
lpcbDate//键值数据长度
木马编程DIY之注册表管理
)
木马编程DIY之注册表管理其实现代码如下:
木马编程DIY之注册表管理
木马编程DIY之注册表管理
for(dwIndex=0;dwIndex<NameCnt;dwIndex++)//枚举键值
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理DateSize
=MaxDateLen+1;
木马编程DIY之注册表管理NameSize
=NameMaxLen+1;
木马编程DIY之注册表管理szValueName
=(char*)malloc(NameSize);
木马编程DIY之注册表管理szValueDate
=(LPBYTE)malloc(DateSize);
木马编程DIY之注册表管理木马编程DIY之注册表管理
/**//*参数定义请参照获取子键/键值信息部分...*/
木马编程DIY之注册表管理RegEnumValue(hKey,dwIndex,szValueName,
&NameSize,NULL,&Type,szValueDate,&DateSize);//读取键值
木马编程DIY之注册表管理

木马编程DIY之注册表管理
if(Type==REG_SZ)
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理木马编程DIY之注册表管理
/**//*判断键值项类型并做其它操作......*/
木马编程DIY之注册表管理}

木马编程DIY之注册表管理
if(Type==REG_DWORD)
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理
木马编程DIY之注册表管理}

木马编程DIY之注册表管理
木马编程DIY之注册表管理}

木马编程DIY之注册表管理
木马编程DIY之注册表管理与枚举子键相似,在每次循环中应该重新设置数据长度DateSize
=MaxDateLen+1键值名称长度NameSize=NameMaxLen+1
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理创建
/删除子键
木马编程DIY之注册表管理
木马编程DIY之注册表管理创建子键跟打开子键差不多,要以用RegCreateKeyEx函数来实现,其原型如下
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理RegCreateKeyEx(
木马编程DIY之注册表管理hkey,
//父键句柄
木马编程DIY之注册表管理
lpSubKey,//子键句柄
木马编程DIY之注册表管理
Reserved,//系统保留,指定为0
木马编程DIY之注册表管理
lpClass,//定义子键类名,通常设为NULL
木马编程DIY之注册表管理
dwOptions,//创建子键时的选项
木马编程DIY之注册表管理
samDesired,//创建后操作权限
木马编程DIY之注册表管理
lpSecurityAttributes,//指向SECURITY_ATTRIBUTES结构,指定键句柄的继承性
木马编程DIY之注册表管理
phkResult,//返回创建句柄
木马编程DIY之注册表管理
lpdwDisposition//通常设为NULL
木马编程DIY之注册表管理
)
木马编程DIY之注册表管理
木马编程DIY之注册表管理个人感觉这个API罗哩罗嗦不好使大多参数在大多数时候都放NULL,还不如16位下的API函数RegCreateKey用着方便
木马编程DIY之注册表管理
木马编程DIY之注册表管理其实例代码如下:
木马编程DIY之注册表管理
木马编程DIY之注册表管理HKEYKEY;
木马编程DIY之注册表管理
木马编程DIY之注册表管理
if(ERROR_SUCCESS!=RegCreateKey(HKEY_LOCAL_MACHINE,"SOFTWARE/Microsoft/Windows/MyKey",&KEY))
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理MessageBox(
"创建失败!");
木马编程DIY之注册表管理}
else
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理MessageBox(
"创建成功!");
木马编程DIY之注册表管理}

木马编程DIY之注册表管理
木马编程DIY之注册表管理嘿嘿是不是简单多了
?
木马编程DIY之注册表管理
木马编程DIY之注册表管理不关什么事破坏总比创建要容易,删除一个键可以用RegDeleteKey()实现,它有两个参数原型如下
木马编程DIY之注册表管理
木马编程DIY之注册表管理RegDeleteKey(
木马编程DIY之注册表管理hkey,
//主键句柄
木马编程DIY之注册表管理
lpSubKey,//子键名称字符串
木马编程DIY之注册表管理

木马编程DIY之注册表管理)
木马编程DIY之注册表管理如果想删除上面创建的MyKey子键可以用下面的代码实现:
木马编程DIY之注册表管理
木马编程DIY之注册表管理
if(ERROR_SUCCESS==RegDeleteKey(HKEY_LOCAL_MACHINE,"SOFTWARE/Microsoft/Windows/MyKey"))
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理AfxMessageBox(
"删除成功!");
木马编程DIY之注册表管理}
else
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理AfxMessageBox(
"删除失败!");
木马编程DIY之注册表管理}

木马编程DIY之注册表管理
木马编程DIY之注册表管理需要注意的是在创建子键时可以创建多级子键,比如
木马编程DIY之注册表管理
木马编程DIY之注册表管理RegCreateKey(HKEY_LOCAL_MACHINE,
"SOFTWARE/Microsoft/Windows/MyKey1/MyKey2",&KEY)
木马编程DIY之注册表管理
木马编程DIY之注册表管理如果MyKey1不存在的话那么它将先创建MyKey1再创建MyKey2,这一点与文件系统中创建目录是不同的
木马编程DIY之注册表管理
木马编程DIY之注册表管理但是删除的时候却不能删除多级子键比如我想删除MyKey1那么我必须先删除MyKey2才可以,不过一个子键下面的多个键值
木马编程DIY之注册表管理可以一次删除.
木马编程DIY之注册表管理
木马编程DIY之注册表管理木马编程DIY之注册表管理文
/图冷风
木马编程DIY之注册表管理
木马编程DIY之注册表管理创建
/删除键值项
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理创建键值可以用RegSetValueEx函数来实现,它的原型如下:
木马编程DIY之注册表管理
木马编程DIY之注册表管理RegSetValueEx(
木马编程DIY之注册表管理hkey,
//键句柄,键值项将保存在此键下
木马编程DIY之注册表管理
lpValueName,//键值项名称
木马编程DIY之注册表管理
Reserved,//系统保留,指定为0
木马编程DIY之注册表管理
dwType,//键值项类型
木马编程DIY之注册表管理
lpDate,//键值项数据
木马编程DIY之注册表管理
cbDate//键值项长度
木马编程DIY之注册表管理
)
木马编程DIY之注册表管理使用这个函数的时个有一点需要注意,其中参数lpDate和cbDate的值要跟据dwType的值来设定,按常用设置我们分三种情况
木马编程DIY之注册表管理
木马编程DIY之注册表管理1当dwType为REG_SZ时,这时跟通常一样,lpDate为要设置的数据,cbDate为数据的长度
木马编程DIY之注册表管理
木马编程DIY之注册表管理2当dwType为REG_DWORD时,cbDate应该设为4,为什么?因为不设为4就不对
木马编程DIY之注册表管理
木马编程DIY之注册表管理3当dwType为REG_BINARY时,cbDate也应该设为4,没有为什么了吧呵呵
木马编程DIY之注册表管理
木马编程DIY之注册表管理如果调用时,键值项名称以经存在了会怎么样呢?答案是:覆盖用新的键值项数据覆盖原来的,如果没有就新建一个
木马编程DIY之注册表管理
木马编程DIY之注册表管理我们来看一下实现功能的实例代码:
木马编程DIY之注册表管理
木马编程DIY之注册表管理
voidCreateValue::OnCreate()
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理HKEYkey;
木马编程DIY之注册表管理UpdateData(
true);
木马编程DIY之注册表管理
if(m_type=="REG_SZ")
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理
if(RegOpenKeyEx(MKEY,SubKey,0,KEY_ALL_ACCESS,&key)==ERROR_SUCCESS)
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理
if(::RegSetValueEx(key,m_name,0,REG_SZ,(constunsignedchar*)m_date,MAX_PATH)==ERROR_SUCCESS)
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理MessageBox(
"创建成功!");
木马编程DIY之注册表管理}

木马编程DIY之注册表管理}

木马编程DIY之注册表管理}

木马编程DIY之注册表管理
木马编程DIY之注册表管理
if(m_type=="REG_DWORD")
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理
if(RegOpenKeyEx(MKEY,SubKey,0,KEY_ALL_ACCESS,&key)==ERROR_SUCCESS)
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理
if(::RegSetValueEx(key,m_name,0,REG_DWORD,(constunsignedchar*)m_date,4)==ERROR_SUCCESS)//注意数据长度应该设为4
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理MessageBox(
"创建成功!");
木马编程DIY之注册表管理}

木马编程DIY之注册表管理}

木马编程DIY之注册表管理}

木马编程DIY之注册表管理
木马编程DIY之注册表管理木马编程DIY之注册表管理
/**//*其它类型的设置......*/
木马编程DIY之注册表管理}

木马编程DIY之注册表管理
木马编程DIY之注册表管理删除键值可以用RegDeleteValue来实现它的函数原型如下
木马编程DIY之注册表管理
木马编程DIY之注册表管理RegDeleteValue(
木马编程DIY之注册表管理hkey,
//父键句柄
木马编程DIY之注册表管理
lpValueName//要删除的键值项名称
木马编程DIY之注册表管理
)
木马编程DIY之注册表管理其实例代码如下:
木马编程DIY之注册表管理
木马编程DIY之注册表管理HKEYkey;
木马编程DIY之注册表管理
charvalue[MAX_PATH]="LengFeng"//键值
木马编程DIY之注册表管理
LPCTSTRdata="SOFTWARE/Microsoft/Windows/CurrentVersion/Run";//路径
木马编程DIY之注册表管理

木马编程DIY之注册表管理RegOpenKeyEx(HKEY_LOCAL_MACHINE,data,
0,KEY_WRITE,&key);//打开
木马编程DIY之注册表管理

木马编程DIY之注册表管理
if(ERROR_SUCCESS==::RegDeleteValue(key,value))//删除
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理MessageBox(
"删除成功!");
木马编程DIY之注册表管理}

木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理备份
/恢复注册表
木马编程DIY之注册表管理
木马编程DIY之注册表管理
木马编程DIY之注册表管理备份和恢复注册表相对来说用的不是太多,我在程序中也没有加入这项功能,但为了这这篇文章完整一些,就用一个运行在CONSOLE
木马编程DIY之注册表管理下的小程序来讨论一下它们的实现
木马编程DIY之注册表管理
木马编程DIY之注册表管理备份注册表可以用RegSaveKey函来实现它的原形如下
木马编程DIY之注册表管理
木马编程DIY之注册表管理RegSaveKey(
木马编程DIY之注册表管理hkey,
//要备份的键句柄
木马编程DIY之注册表管理
lpFile,//保存信息的文件名称
木马编程DIY之注册表管理
lpSecurityAttributes//文件安全属性
木马编程DIY之注册表管理

木马编程DIY之注册表管理
木马编程DIY之注册表管理hkey为要备份的键句柄,可以是系统预定义的,也可以是用RegOpenKey()打开或是RegCreateKeyEx()创建的
木马编程DIY之注册表管理lpFile为保存信息的文件名称,注意这个文件必须是不存在的,而且也不能有扩展名(否则RegRestoreKey()函无法读取)
木马编程DIY之注册表管理lpSecurityAttributes,它在NT系统中用来设置新文件的安全属性,通常设置为NULL
木马编程DIY之注册表管理
木马编程DIY之注册表管理在使用这个函数时需要有SE_BACKUP_NAME权限,而这个权限是不可以在RegOpenKey()或是RegCreateKeyEx()指定的
木马编程DIY之注册表管理要做到这一点我们需要提升自己的权限,其具体实现如下代码如示:
木马编程DIY之注册表管理
木马编程DIY之注册表管理#include
<windows.h>
木马编程DIY之注册表管理#include
<stdio.h>
木马编程DIY之注册表管理#include
<stdlib.h>
木马编程DIY之注册表管理
voidmain()
木马编程DIY之注册表管理木马编程DIY之注册表管理
...{
木马编程DIY之注册表管理
charstrKey[]="Software/Microsoft/InternetExplorer";
木马编程DIY之注册表管理LPTSTRszSaveFileName;
木马编程DIY之注册表管理HKEYkey;
木马编程DIY之注册表管理
//申请备份权限
木马编程DIY之注册表管理
HANDLEhToken;
木马编程DIY之注册表管理TOKEN_PRIVILEGEStkp;
木马编程DIY之注册表管理
if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
木马编程DIY之注册表管理
return;
木马编程DIY之注册表管理LookupPrivilegeValue(NULL,SE_BACKUP_NAME,
&tkp.Privileges[0].Luid);//申请SE_BACKUP_NAME权限
木马编程DIY之注册表管理
tkp.PrivilegeCount=1;
木马编程DIY之注册表管理tkp.Privileges[
0].Attributes=SE_PRIVILEGE_ENABLED;
木马编程DIY之注册表管理AdjustTokenPrivileges(hToken,FALSE,
&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
木马编程DIY之注册表管理
//开始备份工作
木马编程DIY之注册表管理
szSaveFileName=LPTSTR("D:/KeyDate");//注意文件不可存在否则无法成功
木马编程DIY之注册表管理
RegOpenKeyEx(
木马编程DIY之注册表管理HKEY_CURRENT_USER,
木马编程DIY之注册表管理(LPCTSTR)strKey,
木马编程DIY之注册表管理
0,
木马编程DIY之注册表管理KEY_ALL_ACCESS,
木马编程DIY之注册表管理
&key);
木马编程DIY之注册表管理RegSaveKey(key,szSaveFileName,NULL);
木马编程DIY之注册表管理RegCloseKey(key);
木马编程DIY之注册表管理}

木马编程DIY之注册表管理
木马编程DIY之注册表管理上面用到了提升权限的代码,以前杂志上面有很多可以参考一下来看,这样备份就完成了.而恢复可以用函数RegRestoreKey来实现
木马编程DIY之注册表管理它的原形如下
木马编程DIY之注册表管理RegRestoreKey(
木马编程DIY之注册表管理hkey,
//要恢复的键句柄
木马编程DIY之注册表管理
lpFile,//保存信息的文件名称
木马编程DIY之注册表管理
dwFlage//标志是否易失
木马编程DIY之注册表管理

木马编程DIY之注册表管理此函数的前两个参数可以与RegSaveKey相同,而参数dwFlage为TRUE的话是暂时恢复注册表,如果为FALSE则是永久修改注册表值.同样需要
木马编程DIY之注册表管理注意的是使用这个函数需要有SE_RESTORE_NAME权限



木马编程DIY之注册表管理 文/图 冷风

到现在对注册表的基本操作就做完了,我们也可以休息一下了,至于具体细节的实现可以参考一下本文所附的源代码,当然喽程序虽然是模仿WINDOWS的注册表,不过功能和细节和WINDOWS的注册表相比还是有很大差距的,如果有兴趣的话可以继续改进,呵呵虽然如此,但在一些对注册表限至比较严的网吧中,用来顾顾急救救火还是可以的。这篇文章和程序断断续续写了一周,如果本文能帮助你解决几个即使很小的问题,那么我也倍感欣慰了呵呵