黑客编程入门(二)
注册表下的操作是windows下的黑客不可或缺的东西,今天我们就来用代码操作下注册表
什么是注册表?
注册表是windows下的一个数据库,用于记录我们的系统和应用程序的各项配置信息。比如它控制着我们的开机就运行的程序,我们的浏览器的主页。
我们主要用到以下几个API函数:
LONG RegOpenKey(
HKEY hkey, //父键句柄
LPCTSTR lpSubKey, //要打开的子键名称
PHKEY phkResult //返回的子键句柄
); //打开注册表函数
LONG RegCloseKey(
HKEY hkey //关闭注册表的句柄
); //关闭注册表函数
LONG RegQueryValueEx(
HKEY hkey, //打开的注册表的句柄
LPCTSTR lpValueName, //要查询的键值名称
LPDWORD lpReserved, //保留 使用时直接用NULL
LPDWORD lpType, //返回要查询的值的类型
LPBYTE lpData, //要查询数据的缓冲区
LPDWORD lpcbData //缓冲区的长度
); //注册表键值查询函数
LONG RegSetValueEx(
HKEY hkey, //打开的注册表的句柄
LPCTSTR lpValueName, //被写入的键值名称
DWORD Reserved, //保留 使用时直接用NULL
DWORD dwType, //要写入的键值得类型
CONST BYTE *lpData, //写入的键值的缓冲区
DWORD cbData //写入键值缓冲区的长度
); //注册表创建函数
LONG RegEnumValue(
HKEY hkey, //打开的注册表的句柄
DWORD dwIndex, //查询的索引值
LPCTSTR lpValueName, //键名的缓冲区
LPDWORD lpcValueName, //键名缓冲区的长度
LPDWORD lpReserved, //保留 使用时直接用NULL
LPDWORD lpType, //返回要查询的值的类型
LPBYTE lpData, //要查询数据的缓冲区
LPDWORD lpcbData //缓冲区的长度
); //注册表枚举函数
LONG RegDeleteValue(
HEKY heky, //打开的注册表的句柄
LPCTSTR lpValueName, //要删除的键值项的名称
); //注册表删除函数
这里不一一举例,下面的代码只是打印出启动项:
(使用了上面的3个API函数,打开/关闭注册表以及枚举函数 )
#include<stdio.h>
#include<windows.h>
#define REG_RUN "Software\\Microsoft\\Windows\\CurrentVersion\\Run"
void ShowRunlist()
{
HKEY hkey = NULL;
LONG lRet = RegOpenKey(HKEY_LOCAL_MACHINE,REG_RUN,&hkey);
if (lRet != ERROR_SUCCESS)
{
printf("打开注册表失败!\n");
return ;
}
printf("打开注册表成功!\n");
int i = 1;
char szValueName[MAXBYTE] = {0};
DWORD dwBufferSize = MAXBYTE;
DWORD dwType = MAXBYTE;
char szValueKey[MAXBYTE] = {0};
DWORD dwKeySize = MAXBYTE;
printf("Number\t键 名\t\t键 值\n");
while(true)
{
lRet = RegEnumValue(hkey,i,szValueName,&dwBufferSize,NULL,&dwType,(unsigned char *)szValueKey,&dwKeySize);
if(lRet == ERROR_NO_MORE_ITEMS)
{
break;
}
printf("%d\t%s\t%s\t\n",i,szValueName,szValueKey);
i++;
ZeroMemory(szValueName,MAXBYTE);
ZeroMemory(szValueKey,MAXBYTE);
}
RegCloseKey(hkey);
}
int main()
{
ShowRunlist();
return 0;
}
程序运行结果图: