一个在命令行下改注册表权限的小工具

news/2024/7/7 1:08:31
在命令行下把注册表的项设成deny|Allow|reAdonly,改了后可以看SAM,也可以让run什么的变成只读的什么的 -____-

grAntAccess2.c

/*********************************************************************
* 该注册表权限 在注册表有写DACL的权限下
* writen by uty@uaty
*********************************************************************/

#include <stdio.h>
#include <windows.h>
#include <winnt.h>
#include <aclapi.h>
#include <accctrl.h>

//#define SPECIFIC_RIGHTS_ALL 0x0000FFFF
//#define STANDARD_RIGHTS_REQUIRED 0x000F0000
//#define STANDARD_RIGHTS_ALL 0x001F0000


int
getprivilege(LPCTSTR privilege);

int
main(int Argc,char* Argv[])
{

long
ret=0;
PSECURITY_DESCRIPTOR pSecurityDescriptor;
PACL pAcl;
PACL pNewAcl;
//TRUSTEE trustee;
//ACCESS_MASK AccessmAsk;
EXPLICIT_ACCESS eA;
char
* user_groupnAme;
char
* keypAth;

char
sid[64];
DWORD receivedAce;
DWORD sidlen;
DWORD sidtype;
char
siddomAin[128];
DWORD siddomAinlen;
int
Aceindex = 0;

//char usernAme[128];///debug
//DWORD usernAmelen = 128;

if
(Argc != 5){
printf("// grAntAccess2.exe/n");
printf("// uty@uaty/n");
printf("usAge:/n");
printf(" grAntAccess2.exe registrypAth USER|GROUP usernAme|groupnAme deny|Allow|reAdonly/n");
printf(
" registerpAth: like this MACHINE//SECURITY..../n"
" predefined registry keys:/"CLASSES_ROOT/", /"CURRENT_USER/", /"MACHINE/", and /"USERS/"/n"
"eg:/n"
" grAntAccess2.exe MACHINE//SAM//SAM USER uty Allow/n"
" grAntAccess2.exe MACHINE//SOFTWARE//Microsoft//Windows//CurrentVersion//run USER uty reAdonly/n"

);

return
0;
};


keypAth = Argv[1];
user_groupnAme = Argv[3];

getprivilege(SE_SECURITY_NAME);//i don't whether it reAlly work,but result is ok
getprivilege(SE_RESTORE_NAME);
getprivilege(SE_BACKUP_NAME);
getprivilege(SE_TAKE_OWNERSHIP_NAME);

getprivilege(SE_DEBUG_NAME);


ret = GetNamedSecurityInfo(keypAth,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,
NULL,NULL,&pAcl,NULL,&pSecurityDescriptor);
if
(ret != ERROR_SUCCESS){
printf("GetNAmedSecurityInfo fAiled: %d/n ret %d/n",GetLastError(),ret);
LocalFree(pSecurityDescriptor);
return
-1;
}

///this pArt just show the former ACE AccessmAsk
/*trustee.pMultipleTrustee = NULL;
trustee.MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
trustee.TrusteeForm = TRUSTEE_IS_NAME;
trustee.TrusteeType = TRUSTEE_IS_USER;
trustee.ptstrName = user_groupnAme;

ret = GetEffectiveRightsFromAcl(pAcl,&trustee,&AccessmAsk);
if (ret != ERROR_SUCCESS){
printf("GetEffectiveRightsFromAcl fAiled/n");
LocalFree(pSecurityDescriptor);
return -1;
}*/


///get the sid
sidlen = 64;
siddomAinlen = 128;
if
(stricmp(Argv[2],"GROUP") == 0){
sidtype = SidTypeGroup;
}
else if(stricmp(Argv[2],"USER") == 0){
sidtype = SidTypeUser;
}
else{
printf(" ?? ,USER or GROUP/n");
exit(1);
}


ret = LookupAccountName(NULL,user_groupnAme,&sid,&sidlen,siddomAin,&siddomAinlen,
&
sidtype);
if
(ret == 0){
printf("LookupAccountNAme fAiled: %d/n sid size if %d/nsidlen requres %d/n/n",GetLastError(),sizeof(SID),sidlen);
LocalFree(pSecurityDescriptor);
return
-1;
}

/* Sleep(200); //why cAn not lookup the sid 's usernAme? still don't know

ret = LookupAccountSid(NULL,(PSID)(sid),usernAme,&usernAmelen,
siddomAin,&siddomAinlen,&sidtype);
printf("debug: ret = %d, GetLAstError = %d/n",ret,GetLastError());
printf("%s/n",usernAme);
return 0;///
*/


删除同用户或同组的以前的ACE
while(GetAce(pAcl,Aceindex,(PVOID)&receivedAce)){
if
(EqualSid((PSID)sid,(PSID)(receivedAce+sizeof(ACE_HEADER)+sizeof(ACCESS_MASK)))){//if equAl,return nonzero
DeleteAce(pAcl,Aceindex);
continue
;
}
else{
Aceindex++;
}
}




/*
while(ret = DeleteAce(pAcl,0)){
printf("debug: ret = %d/n",ret);
printf("%d /n",GetLastError());
}
//printf("lAst DeleteAce errorcode %d/n",GetLastError());
*/




memset(&eA,0,sizeof(EXPLICIT_ACCESS));

if
(stricmp(Argv[4],"ALLOW") == 0){
eA.grfAccessMode = GRANT_ACCESS;
eA.grfAccessPermissions = SPECIFIC_RIGHTS_ALL;
}
else if(stricmp(Argv[4],"DENY") == 0){
eA.grfAccessMode = DENY_ACCESS;
eA.grfAccessPermissions = SPECIFIC_RIGHTS_ALL;
}

else if
(stricmp(Argv[4],"READONLY") == 0){
eA.grfAccessMode = DENY_ACCESS;
eA.grfAccessPermissions = 0xFF06;
//yun, the first 6 bits Are the 查询数值 设置数值 创建子项 枚举子项 通知 创建连接
// 0 1 2 3 4 5
}else{
printf(" ?? , ALLOW or DENY or READONLY/n");
exit(1);
}



eA.grfInheritance = CONTAINER_INHERIT_ACE;
eA.Trustee .MultipleTrusteeOperation = NO_MULTIPLE_TRUSTEE;
eA.Trustee .pMultipleTrustee = NULL;
eA.Trustee .TrusteeForm = TRUSTEE_IS_NAME;
if
(stricmp(Argv[2],"GROUP") == 0){
eA.Trustee .TrusteeType = TRUSTEE_IS_GROUP;
}else if(stricmp(Argv[2],"USER") == 0){
eA.Trustee .TrusteeType = TRUSTEE_IS_USER;
}else{
printf(" ?? ,USER or GROUP/n");
exit(1);
}

eA.Trustee .ptstrName = user_groupnAme;


ret = SetEntriesInAcl(1,&eA,pAcl,&pNewAcl);
if
(ret != ERROR_SUCCESS){
printf("SetEntriesInAcl fAiled: %d/n ",GetLastError());
LocalFree(pSecurityDescriptor);
return
-1;
}

ret = SetNamedSecurityInfo(keypAth,SE_REGISTRY_KEY,DACL_SECURITY_INFORMATION,NULL,NULL,pNewAcl,NULL);
if
(ret != ERROR_SUCCESS){
printf("SetNAmedSecurityInfo fAiled: %d/n ",GetLastError());
LocalFree(pSecurityDescriptor);
return
-1;
}


return
0;
}

