目录
- .reg文件使用以及操作
- 一丶Reg文件
- 1.reg文件的导入
- 2.reg文件的导出
- 3.regedit导入方式
- 4.总结
- 二丶C++ 代码导入reg文件黑屏问题
- 三丶 注册表改名
- 一丶Reg文件
.reg文件使用以及操作
一丶Reg文件
首先这里不讲Winapi等一系列操作注册表的方式,只说一下 reg文件操作的方式
1.reg文件的导入
reg文件是可以双击进行导入的. 也可以使用CMD 命令进行导入
如下:
如果要导入 就用
Reg Import
reg import xxx.reg
具体可以查看cmd命令
2.reg文件的导出
这里跟上面差不多,注意语法即可. 主要是 注意 /y 是可以不用提示的.
3.regedit导入方式
另外一种方式是使用 regedit导入
regedit /s xxx.reg
使用/s 选项 注意.reg文件. reg有人说后面有多出的4个空格.会导致导入失败或者成功
这个没有尝试.
4.总结
以上所有方法.均可以使用 C++ 实现, 假设你构造好一个.reg,直接使用 普通权限就可以导入
然后你懂的.
二丶C++ 代码导入reg文件黑屏问题
C++ 如果使用
system("reg import xxx.reg")
使用如上代码,会出现一个一闪而过的黑框,原因是使用了system这个函数,我们只需要改为如下即可.
string cwtCommands = "cmd /c ";
cwtCommands += cwtCommand;
WinExec(cwtCommands.c_str(), SW_HIDE);
其中 cwtCommand = 你构造的命令
例如
"reg import xxx.reg"
三丶 注册表改名
我们知道,想要对一个key进行改名是没有提供接口的,唯一方法就是删除这个key然后重新设置.
但是你想一下,如果需要你改名怎么办,而删除重新设置会让你写很多代码.
虽然没有公开接口,但是我们可以使用未公开即可.
windbg随便附加一个exe.查看 ntdll的符号
可以看到有一个 NtRenameKey 这个函数则可以进行key改名. 如果还想要其它功能强大的函数
那么windbg的x命令可以帮助你
使用方法
typedef struct _UNICODE_STRING
{
WORD Length;
WORD MaximumLength;
WORD* Buffer;
} UNICODE_STRING, * PUNICODE_STRING;
typedef VOID (NTAPI* PfnRtlInitUnicodeString)
(_Out_ PUNICODE_STRING DestinationString,
_In_opt_ PCWSTR SourceString);
PfnRtlInitUnicodeString RtlInitUnicodeString;
typedef NTSTATUS (_stdcall *PfnNtRenameKey)(
HANDLE KeyHandle,
PUNICODE_STRING NewName
);
PfnNtRenameKey RenameKey;
HMODULE hMod = NULL;
hMod = LoadLibrary(TEXT("ntdll.dll"));
if (hMod == NULL)
{
return ;
}
RtlInitUnicodeString = (PfnRtlInitUnicodeString)GetProcAddress(hMod,"RtlInitUnicodeString");
RenameKey = (PfnNtRenameKey)GetProcAddress(hMod,"NtRenameKey");
BOOL RegChangeKey(HKEY hKey,TCHAR *szSubKey,TCHAR *NewKeyFileName)
{
AdjustPrivileges(TEXT("SE_BACKUP_NAME")); //启动注册表权限
DWORD dwErrorCode = ERROR_SUCCESS;
DWORD dwFlag = REG_OPENED_EXISTING_KEY;
RegCreateKeyEx(hKey,szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,&dwFlag);
if (hKey == 0)
{
return FALSE;
}
if (RenameKey == NULL)
{
RegCloseKey(hKey);
return FALSE;
}
//初始化UNICODE_STRING结构体,进行调用
UNICODE_STRING uNewNameString;
if (RtlInitUnicodeString == NULL)
{
RegCloseKey(hKey);
return FALSE;
}
RtlInitUnicodeString(&uNewNameString,NewKeyFileName);
//修改名字
RenameKey((HANDLE)hKey,&uNewNameString);
RegCloseKey(hKey);
return TRUE;
}
详情使用可以参考博客. https://www.qingsword.com/qing/163.html