API实现了regedt32修改注册表权限(幻影 zzzevazzz)

来源:互联网 发布:华为云计算工程师招聘 编辑:程序博客网 时间:2024/04/27 13:53
昨天想找个system权限修改注册表的例子,感谢eva写了一个 不过小榕ca.exe的源代码到底公布了没有 我还真是忘记了


不要老是盯着SYSTEM权限。SYSTEM固然通行无阻,但访问SAM这种事有admin足够了。
虽然admin不能直接访问SAM,但可以获取访问权限。

我给个例子你自己修改吧。

Codz:

#include <Windows.h>
#include <Aclapi.h>

#pragma comment (lib,"Advapi32.lib")

void main()
{
    
DWORD dwRet;
    
LPSTR SamName "MACHINE//SAM//SAM";
    
PSECURITY_DESCRIPTOR pSD NULL;
    
PACL pOldDacl NULL;
    
PACL pNewDacl NULL;
    
EXPLICIT_ACCESS ea;
    
HKEY hKey NULL;

    
// 获取SAM主键的DACL
    
dwRet GetNamedSecurityInfo(SamNameSE_REGISTRY_KEYDACL_SECURITY_INFORMATION,
                
NULLNULL, &pOldDaclNULL, &pSD);
    if (
dwRet != ERROR_SUCCESS)
    {
        
printf("GetNamedSecurityInfo Error: %d/n"dwRet);
        
goto FreeAndExit;
    }

    
// 创建一个ACE,允许Everyone完全控制对象,并允许子对象继承此权限
    
ZeroMemory(&easizeof(EXPLICIT_ACCESS));
    
BuildExplicitAccessWithName(&ea"Everyone"KEY_ALL_ACCESSSET_ACCESS,
        
SUB_CONTAINERS_AND_OBJECTS_INHERIT);

    
// 将新的ACE加入DACL
    
dwRet SetEntriesInAcl(1, &eapOldDacl, &pNewDacl);
    if (
dwRet != ERROR_SUCCESS)
    {
        
printf("SetEntriesInAcl Error: %d/n"dwRet);
        
goto FreeAndExit;
    }

    
// 更新SAM主键的DACL
    
dwRet SetNamedSecurityInfo(SamNameSE_REGISTRY_KEYDACL_SECURITY_INFORMATION,
                
NULLNULLpNewDaclNULL);
    if (
dwRet != ERROR_SUCCESS)
    {
        
printf("SetNamedSecurityInfo Error: %d/n"dwRet);
        
goto FreeAndExit;
    }

    
// 打开SAM的子键
    
dwRet RegOpenKeyEx(HKEY_LOCAL_MACHINE"SAM//SAM//Domains//Account//Users//000001F4",
                
0KEY_ALL_ACCESS, &hKey);
    if (
dwRet != ERROR_SUCCESS)
    {
        
printf("RegOpenKeyEx Error: %d/n"dwRet);
        
goto FreeAndExit;
    }

    
printf("Open SAM Subkey Successfully./n");

FreeAndExit:
    if (
hKeyRegCloseKey(hKey);
    if (
pNewDaclLocalFree(pNewDacl);
    
// 还原SAM主键的DACL
    
if (pOldDaclSetNamedSecurityInfo(SamNameSE_REGISTRY_KEYDACL_SECURITY_INFORMATION,
                        
NULLNULLpOldDaclNULL);
    if (
pSDLocalFree(pSD);
    return;
}


这段代码其实是通过调用API实现了regedt32修改权限的功能。

P.S. 本来想用RegGetKeySecurity和RegSetKeySecurity的,但SetEntriesInAcl的时候总是“参数错误”,不知道问题出在哪里,郁闷。