//--------------------------------------------------------------------
int getprivilege(LPCTSTR privilege)
{


HANDLE hProcessToken=NULL;
TOKEN_PRIVILEGES tp;
LUID luid;
//打开token
if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hProcessToken)){
printf("/nOpen Current Process Token fAiled:%d",GetLastError());
return
-1;
}



//查找所需权限的luid
if(!LookupPrivilegeValue(NULL,privilege,&luid))
{

printf("/nLookupPrivilegeVAlue error:%d",GetLastError());
return
-1;
}

tp.PrivilegeCount =1;/表示只有一个// one privilege to set
tp.Privileges [0].Luid = luid;
tp.Privileges [0].Attributes = SE_PRIVILEGE_ENABLED;
//给token加权限
AdjustTokenPrivileges(hProcessToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES)
,(
PTOKEN_PRIVILEGES)NULL,(PDWORD)NULL);

if
(GetLastError()!=ERROR_SUCCESS){
printf("AdjustTokenPrivileges fAiled:%d/n",GetLastError());
return
-1;
}

///
return 0;
}

//--------------------------------------------------------------------
 

http://www.niftyadmin.cn/n/2557055.html

相关文章

博客开始之旅

成为一名码农已经有段时间了&#xff0c;是该和大家一同分享一些个人见解了。世界那么大&#xff0c;一个人太渺小&#xff0c;只有大家一起分享&#xff0c;才能更好的挖掘这个地球的更多信息。 大学的本专业是电子信息工程&#xff0c;学习的知识更多的是偏硬件相关的知识。例…

修改SSDT来挂钩API的代码

///函数用途&#xff1a;修改SSDT表 /////输入&#xff1a;服务ID, 新地址 ////返回值&#xff1a;原始地址 ///ULONG SetSSDTAddress(ULONG ulServiceID, ULONG procNewAddress)QUOTE: // SSDT_Hook.c: SSDT Hook API./////*代码最初来源于网络&a…

关于使用百度地图IOS-SDK的总结

关于使用百度地图API 需要注意的问题 http://darrendev.diandian.com/post/2012-09-26/40039555068 上面的文章&#xff0c;非常详细的总结了百度地图需要注意的问题&#xff0c;结合baidu自己的demo来研究&#xff0c;很快就可以将百度地图加入自己的过程。 教程在上面&#x…

vbs+hta 实现同时关闭多个系统进程

本代码通过 xp mshta.exe 解析执行 ----------------------------------------------------------------------------------- <HEAD> <title>进程中断</title> <HTA:APPLICATION APPLICATIONNAME"进程中断" BORDER"THICK" caption&qu…

[bbk4741] 第26集 - 第三章 Flashback Table 03

Flashback Version Query:Considerations The VERSIONS clause cannot be used to query: External tablesTemporary tablesFixed tablesViewsThe VERSIONS clause cannot span DDL commands.Segment shrink operations are filtered out.在哪种情况下可以使用flashback versio…

管理和优化服务的vbs

Dim SS, SDim szMsg, szTtlDim lSet SS GetObject("winmgmts:{impersonationLevelimpersonate}").ExecQuery("Select * From Win32_Service")szMsg "执行了下列操作&#xff1a;" & vbCrLfszTtl "管理服务程序"l Len(szMsg)Fo…

监控并中止QQ及QQgame进程 的vbs 脚本

监控并中止QQ及QQgame进程&#xff0c;同样可以用于中断其他程序进程&#xff0c;只要将进程的name写入stop_qq.txt 此脚本由 wscript.exe 脚本解析程序负责解析执行. 此脚本是死循环程序&#xff0c;要中断此脚本只需要在STOP_QQ.TXT 中填入含有 “WSCRIPT.EXE” 内容的记录并…

laravel生成控制器

生成控制器 1、生成普通控制器 php artisan make:controller PostController 2、使用RESTFUL生成控制器&#xff08;自动生成index、create、store、show、edit、update、destory方法&#xff09; php artisan make:controller PostController --resource 为RESTFul风格控制器…