2014年6月11日星期三

注册表的符号链接

#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);
}

没有评论:

发表评论