#include "stdafx.h"
#include <windows.h>
/*
NTFS有硬链接。
注册表也有链接。
这些看似奇迹古怪的东西,有时候还必须会,有时候能起到意想不到的效果。
简单说一下创建注册表链接的要点:
1.用RegCreateKeyEx或者更底层的函数ZwCreateKey等加参数REG_OPTION_CREATE_LINK或者KEY_CREATE_LINK创建一个子键。
注意:应该不可以嵌套。没有下一步,走到这里在注册表中打开会弹出错误提示的。
2.在这个子键下创建名字为:SymbolicLinkValue,类型为:REG_LINK,值为注册表的内核的路径的項就可以了。
3.删除吗用NtDeleteKey,注意传递的句柄的权限。
参考:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724844(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724884(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/hardware/ff566437(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/ee381413.aspx
http://msdn.microsoft.com/en-us/library/hh553920.aspx
made by correy
made at 2014.06.11
homepage:http://correy.webs.com
*/
typedef NTSTATUS (WINAPI * NtDeleteKey_FN) (IN HANDLE KeyHandle);
NtDeleteKey_FN NtDeleteKey;
void __cdecl _tmain(void)
{
MessageBox(0, L"请附加调试器", L"调试专用", 0);
//注意位置及权限。
HKEY hkResult;
LONG L = RegCreateKeyEx(HKEY_LOCAL_MACHINE, L"Software\\link", 0, NULL, REG_OPTION_CREATE_LINK | REG_OPTION_VOLATILE, KEY_ALL_ACCESS | KEY_CREATE_LINK, NULL, &hkResult, NULL);
if (L != ERROR_SUCCESS)
{
MessageBox(0,0,0,0);
}
//注意名字及值。
wchar_t * link = L"\\Registry\\MACHINE\\system\\CurrentControlSet";//这个必须是存在的,可以是系统的,也可以是自己创建的。
L = RegSetValueEx(hkResult, L"SymbolicLinkValue", 0, REG_LINK, (BYTE *)link, (lstrlen(link))* sizeof(wchar_t));//不可 + 1
if (L != ERROR_SUCCESS)
{
MessageBox(0,0,0,0);
}
//这个是删除不掉链接的,好像是和句柄及其属性有关。
L = RegDeleteKey(HKEY_LOCAL_MACHINE, L"Software\\link");
if (L != ERROR_SUCCESS)
{
MessageBox(0,0,0,0);
}
//这样也是删除不掉的。
L = RegDeleteKey(hkResult, 0);
if (L != ERROR_SUCCESS)
{
MessageBox(0,0,0,0);
}
/*
看来只有这样删除了,注意传递给函数的句柄所具有的权限及属性。
注意:
1.这只删除的是这个链接,这个链接所代表的值及内容(键和子键等)没有删除。
2.权限正确(REG_OPTION_OPEN_LINK)还可以删除某些知名的ARK不能删除的不正确的符号链接。
*/
HMODULE hinstLib = LoadLibrary(TEXT("ntdll.dll")); // Get a handle to the DLL module.
if (hinstLib != NULL) // If the handle is valid, try to get the function address.
{
NtDeleteKey = (NtDeleteKey_FN) GetProcAddress(hinstLib, "NtDeleteKey");
if (NULL != NtDeleteKey) // If the function address is valid, call the function.
{
int status = NtDeleteKey(hkResult);
if(status != 0)
{
printf("NtDeleteKey fail!");
}
} else {
printf("find NtDeleteKey fail");
}
FreeLibrary(hinstLib); // Free the DLL module.
} else {
printf("Load ntdll.dll fail");
}
//RegCloseKey(hkResult);
}
2014年6月11日星期三
注册表的符号链接
订阅:
博文评论 (Atom)
没有评论:
发表评论