#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)
没有评论:
发表评论