热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

注冊表操作

那100~泪奔[2014101623:11]代码通过改动注冊表,使程序可以在系统登录时执行。比較了一下不同编码方式下的情况,可以使用差分工具看一下变化。


    那100~泪奔[2014/10/16 23:11]

    代码通过改动注冊表,使程序可以在系统登录时执行。

比較了一下不同编码方式下的情况,可以使用差分工具看一下变化。

    1. 代码设置的编码为Unicode,注冊表中显示的是乱码

// RegEdit.cpp : 定义控制台应用程序的入口点。

// #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { wchar_t regname[]=L"Software\\Microsoft\\Windows\\CurrentVersion\\Run"; HKEY hkResult; int ret; //TODO 为了方便。进行了强转 const unsigned char * SetValue=(const unsigned char *)"%java_home%\\door.exe"; ret=RegOpenKey(HKEY_CURRENT_USER,regname,&hkResult); //打开keyword ret=RegSetValueEx(hkResult,L"door",0,REG_SZ,SetValue,sizeof(SetValue)); //设置键值 if(ret==0){ printf("success to write run key \n"); //RegCloseKey(hkResult); } else{ printf("fail to write run key \n"); return 1; } wchar_t modlepath[256]; wchar_t syspath[256]; GetModuleFileName(NULL,modlepath,sizeof(modlepath)); printf("%s",modlepath); //取得程序的名字 GetSystemDirectory(syspath,256); ret=CopyFile(modlepath,(wchar_t *)strcat((char*)syspath,"\\door.exe"),1); if(ret){ printf("%s has been copyed to dir %s \n",modlepath,syspath); } else{ printf("%s is exist",modlepath); } return 0; }


    2. 设置ASCII编码,同一时候简单改动程序代码。

// RegEdit.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[])
{char regname[]="Software\\Microsoft\\Windows\\CurrentVersion\\Run";HKEY hkResult;int ret;//TODO 为了方便,进行了强转const unsigned char * SetValue=(const unsigned char *)"%systemroot%\\RegEdit.exe";ret=RegOpenKey(HKEY_CURRENT_USER,regname,&hkResult);//打开keyword//新建了一个环境变量systemroot,值设定为C:\Windows\System32ret=RegSetValueEx(hkResult,"reg",0,REG_SZ,SetValue,sizeof("%systemroot%\\RegEdit.exe"));//设置键值if(ret==0){printf("success to write run key \n");//RegCloseKey(hkResult);}else{printf("fail to write run key \n");return 1;}char modlepath[256];char syspath[256];GetModuleFileName(NULL,modlepath,sizeof(modlepath));printf("%s",modlepath);//取得程序的名字GetSystemDirectory(syspath,256);ret=CopyFile(modlepath,strcat(syspath,"\\RegEdit.exe"),1);if(ret){printf("%s has been copyed to dir %s \n",modlepath,syspath);}else{printf("%s is exist",modlepath);}return 0;
}

  3.程序执行的效果图
        

    能够看一下注冊表中。确实多了程序中的键值。

以及Windows/System32文件夹下的RegEdit.exe文件。程序里有一处写错了。相信大家能发现的。


相关的函数说明:

1.函数原型: DWORD GetModuleFileName( HMODULE hModule, LPTSTR lpFilename, DWORD nSize ); 函数參数说明: hModule HMODULE 装载一个程序实例的句柄。

假设该參数为NULL,该函数返回该当前应用程序全路径。   lpFileName LPTSTR 是你存放返回的名字的内存块的指针。是一个输出參数   nSize DWORD 。装载到缓冲区lpFileName的最大值   函数返回值:   假设返回为成功,将在lpFileName的缓冲区其中返回对应模块的路径。假设所为的nSize过小。哪么返回仅按所设置缓冲区大小返回对应字符串内容。

  假设函数失败,返回值将为0。并返回GetLastError异常代码。

  须要的头文件为:   include Windows.h


 2. 函数CopyFile原型

BOOL CopyFile( LPCTSTR lpExistingFileName, // pointer to name of an existing file
LPCTSTR lpNewFileName, // pointer to filename to copy to
BOOL bFailIfExists // flag for operation if file exists
);
当中各參数的意义:
LPCTSTR lpExistingFileName, // 你要拷贝的源文件名称
LPCTSTR lpNewFileName, // 你要拷贝的目标文件名称
BOOL bFailIfExists // 假设目标已经存在。不拷贝(True)并返回False,覆盖目标(false) //复制文件c:\log.txt到d:\log.txt,假设D:\log.txt已经存在,就覆盖
CopyFile("c:\\log.txt","d:\\log.txt",false);

4. 注冊表的读操作

// RegRead2.cpp : 定义控制台应用程序的入口点。

// #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { long lRet; HKEY hKey; TCHAR tchData[64]; DWORD dwSize; //打开注冊表 lRet=RegOpenKeyEx( HKEY_LOCAL_MACHINE, "Hardware\\Description\\System\\CentralProcessor\\0", 0, KEY_QUERY_VALUE, &hKey); if(lRet==ERROR_SUCCESS){ dwSize=sizeof(tchData); lRet=RegQueryValueEx( hKey, "ProcessorNameString", NULL, NULL, (LPBYTE)tchData, &dwSize); if(lRet==ERROR_SUCCESS){ printf("CPU INFO :"); printf("\n%s",tchData); } else{ printf("\n CPU INFO UNKNOWN \n"); } } else{ printf("\n KEY OPEN FAILED \n"); } return 0; }


