• 自动秒收录
  • 软件:1973
  • 资讯:57811|
  • 收录网站:279872|

IT精英团

如何在C#程序中注入恶意DLL?

如何在C#程序中注入恶意DLL?

浏览次数:
评论次数:
编辑: 阳煦
信息来源: ITPUB
更新日期: 2022-09-06 15:53:22
摘要

一:背景前段时间在训练营上课的时候就有朋友提到一个问题,为什么Windbg附加到C#程序后,程序就处于中断状态了?它到底是如何实现的?其实简而言之就是线程的远程注入,这一篇就展开说一下。二:

  • 正文开始
  • 相关阅读
  • 推荐作品

00-1010前段时间我在训练营上课的时候,有朋友提到一个问题。Windbg附加到C#程序后,程序为什么会中断?到底是怎么实现的?简而言之,就是线程的远程注入。本文将就此展开论述。

00-1010

一:背景

WindBG在附加进程时会在C#进程中注入一个线程。成功注入后,它会执行一个dbgbreak()函数,其实就是int 3。这时,CPU会执行3号中断函数,挂起当前进程的所有线程。如果文字难懂,画个图大概就是这样。

没有证据可以说。接下来我们用一个简单的案例来演示一下。

00-1010先写一个简单的C#程序,不断输出时间和标签。代码如下:

内部类程序

{

静态void Main(string[] args)

{

for(int I=;我10000;我)

{

控制台。WriteLine($'{DateTime。现在},I={ I } ');

线程。睡眠(1000);

}

}

}

运行程序后,使用WinDbg附加,可以发现Command自动切换到线程8。通过K命令,可以看到顶部有一个int 3中断。截图如下:

我有个想法。既然WinDbg可以注入,为什么我的程序不能注入?现在我的程序可以注入了,我就可以做我想做的事情了。

00-1010有了自定义注入的思路,接下来的实现步骤大概是这样的。

在C#程序中注入一个线程。

让程序加载一个dll文件。

用dll做一些我想做的业务逻辑。

接下来新建一个C的动态链接库,在DLLMain入口函数的DLL_PROCESS_ATTACH事件中写一个printf函数。如果在C#程序中输出,即使成功注入,参考代码如下:

#包含Windows.h

#包含stdio.h

BOOL API entry DllMain(HMODULE HMODULE,

呼叫的原因,

保留参数

)

