晃晃悠悠
isrobert
VC知识库BLOG
::
首页
::
新随笔
::
联系
::
聚合
::
登录
::
12 随笔 :: 0 文章 :: 34 评论 :: 0 Trackbacks
<
2008年11月
>
日
一
二
三
四
五
六
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
留言簿(0)
给我留言
查看公开留言
查看私人留言
随笔分类
唉~终于批下来了。。。 (0)
(rss)
随笔档案
2007年11月 (2)
2007年5月 (2)
2007年3月 (3)
2007年1月 (5)
文章档案
相册
...... (1)
收藏夹
好文章 (0)
(rss)
相关链接
C 程序字号的修改
DirectX 图形、音频、视频,很详细了!
FLxyzsby的专栏
Haides
libpcap基础知识
vc编程经验总结
Windows中获取MAC地址的几种方法
WinPcap 教程
WMI
使用pcap编写自己的sniffer
博为 - WINDOWS下对音频的处理过程
博客登峰
周星星之BLOG
基于API的录音机程序
属性页
杨老师之Blog
清风雨
灵动生存 - DirectShow介绍
用Sniffer抓包分析以太网帧
搜索
最新评论
1. re: (ZT) Window下拖放操作Drag & Drop 全解析
请发份代码学习下。liwenruiabc@qq.com非常感谢!
--李文瑞
2. re: (函数)调用约定--- __cdecl和__stdcal
好东西,收藏了
--健康管理
3. Window下拖放操作Drag & Drop 全解析
您介绍的很好,不知道您是否能发送CListCtrlEx,支持OLE drag&drop,的程序代码参考和学习呢?我的电邮是:Forrest_Chi_2006@126.com.等待您的答复!
--Forrest_Chi
4. re: (ZT) Window下拖放操作Drag & Drop 全解析
楼主可以的,顶你
--cinbo
5. re: 木马编程DIY之注册表管理
挑战病毒呀。
--挑战杯
6. re: 木马编程DIY之注册表管理
命令行下,reg add,reg query也许更方便。
--sjdev
7. re: 木马编程DIY之注册表管理
写得好
--gaoqing000
8. re: (ZT) Window下拖放操作Drag & Drop 全解析
方便的话发份。代码研究下loswing@gmail.com
--loswing
9. re: (ZT) Window下拖放操作Drag & Drop 全解析
写得好
--gaoqing000
10. re: (函数)调用约定--- __cdecl和__stdcal
vc资料站:
http://www.vcmsdn.com/
对学习很有帮助的,可以上去
看看,或加群46138350,里面有高手可以请教的。
--maggie
阅读排行榜
1. 程序中控件实现随xp风格的改变而改变(2301)
2. (函数)调用约定--- __cdecl和__stdcal(2199)
3. 程序互斥~(2167)
4. ZT:音频处理的基本知识~(1896)
5. (ZT) Window下拖放操作Drag & Drop 全解析 (1834)
6. 20070126--函数指针的问题(1777)
7. ZT:VC下ADO开发实践之一(1747)
8. typeid(1654)
9. 20070125-单链表倒序算法 -------- 看到**的文章,自己想小试牛刀(1556)
10. 木马编程DIY之注册表管理(1320)
评论排行榜
1. 20070124-关于c,c++对函数的类型检查问题(8)
2. (ZT) Window下拖放操作Drag & Drop 全解析 (5)
3. 程序中控件实现随xp风格的改变而改变(4)
4. 程序互斥~(4)
5. 木马编程DIY之注册表管理(3)
6. (函数)调用约定--- __cdecl和__stdcal(3)
7. ZT:VC下ADO开发实践之一(2)
8. 20070126--函数指针的问题(2)
9. typeid(2)
10. 20070125-单链表倒序算法 -------- 看到**的文章,自己想小试牛刀(1)
木马编程DIY之注册表管理
对注册表操作算是比较全了,感觉不错,收藏!
原文:
http://www.helpmsg.com/blog/article.asp?id=48
开始前先了解一些基础知识,对后面的工作会方便不少,其码不会出现散晕的现像,对注册表的历史也就不再说了有兴趣可以
查查新华字典呵呵.注册表的组织方式跟文件目录比较相似,主要分为 跟键,子键,键值项 三部分跟文件目录对应的话就是
跟目录,子目录,和文件.分别介绍一下,跟键为分5个分别为HKEY_CLASSES_ROOT,HKEY_CURRENT_USER,HKEY_LOCAL_MACHINE
HKEY_USERS,HKEY_CURRENT_CONFIG把它们理解成磁盘的五个分区可以了,子键可以有多个子键和键值项,就像一个目录中可
以有多个子目录和多个文件一样,而键值项可以理解为文件它由三部分组成,分别为 名称,类型,数据. 类型又分为多种主要
包括如下:
REG_BINARY 二进制数据
REG_DWORD 32位双字节数据
REG_SZ 以0结尾的字符串
REG_DWORD_BIG_ENDIAN 高位排在底位的双字
REG_EXPAND_SZ 扩展字符串,可以加入变量如%PATH%
REG_LINK UNICODE 符号链接
REG_RESOURCE_LIST 设备驱动程序资源列表
REG_MULTI_SZ 多字符串
注册表数据项的数据类型有8种但最常用的主要是前3种而以,有了这些基础下面我们讨论如何编程实现对注册表的操作
打开/关闭注册表句柄
在对注册表操作前应该先打开指定的键,然后通过键的句柄进行操作,打开键句柄可以用API RegOpenKeyEx来实现其原形如下
RegOpenKeyEx(
hKey,
//父键句柄
lpSubKey,
//子键句柄
dwOptions,
//系统保留,指定为0
samDesired,
//打开权限
phkResult,
//返回打开句柄
)
其中打开权限有多种 想方便的话可以指定为KEY_ALL_ACCESS 这样什么权限都有了,当函数执行成功时返回ERROR_SUCCESS
其实例代码如下:
HKEY key;
LPCTSTR data=
"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
;
if
(RegOpenKeyEx(HKEY_LOCAL_MACHINE,data,0,KEY_ALL_ACCESS,&key)==ERROR_SUCCESS)
{
/**/
/*需要执行的操作*/
}
::RegCloseKey(key);
要注意的是在使用后应该调用RegCloseKey();函数为关闭句柄.
木马编程DIY之注册表管理 文/图 冷风
获取子键/键值信息
在现实的编程操作中我们常常需要获取 子键/键值的信息比如:子键/键值的数量,长度,以及数据的最大长度等等这些信息可以
通过RegQueryInfoKey函数来获取
它的原型如下:
RegQueryInfoKey(
hkey,
//要获取信息的句柄
lpClass,
//接受创建健时的Class字符串
lpcbClass,
//lpClass的长度
lpReserved,
//系统保留,指定为0
lpcSubKeys,
//子键数量
lpcbMaxSubKeyLen,
//子键中最长名称的长度
lpcbMaxClassLen,
//子键中最长Class字符串长度
lpcVlaues,
//键值数量
lpcbMaxValueNameLen,
//键值项中最长名称的长度
lpcbMaxValueLen,
//键值项数据最大长度
lpcbSecurityDescriptor,
//安全描述符长度
lpftLastWriteTime,
//FILETIME结构,最后修改时间
)
哈哈是不是挺吓人的?其实看实际情况接受自己需要的就好了,不需要的可以放个NULL就OK了,还有一点需要注意就是它所返回
的长度都不包括结尾的0字符,所以在使用时应该用长度+1
其实例代码如下
DWORD dwIndex=0,NameSize,NameCnt,NameMaxLen,Type;
DWORD KeySize,KeyCnt,KeyMaxLen,DateSize,MaxDateLen;
if
(RegQueryInfoKey(key,NULL,NULL,NULL,&KeyCnt,&KeyMaxLen,NULL,&NameCnt,&NameMaxLen,&MaxDateLen,NULL,NULL)!=ERROR_SUCCESS)
{
printf(
"RegQueryInfoKey错误"
);
return
;
}
用的时候套用格式就成了,不然会很麻烦的..有了这些信息我们就可以枚举子键和键值的信息了
枚举子键信息
枚举子键可以用API函数 RegEnumKeyEx来实现 调用RegEnumKeyEx时将返回子键的名称,长度和一些相关数据,如果想得到一个
键下的全部子键的话应该循环调用,直到返回ERROR_NO_MORE_ITEMS为至,就说明以枚举完了所有数据其函数原型如下
RegEnumKeyEx(
hkey,
//被枚举的键句柄
dwIndex,
//子键索引编号
lpName,
//子键名称
lpcbName,
//子键名称长度
lpReserved,
//系统保留,指定为0
lpClass,
//子键类名
lpcbClass,
//子键类名长度
lpftLastWriteTime
//最后写入时间
)
因为在之前我们以通过RegQueryInfoKey函数获取了键的有关数据,所以在这里不再跟据ERROR_NO_MORE_ITEMS来实现了
其实现代码如下:
for
(dwIndex=0;dwIndex<KeyCnt;dwIndex++)
//枚举子键
{
KeySize=KeyMaxLen+1;
//因为RegQueryInfoKey得到的长度不包括0结束字符,所以应加1
szKeyName=(
char
*)malloc(KeySize);
/**/
/*参数定义请参照获取子键/键值信息部分*/
RegEnumKeyEx(hKey,dwIndex,szKeyName,&KeySize,NULL,NULL,NULL,NULL);
//枚举子键
printf(szKeyName);
}
最后需要注意的是在每次调用RegEnumKeyEx前必须重新将KeySize的值设为KeyMaxLen缓冲区的大小,因为每次函数返回时
KeySize的值会变成返回的键值的名称长度,随着循环次数这个值会变小,而可能出现无法枚举所有键值项的情况.
枚举键值信息
枚举键值信息的方法与枚举子键信息极为相似,可以用RegEnumValue函数实现,其函数原型如下:
RegEnumValue(
hkey,
//被枚举的键句柄
dwIndex,
//子键索引编号
lpValueName,
//键值名称
lpcbValueName,
//键值名称长度
lpReserved,
//系统保留,指定为0
lpType,
//键值数据类型
lpDate,
//键值数据
lpcbDate
//键值数据长度
)
其实现代码如下:
for
(dwIndex=0;dwIndex<NameCnt;dwIndex++)
//枚举键值
{
DateSize=MaxDateLen+1;
NameSize=NameMaxLen+1;
szValueName=(
char
*)malloc(NameSize);
szValueDate=(LPBYTE)malloc(DateSize);
/**/
/*参数定义请参照获取子键/键值信息部分*/
RegEnumValue(hKey,dwIndex,szValueName,&NameSize,NULL,&Type,szValueDate,&DateSize);
//读取键值
if
(Type==REG_SZ)
{
/**/
/*判断键值项类型并做其它操作*/
}
if
(Type==REG_DWORD)
{
}
}
与枚举子键相似,在每次循环中应该重新设置 数据长度DateSize=MaxDateLen+1键值名称长度NameSize=NameMaxLen+1
创建/删除子键
创建子键跟打开子键差不多,要以用RegCreateKeyEx函数来实现,其原型如下
RegCreateKeyEx(
hkey,
//父键句柄
lpSubKey,
//子键句柄
Reserved,
//系统保留,指定为0
lpClass,
//定义子键类名,通常设为NULL
dwOptions,
//创建子键时的选项
samDesired,
//创建后操作权限
lpSecurityAttributes,
//指向SECURITY_ATTRIBUTES结构,指定键句柄的继承性
phkResult,
//返回创建句柄
lpdwDisposition
//通常设为NULL
)
个人感觉这个API 罗哩罗嗦不好使大多参数在大多数时候都放NULL,还不如16位下的API函数RegCreateKey用着方便
其实例代码如下:
HKEY KEY;
if
(ERROR_SUCCESS!=RegCreateKey(HKEY_LOCAL_MACHINE,
"SOFTWARE\Microsoft\Windows\MyKey"
,&KEY))
{
MessageBox(
"创建失败!"
);
}
else
{
MessageBox(
"创建成功!"
);
}
嘿嘿 是不是简单多了?
不关什么事破坏总比创建要容易,删除一个键可以用RegDeleteKey()实现,它有两个参数原型如下
RegDeleteKey(
hkey,
//主键句柄
lpSubKey,
//子键名称字符串
)
如果想删除上面创建的MyKey子键可以用下面的代码实现:
if
(ERROR_SUCCESS==RegDeleteKey(HKEY_LOCAL_MACHINE,
"SOFTWARE\Microsoft\Windows\MyKey"
))
{
AfxMessageBox(
"删除成功!"
);
}
else
{
AfxMessageBox(
"删除失败!"
);
}
需要注意的是 在创建子键时可以创建多级子键,比如
RegCreateKey(HKEY_LOCAL_MACHINE,
"SOFTWARE\Microsoft\Windows\MyKey1\MyKey2"
,&KEY)
如果MyKey1不存在的话那么它将先创建MyKey1再创建MyKey2,这一点与文件系统中创建目录是不同的
但是删除的时候却不能删除多级子键比如我想删除MyKey1那么我必须先删除MyKey2才可以,不过一个子键下面的多个键值
可以一次删除.
木马编程DIY之注册表管理 文/图 冷风
创建/删除键值项
创建键值可以用RegSetValueEx函数来实现,它的原型如下:
RegSetValueEx(
hkey,
//键句柄,键值项将保存在此键下
lpValueName,
//键值项名称
Reserved,
//系统保留,指定为0
dwType,
//键值项类型
lpDate,
//键值项数据
cbDate
//键值项长度
)
使用这个函数的时个有一点需要注意,其中参数lpDate和cbDate的值要跟据dwType的值来设定,按常用设置我们分三种情况
1当dwType为REG_SZ时,这时跟通常一样,lpDate为要设置的数据, cbDate为数据的长度
2当dwType为REG_DWORD 时,cbDate应该设为4,为什么?因为不设为4就不对
3当dwType为REG_BINARY 时,cbDate也应该设为4,没有为什么了吧呵呵
如果调用时,键值项名称以经存在了会怎么样呢?答案是:覆盖 用新的键值项数据覆盖原来的,如果没有就新建一个
我们来看一下实现功能的实例代码:
void
CreateValue::OnCreate()
{
HKEY key;
UpdateData(
true
);
if
(m_type==
"REG_SZ"
)
{
if
(RegOpenKeyEx(MKEY,SubKey,0,KEY_ALL_ACCESS,&key)==ERROR_SUCCESS)
{
if
(::RegSetValueEx(key,m_name,0,REG_SZ,(
const
unsigned
char
*)m_date,MAX_PATH)==ERROR_SUCCESS)
{
MessageBox(
"创建成功!"
);
}
}
}
if
(m_type==
"REG_DWORD"
)
{
if
(RegOpenKeyEx(MKEY,SubKey,0,KEY_ALL_ACCESS,&key)==ERROR_SUCCESS)
{
if
(::RegSetValueEx(key,m_name,0,REG_DWORD,(
const
unsigned
char
*)m_date,4)==ERROR_SUCCESS)
//注意数据长度应该设为4
{
MessageBox(
"创建成功!"
);
}
}
}
/**/
/*其它类型的设置*/
}
删除键值可以用RegDeleteValue来实现它的函数原型如下
RegDeleteValue(
hkey,
//父键句柄
lpValueName
//要删除的键值项名称
)
其实例代码如下:
HKEY key;
char
value[MAX_PATH]=
"LengFeng"
//键值
LPCTSTR data=
"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"
;
//路径
RegOpenKeyEx(HKEY_LOCAL_MACHINE,data,0,KEY_WRITE,&key);
//打开
if
(ERROR_SUCCESS==::RegDeleteValue(key,value))
//删除
{
MessageBox(
"删除成功!"
);
}
备份/恢复注册表
备份和恢复注册表相对来说用的不是太多,我在程序中也没有加入这项功能,但为了这这篇文章完整一些,就用一个运行在CONSOLE
下的小程序来讨论一下它们的实现
备份注册表可以用RegSaveKey函来实现 它的原形如下
RegSaveKey(
hkey,
//要备份的键句柄
lpFile,
//保存信息的文件名称
lpSecurityAttributes
//文件安全属性
)
hkey为要备份的键句柄,可以是系统预定义的,也可以是用RegOpenKey()打开或是RegCreateKeyEx()创建的
lpFile为保存信息的文件名称,注意这个文件必须是不存在的,而且也不能有扩展名(否则RegRestoreKey()函无法读取)
lpSecurityAttributes,它在NT系统中用来设置新文件的安全属性,通常设置为NULL
在使用这个函数时需要有SE_BACKUP_NAME权限,而这个权限是不可以在RegOpenKey()或是RegCreateKeyEx()指定的
要做到这一点我们需要提升自己的权限,其具体实现如下代码如示:
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
void
main()
{
char
strKey[]=
"Software\Microsoft\Internet Explorer"
;
LPTSTR szSaveFileName;
HKEY key;
// 申请备份权限
HANDLE hToken;
TOKEN_PRIVILEGES tkp;
if
(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken))
return
;
LookupPrivilegeValue(NULL,SE_BACKUP_NAME,&tkp.Privileges[0].Luid);
//申请SE_BACKUP_NAME权限
tkp.PrivilegeCount=1;
tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken,FALSE,&tkp,0,(PTOKEN_PRIVILEGES)NULL,0);
//开始备份工作
szSaveFileName=LPTSTR(
"D:\KeyDate"
);
//注意文件不可存在否则无法成功
RegOpenKeyEx(
HKEY_CURRENT_USER,
(LPCTSTR)strKey,
0,
KEY_ALL_ACCESS,
&key);
RegSaveKey(key,szSaveFileName, NULL);
RegCloseKey(key);
}
上面用到了提升权限的代码,以前杂志上面有很多可以参考一下来看,这样备份就完成了.而恢复可以用函数RegRestoreKey来实现
它的原形如下
RegRestoreKey(
hkey,
//要恢复的键句柄
lpFile,
//保存信息的文件名称
dwFlage
//标志是否易失
)
此函数的前两个参数可以与RegSaveKey相同,而参数dwFlage为TRUE的话是暂时恢复注册表,如果为FALSE则是永久修改注册表值.同样需要
注意的是使用这个函数需要有SE_RESTORE_NAME权限
posted on 2007-11-20 12:33 isrobert 阅读(1320)
评论(3)
编辑
收藏
评论
#
re: 木马编程DIY之注册表管理
2007-11-21 16:02
gaoqing000
写得好
#
re: 木马编程DIY之注册表管理
2007-11-21 19:40
sjdev
命令行下,reg add,reg query也许更方便。
#
re: 木马编程DIY之注册表管理
2007-11-21 20:56
挑战杯
挑战病毒呀。
标题
姓名
主页
验证码
*
内容
Remember Me?
登录
使用高级评论
Top
[使用Ctrl+Enter键可以直接提交]
Powered by:
Copyright © isrobert