Chinaunix首页 | 论坛 | 博客
  • 博客访问: 522334
  • 博文数量: 184
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-21 13:40
个人简介

技术改变命运

文章分类

全部博文(184)

文章存档

2020年(16)

2017年(12)

2016年(156)

我的朋友

分类: Windows平台

2020-08-26 21:03:17

Windows程序开机启动的方式有很多,但是通过注册表启动应该是最简单的方式了。

注册表

注册表(Registry,繁体中文版Windows操作系统称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。早在Windows 3.0推出OLE技术的时候,注册表就已经出现。随后推出的Windows NT是第一个从系统级别广泛使用注册表的操作系统。但是,从Microsoft Windows 95操作系统开始,注册表才真正成为Windows用户经常接触的内容,并在其后的操作系统中继续沿用至今。 在这里插入图片描述

打开注册表

打开方式很多,个人习惯用搜索方式打开,用cmd也很方便。 在这里插入图片描述

注册表的数据结构

注册表由(也叫主键或称“项”)、子键(子项)和项构成。一个键就是分支中的一个文件夹,而子键就是这个文件夹当中的子文件夹,子键同样它也是一个键。一个值项则是一个键的当前定义,由名称、数据类型以及分配的值组成。一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值。

注册表的数据类型主要有以下四种:显示类型(在编辑器中)数据类型说明: REGSZ:字符串:文本字符串 REGMULTISZ:多字符串值:含有多个文本值的字符串 REGBINARY:二进制数:二进制值,以十六进制显示, REG_DWORD:双字值;一个32位的二进制值,显示为8位的十六进制值。

注册表的根键

从下图中的注册表编辑器(Win7系统)中可以看出注册表的根键有5个,在Win98和95系统中还有一个根键HKEYDTNDATA。

  1. HKEYCLASSESROOT:存储在这里的信息可确保使用 Windows 资源管理器打开文件时能打开正确的程序。此项有时缩写为“HKCR”。
  2. HKEYCURRENTUSER:包含当前登录的用户的配置信息的根目录。该用户的文件夹、屏幕颜色和“控制面板”设置都存储在这里。这些信息与用户的配置文件相关联。此项有时缩写为“HKCU”。
  3. HKEYLOCALMACHINE:包含特定于计算机的配置信息(用于任何用户)。此项有时缩写为“HKLM”。
  4. HKEYUSERS:包含计算机上的所有以活动方式加载的用户配置文件。HKEYCURRENTUSER 是 HKEYUSERS 的子项。HKEY_USERS 有时缩写为“HKU”。
  5. HKEYCURRENTCONFIG:包含有关本地计算机在系统启动时使用的硬件配置文件的信息。
  6. HKEYDTNDATA:动态信息,包括即插即用的硬件信息。(仅存在于 Windows 95 及 98 中)

在这里插入图片描述HKEYLOCALMACHIN和HKEYUSERS根键是注册表中的两大根键,其余的根键都是他们派生的,实际上他们都是这两大根键下面的某些自键的映射。如HKEYCLASSROOT是HKEYLOCALMACHINE下SOFTWARE/Classes子键的映射,HKEYCURRENTCONFIG根键是HKEYLOCAL_MACHINE下Config子键的映射。

注册表本质

我们看到的注册表结构是经过注册表编辑器读取之后呈现给我们的,其磁盘形式并不是一个简单的大文件,而是一组称被为HⅣE的单独文件形式,HⅣE中文名曰“储巢”。每个HⅣE文件可以被理解为一棵单独注册表树,就像Windows的PE格式一样,它也有自己的组织形式。

注册表编程

在下面的表哥中列出了注册表中常用的API及其功能。

API 功能
RegCreateKey 创建一个KEY,并返回相应的HKEY
RegOpenKey 打开注册表,得到一个HKEY,用来作为下面这些函数的第一个参数。
RegOpenKeyEx 同RegOpenKey类似,一般很少用,增加了一个访问控制类型参数。
RegSetValue 设置一个HKEY的默认值
RegSetValueEx 设置一个HKEY除默认值以外其它的值
RegQueryValue 获取一个HKEY的默认值
RegQueryValueEx 获取一个HKEY除默认值以外其它的值
RegDeleteKey 删除一个KEY,此KEY不能包含子KEY
SHDeleteKey 删除一个KEY以及所有子KEY
RegDeleteValue 删除KEY里面的值
RegCloseKey 关闭注册表

开机启动

Windows通过注册表设置开机启动

在注册表中定位到“计算机\HKEYLOCALMACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run",可以看出VBoxTRay会在开机时候启动。 在这里插入图片描述 查看进程如下:

在这里插入图片描述如果想要仅下一次开机运行,之后都不再运行可以在“计算机\HKEYLOCALMACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce”中操作。

开机启动源代码

下面的代码通过开机自启动execel和本应用程序,使用的方式是在键"\HKEYLOCALMACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run"写值。同时,还有注册表常用的一些操作。

  1. #include
  2. #include
  3. using namespace std;
  4. int WriteReg(char* path, char* key, char* value);
  5. /************************************
  6. @ Brief: 开机启动
  7. @ Author: 无情剑客
  8. @ Created: 2020/08/25 传统节日七夕
  9. @ Return:
  10. ************************************/
  11. void autostart()
  12. {
  13. //1. 开启启动execel
  14. WriteReg("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", "execel", "C:\\Program Files (x86)\\Office 2007\\Office12\\EXCEL.exe");
  15. //2、得到本程序自身的全路径
  16. TCHAR strExeFullDir[MAX_PATH];
  17. GetModuleFileName(NULL, strExeFullDir, MAX_PATH);
  18. //3. 开机启动当前程序
  19. WriteReg("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", "Register", strExeFullDir);
  20. }
  21. /************************************
  22. @ Brief: 打开注册表,读取Key对应value
  23. @ Author: 无情剑客
  24. @ Created: 2020/08/25 传统节日七夕
  25. @ Return:
  26. ************************************/
  27. int ReadReg(char* path, char* key, char* value)
  28. {
  29. HKEY hKey;
  30. int ret = RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_EXECUTE, &hKey);
  31. if (ret != ERROR_SUCCESS)
  32. {
  33. cout << "打开注册表失败" << endl;
  34. return 1;
  35. }
  36. //读取KEY
  37. DWORD dwType = REG_SZ; //数据类型
  38. DWORD cbData = 256;
  39. ret = RegQueryValueEx(hKey, key, NULL, &dwType, (LPBYTE)value, &cbData);
  40. if (ret == ERROR_SUCCESS)
  41. {
  42. cout << value << endl;
  43. }
  44. else
  45. {
  46. cout << "读取注册表中KEY 失败" << endl;
  47. RegCloseKey(hKey);
  48. return 1;
  49. }
  50. RegCloseKey(hKey);
  51. return 0;
  52. }
  53. /************************************
  54. @ Brief: 写注册表,如不存在自动创建
  55. @ Author: 无情剑客
  56. @ Created: 2020/08/25 传统节日七夕
  57. @ Return:
  58. ************************************/
  59. int WriteReg(char* path, char* key, char* value)
  60. {
  61. HKEY hKey;
  62. DWORD dwDisp;
  63. DWORD dwType = REG_SZ; //数据类型
  64. int ret = RegCreateKeyEx(HKEY_CURRENT_USER, path,0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hKey, &dwDisp);
  65. if (ret != ERROR_SUCCESS)
  66. {
  67. cout << "创建注册表失败" << endl;
  68. return 1;
  69. }
  70. ret == RegSetValueEx(hKey, key, 0, dwType, (BYTE*)value, strlen(value));
  71. if (ret != ERROR_SUCCESS)
  72. {
  73. cout << "注册表中创建KEY VALUE失败" << endl;
  74. RegCloseKey(hKey);
  75. return 1;
  76. }
  77. RegCloseKey(hKey);
  78. return 0;
  79. }
  80. /************************************
  81. @ Brief: 删除注册表
  82. @ Author: 无情剑客
  83. @ Created: 2020/08/25 传统节日七夕
  84. @ Return:
  85. ************************************/
  86. int DelReg(char* path)
  87. {
  88. int ret = RegDeleteKey(HKEY_CURRENT_USER, path);
  89. if (ret == ERROR_SUCCESS)
  90. {
  91. cout << "删除成功" << endl;
  92. }
  93. else
  94. {
  95. cout << "删除失败" << endl;
  96. return 1;
  97. }
  98. return 0;
  99. }
  100. int main(int argc, char * argv[])
  101. {
  102. char value[32] = {0};
  103. autostart();
  104. WriteReg("Software\\burning", "微信公众号", "无情剑客");
  105. ReadReg("Software\\burning", "微信公众号", value);
  106. // C++ 程序暂停,等待用户输入回车后再继续执行
  107. cin.get();
  108. return 0;
  109. }

运行结果如下,当开机之后,Register程序和execl的都启动起来了。 在这里插入图片描述

写在最后

注册表之强大超出想象。玩过Dota的都知道Win7之后,游戏不能全屏,其实游戏画面的分辨率就是在注册表中设置的,因此可以通过注册表来实现全屏,文件关联设置也可以通过注册表来实现,Windows的用户帐号密码也都在注册表中有记录,当然密码是散列的,还有很多强大的功能。。。

注册表设置开机启动,很容易被检测出来,但是如果把进程隐藏起来,甚至于注册表文件隐藏起来,那就不是很容易检测了。

公众号

更多内容,欢迎关注我微信公众号:无情剑客。

在这里插入图片描述

阅读(1528) | 评论(0) | 转发(0) |
0

上一篇:Frida之API使用(2)

下一篇:Frida进阶之路-API

给主人留下些什么吧!~~