{

开关(ul_reason_for_call)

{

案例DLL_PROCESS_ATTACH:

printf(‘总部,总部,我已经成功渗透到内陆了!ul_reason_for_call=%d\n ',ul _ reason _ for _ call);

打破;

}

返回TRUE

}

要装载的MyInject.dll已经建成。接下来,使用Win32 API的CreateRemoteThread()实现远程注入,但是在注入之前

需要做三件事情。

  1. 获取 C# 程序的 进程句柄。

  2. 在 C# 进程中申请一块内存空间,存放加载的 path 路径。

  3. 调用 LoadLibraryW 函数在 C# 进程中实现 dll 加载。

过程有了,新建一个 C++ 控制台程序 ConsoleApplication1.exe, 整体的参考代码如下:

#include <iostream>#include <Windows.h>#include <stdio.h>#include <stdlib.h>#include <Tlhelp32.h>DWORD GetPid(const WCHAR* szName){	HANDLE hprocessSnap = NULL;	PROCESSENTRY32 pe32 = {  };	hprocessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, );	pe32.dwSize = sizeof(PROCESSENTRY32);	if (Process32First(hprocessSnap, &pe32))	{		do {			if (!wcscmp(szName, pe32.szExeFile)) {				return (int)pe32.th32ProcessID;			}		} while (Process32Next(hprocessSnap, &pe32));	}	else	{		CloseHandle(hprocessSnap);	}	return ;}int main(){	const wchar_t* path = L"D:\\net6\\ConsoleApp1\\x64\\Debug\\MyInject.dll"; //要注入的dll文件地址	//1. 获取进程ID	DWORD  procID = GetPid(L"ConsoleApp4.exe");	//2. 获取进程句柄	HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);	//3. 在目标进程中开辟一块空间	LPVOID pRemoteAdress = VirtualAllocEx(hProcess, NULL, wcslen(path) * 2, MEM_COMMIT, PAGE_READWRITE);	//4. 将 path 写入到这块空间中	BOOL bRet = WriteProcessMemory(hProcess, pRemoteAdress, path, wcslen(path) * 2, NULL);	//5. 让目标线程调用 LoadLibraryW 加载我们注入的 dll	HMODULE hModule = GetModuleHandle(L"kernel32.dll");	LPTHREAD_START_ROUTINE dwLoadAddr = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule, "LoadLibraryW");	HANDLE hThread = CreateRemoteThread(		hProcess,		NULL,		,		(LPTHREAD_START_ROUTINE)dwLoadAddr,		pRemoteAdress,		NULL,		NULL	);	//6. 函数执行完后,释放这块空间。	WaitForSingleObject(hThread, -1);	VirtualFreeEx(hProcess, pRemoteAdress, 1, MEM_DECOMMIT);	system("pause");	return ;}

万事具备,接下来我们将 ConsoleApplication1.exe 启动,可以成功观察到 ConsoleApp4.exe 上已经注入成功的输出,截图如下:


三:总结

这就是对 WinDbg 实现注入拦截的一个衍生知识,整体思路还是很明朗的,当然有注入,就有反注入,比如下面两条策略。

  1. 设置进程的保护属性。

  2. 屏蔽 或者 混淆 Win32 的 LoadLibraryW 函数。

标签:程序 进程 线程
漫谈考试成长的探索——考试策略
« 上一篇 2022-09-06
举例说明库伯内特公司的豆荚核心资源
下一篇 » 2022-09-06
  • 如何在Ubuntu中保留文件系统并备份当前开发板镜像
    0阅读 0条评论 个赞
    在Ubuntu保留文件系统或者说备份当前开发板镜像的需求在不断增加。比如Ubuntu文件系统需要安装库文件的话直接使用apt-get工具就可以下载,但由于需要下载的核心板较多,比较费时间,这时需要将安……
  • 国产核心板全志T507助力消防系统升级
    0阅读 0条评论 个赞
    9月16日下午,位于湖南长沙市区内的中国电信大楼发生火灾,建筑高度218米,现场浓烟滚滚,数十层楼体燃烧剧烈。消防救援人员赶到现场后很快将火势控制住,目前大楼火势已被扑灭,所幸未发现人员伤亡。湖南电信……
  • 教大家如何处理Spring Boot易流中的用户和群体!
    0阅读 0条评论 个赞
    1.准备工作2.用户操作2.1添加用户2.2修改用户2.3删除用户2.4查询用户3.组操作3.1添加组3.2修改组3.3删除组3.4查询组4.查看表详情虽然说我们在实际开发中,……
  • 从PG15开始WAL压缩优化
    0阅读 0条评论 个赞
    PG15传闻中的超级令人激动的功能大多数跳票了,年初我也写过一个关于PG15新功能跳票的文章。PG15BETA已经发出几个月了,似乎PG15里令人激动人心的功能不多,不过从长长的新功能列表里,……
  • 深入了解美团叶子发射器开源方案
    0阅读 0条评论 个赞
    大家好,我是树哥。之前我们有聊过「如何设计一个分布式ID发号器」,其中有讲过4种解决方案,分别是:UUID类雪花算法数据库自增主键Redis原子自增美团以第2、3种解决方案为基础,开发出……
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
  • 当我们在并行学习的时候 我们到底在学习什么?
    0阅读 0条评论 个赞
    大家好,我是鲏。前段时间,星球里一位朋友问我:鱼皮,高并发项目牵扯的知识有哪些?之前看到的一个回答:既要解决性能的问题又要考虑业务完整性,还有网络资源、服务器资源等,我不太能理解,希望鱼皮细说。我就简……
  • Java接口自动测试框架系列(1)自动测试框架
    0阅读 0条评论 个赞
    一、什么是自动化测试自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常,在设计了测试用例并通过评审之后,由测试人员根据测试用例一步步执行测试,得到实际结果与期望结果的比较。为了节省人力、……
  • 公司排班系统遇到瓶颈?我自己造一个!
    10阅读 0条评论 个赞
    本期名人堂我们有幸邀请到了白鲸开源的联合创始人代立冬先生。代立冬先生与我们分享了自己社区开源的经历,详细介绍了一个开源项目是如何加入Apache孵化器,如何在导师的辅导下慢慢孵化、成长的过程,以及自己……
  • Velox简介:一个开源的统一执行引擎
    0阅读 0条评论 个赞
    •Meta正在引入Velox,这是一个开源的统一执行引擎(unifiedexecutionengine),旨在加速数据管理系统和简化其开发。•Velox正在积极开发中,Meta在2022……
  • MySQL性能调优和优化技术
    0阅读 0条评论 个赞
    介绍MySQL是一种流行的开源数据库应用程序,它以一种有意义且易于访问的方式存储和构造数据。对于大型应用程序,庞大的数据量可能会导致性能问题。本指南提供了一些关于如何提高MySQL数据库性能的调……
  • 数据库发展史II-数据仓库
    6阅读 0条评论 个赞
    回顾数据仓库的发展历程,大致可以将其分为几个阶段:萌芽探索到全企业集成时代、企业数据集成时代、混乱时代--"数据仓库之父"间的论战、理论模型确认时代以及数据仓库产品百家争鸣时代。数据仓库理论发展历程上……
  • 谈谈动态线程池的9个场景(改进版)
    0阅读 0条评论 个赞
    大家好,我是小马哥。线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。在高并发以及大批量的任务处理场景,线程池的使用是必不可少的。……
  • 基于Flyway的数据库版本控制实践
    0阅读 0条评论 个赞
    背景大家平时在开发过程中,会用Git来进行我们的代码管理。如Git这些,使用这些版本控制系统能轻松的帮我们解决不同开发人员之间的代码冲突处理版本回退实现软件代码的CI/CD等那大家考虑过么,针对数据库……
  • SQL Server联接方式
    0阅读 0条评论 个赞
    0.参考文献MicrosoftSQLServer企业级平台管理实践看懂SqlServer查询计划1.测试数据准备参考:SqlServer中的表访问方式TableScan,IndexScan……
  • SQL Server 2005分区模板和实例
    0阅读 0条评论 个赞
    一、场景这一段时间使用SQLServer2005对几个系统进行表分区,这几个系统都有一些特点,比如数据库某张表持续增长,给数据库带来了很大的压力。现在假如提供一台新的服务器,那么我们应该如何规划……
  • SQL Server操作系统的任务调度机制
    0阅读 0条评论 个赞
    简介SQLServerOS是在Windows之上,用于服务SQLServer的一个用户级别的操作系统层次。它将操作系统部分的功能从整个SQLServer引擎中抽象出来,单独形成一层,以便为存……
  • 国产核心板全志T507助力消防系统升级
    0阅读 0条评论 个赞
    9月16日下午,位于湖南长沙市区内的中国电信大楼发生火灾,建筑高度218米,现场浓烟滚滚,数十层楼体燃烧剧烈。消防救援人员赶到现场后很快将火势控制住,目前大楼火势已被扑灭,所幸未发现人员伤亡。湖南电信……
  • 金牛座入门 MVC微服务框架开发教程:项目部署:4 微服务应用发布到Docker进行部署
    0阅读 0条评论 个赞
    前言:本篇教程,演示ASP.NETCore微服务应用程序,如何最简方式发布到Docker中部署,并运行起来。新手两个简易概念:1、映像:可以理解为Class,用于定义;2、容器:可以理解为Clas……
  • spring MVC(II)——请求处理参数和响应数据处理
    0阅读 0条评论 个赞
    1、请求处理参数1.1请求参数@RequestParam1.1.1不使用@RequestParam注解请求参数处理,不使用参数注解:1.如果请求参数名和请求处理的形参名一致,springMv……
  • i.MX8MQ自制背板无PCIe问题详解
    9阅读 0条评论 个赞
    在飞凌嵌入式OKMX8MQ-C开发板上有两个PCIe接口,对应着两个PCIe差分时钟,两路PCIe分别用作了M.2接口卡槽KEYE(P37)和KEYM(P34)。很多使用FETMX8MQ-C核心板的用……
  • 《2022 分布式数据库发展趋势研究报告》的解释
    9阅读 0条评论 个赞
    分布式数据库近年来广受关注,目前,对分布式数据库的讨论,已经从什么是分布式数据库,为什么要用分布式数据库,转变为怎样规划应用分布式数据库。但分布式数据库有3条不同的技术路线,这无疑增加了选型难度,到底……
  • SQL Server动态生成分区脚本
    0阅读 0条评论 个赞
    一、前言前段时间使用表分区比较多,虽然已经写了SQLServer合并(删除)分区解惑、SQLServer2005分区模板与实例,但是在实践中一直感觉修改SQL脚本的时间比较多,一直想抽个时间来把……
  • web端pdf编辑能力的设计与实践
    0阅读 0条评论 个赞
    本期作者顾伊凡哔哩哔哩资深开发工程师2021年加入B站,负责UP主创作激励、收益中心、电子签约平台前端建设。本文将从业务场景与技术实现等角度对“web端pdf编辑能力”进行基本的介绍。01背景B站电……
  • Javascript的异步循环打印主题
    0阅读 0条评论 个赞
    这道题,我相信很多前端从业者都知道,它本质上来说并不复杂,但是却可以有很深远的扩展,最终核心的主题其实就是异步的执行,其中对于题目的解法,还涉及到一些作用域的知识。那么我们以最简版的题目入手,逐步深入……
  • 构建docker镜像库(1):用注册表构建本地镜像库
    0阅读 0条评论 个赞
    目录一.系统环境二.前言三.使用registry搭建私有镜像仓库3.1环境介绍3.2k8smaster节点配置镜像仓库3.3k8sworker1节点配置从私有仓库上传和拉取镜像3.3.1上传镜……
最近发布资讯
更多