程序的执行效果图


 
5. 注冊表的写操作

// RegWriter.cpp : 定义控制台应用程序的入口点。

// #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { //根键、子键名称和到子键的句柄 HKEY hRoot=HKEY_LOCAL_MACHINE; char *szSubKey="Software\\Microsoft\\Windows\\CurrentVersion\\Run"; HKEY hKey; DWORD dwDisposition=REG_OPENED_EXISTING_KEY; //假设不存在就创建 LONG lRet=RegCreateKeyEx( hRoot, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisposition); if(lRet !=ERROR_SUCCESS){ return -1; } //得到当前运行文件的文件名称(包括路径) char szModule[MAX_PATH]; GetModuleFileName(NULL,szModule,MAX_PATH); //创建一个新的键值,设置键值数据为文件名称 lRet=RegSetValueEx( hKey, "SelfDemo", 0, REG_SZ, (BYTE *)szModule, strlen(szModule)); if(lRet==ERROR_SUCCESS){ printf("self run success \n"); } RegCloseKey(hKey); return 0; }


程序执行的结果:



3.打开一个注冊表LONG WINAPI RegOpenKeyEx(_In_ HKEY hKey,_In_opt_ LPCTSTR lpSubKey,_In_ DWORD ulOptions,_In_ REGSAM samDesired,_Out_ PHKEY phkResult
);hKey:能够是下面选项之中的一个HKEY_CLASSES_ROOTHKEY_CURRENT_CONFIGHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_USERSlpSubKey:打开子键的名字,该名字不区分大写和小写。同一时候能够为NULL






转:https://www.cnblogs.com/blfshiye/p/5152995.html



推荐阅读
  • Electron中使用globalShortcut模块来注册全局快捷键,以实现类似于微信和QQ按快捷键调用剪切窗口的功能。快捷键在应用程序加载完成后进行注册 ... [详细]
  • 1、概念共享内存:共享内存是进程间通信中最简单的方式之一。共享内存允许两个或更多进程访问同一块内存,就如同malloc()函数向不同进程返回了指向同一个 ... [详细]
  • 根据时间更改网站背景的脚本。热!
    我在网上找到了它,并以自己的方式对其进行了自定义;作者的功劳就在那里。实际上,这是一个用于更改背景颜色的脚本,并且在我看来& ... [详细]
  • Matlab中利用mex编译Opencv实现画板绘图功能
    图形绘制是标记和可视化数据的重要方法.通过在Matlab中集成画板绘图功能,可为科学计算提供便利.1设置Matlab支持Opencv编译操作系统:麒麟14.04(基于Ubu ... [详细]
  • *Copyright(c)2016,烟台大学计算机与控制工程学院Allrightsreserved.文件名称:字符串加密.cpp作者:彭友程完成日期&# ... [详细]
  • TLB 缓存延迟刷新漏洞 CVE201818281 解析 ... [详细]
  • 为什么需要有应用层缓冲区?muduo网络库使用IO复用,并且文件描述符使用非阻塞模式,如果使用阻塞模式那么read、write就会阻塞在 ... [详细]
  • Logistic回归主要针对输入的数据是多个,输出则是有限的数值型,多为2个分类。涉及到以下方面:1.输出yw0+w1*x1+w2*x2+..(x1,x2,是样本的 ... [详细]
  • 1、背景-在项目的实施过程中,由于有dev环境和pro环境,这时会有两个redis集群,但是部分数据从甲方的三方数据库中获取存入生产环境的redis集群中,为了方便测试和数据校验, ... [详细]
  • C#制作TextBox水印提示
    前言在使用C#的TextBox控件时,有时候会有以下需求:在用户没有输入文字时,TextBox有提示文字,如下图所示 ... [详细]
  • iOS8之后系统把UIActionSheet和UIAlertView合并为了UIAlertController,使用就不比多说了,但在使用的过程中发现样式是固定的,点 ... [详细]
  • SortalinkedlistinO(nlogn)timeusingconstantspacecomplexity.这道题属于人生中第一次对链表进行操作,首先,不同于C++中的st ... [详细]
  • Linux文件目录和权限
    Linux文件目录和权限前言:Linux一般将文件可存取的身份分为三个类别,分别是ownergroupothers,根据权限划分,每个目录都可以拥有相对身份的-rwx[可读可写可执 ... [详细]
  • JS加密解密
    leta=汪政..222RRRp767868^*%^*%344h哈哈;letb=udp.d(ud(a));//需要加密的内容letc=udp. ... [详细]
  • PNG在IE6下透明问题的解决办法
    2019独角兽企业重金招聘Python工程师标准做Web开发的朋友一定都知道PNG是一个相当不错的图片格式,但是这个好的格式却在IE6时代造成了麻烦࿰ ... [详细]
author-avatar
小森林
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有