C#动态拦截并覆盖第三方进程的函数,实现函数篡改(外挂)

news2024/9/20 22:27:52

今天在看之前收藏的一个pdf文档(介绍C#外挂的相关知识的),结合网上的东西及个人的理解才有了这篇文章。

参考文章:

【精选】一文带解读C# 动态拦截覆盖第三方进程中的函数(外挂必备)_zls365365的博客-CSDN博客

DotNetDetour - 万能的开源 .NET 代码 Hook 神器

测试环境:

visual studio 2017

.net framework 4.0

测试步骤如下:

一    第三方客户端程序编写(即要被篡改函数的客户端)

1.1  新建名为TargetClient的winform窗体应用程序,.net framework选4.0

1.2 新建类TargetTestClass,并编辑如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TargetClient
{
    public class TargetTestClass
    {
        public string Test()
        {
            return "hello world";
        }
    }
}

其中Test方法就是我们要篡改的方法

1.3  在默认的Form1窗体拖入一个按钮,并把按钮名称改为"测试",如下图:

1.4  按钮点击方法如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace TargetClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string ret=new TargetTestClass().Test();
            MessageBox.Show(ret);
        }
    }
}

1.5  运行并点击"测试"按钮输出英文的hello world,如下图:

二  注入客户端程序编码

2.1  新建名为InjectClient的winfrom窗体程序,.net framework选4.0

2.2  添加Jlion.DotNetDetour包引用,如下图:

2.3  添加名为InjectClass的类,并继承IMethodHook接口,用于编辑覆盖被篡改方法的逻辑,如下:

using DotNetDetour;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace InjectClient
{
    public class InjectClass:IMethodHook
    {
        //TargetClient.TargetTestClass这个要被篡改方法的TargetTestClass类的全路径(即TargetClient.exe客户端中的类TargetTestClass的全路径,即命名空间+类名)
        //Test为被篡改的方法名,要保持一致
        [HookMethod("TargetClient.TargetTestClass")]
        public string Test()
        {
            return "世界,你好呀";
        }
        //实现一个占位方法,要被覆盖的原方法,命名格式为:被篡改的方法名+_Original
        [OriginalMethod]
        public string Test_Original()
        {
            return null; //这里写什么无所谓,能编译过即可
        }

    }
}

注意:

TargetClient.TargetTestClass这个要被篡改方法的TargetTestClass类的全路径(即TargetClient.exe客户端中的类TargetTestClass的全路径,即命名空间+类名)

Test为被篡改的方法名,要保持一致

Test_Original是要被覆盖的原方法,命名格式为:被篡改的方法名+_Original

2.3  新建方法安装注册类HookService,为注入做准备,并编辑如下:

using DotNetDetour;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace InjectClient
{
    public class HookService
    {
        /// <summary>
        /// 必须为静态方法
        /// </summary>
        /// <param name="paramValue">暂时没用到</param>
        /// <returns></returns>
        public static int Start(string paramValue)
        {
            try
            {
                MethodHook.Install();
            }
            catch
            {
                return -1;
            }
            return 1;
        }
    }
}

其中Start方法的名称根据你的喜好来起,但该方法必须是静态方法。

2.4  方法都准备好了,那就要编写注入的逻辑了,安装注入包FastWin32,如下图:

2.5  新增注入服务类InjectService,并编辑如下:

using FastWin32.Diagnostics;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace InjectClient
{
    public class InjectService
    {
        //注入的核心dll 路径
        public static string path = AppDomain.CurrentDomain.BaseDirectory + "InjectClient.exe";

        /// <summary>
        /// 进程id
        /// </summary>
        public static uint pid = 0;

        /// <summary>
        /// 启动
        /// </summary>
        public static void Start()
        {
            Inject();
        }


        #region 私有方法
        private static void Inject()
        {
            try
            {
                Injector.InjectManaged(pid, path, "InjectClient.HookService", "Start", "测试参数,暂时没用到", out int returnValue);
                MessageBox.Show("注入成功了呀");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        #endregion
    }
}

其中InjectClient.HookService这个名称是前面安装注册类HookService的(命名空间+类名)

Start是前面安装注册类HookService的Start方法名称

2.3  在Form1界面中拖入一个文本标签、文本框和一个按钮,布局及名称如下图:

并编辑代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace InjectClient
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        /// <summary>
        /// 注入按钮的逻辑
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnInject_Click(object sender, EventArgs e)
        {
            //获取界面输入的进程Id
            InjectService.pid = Convert.ToUInt32(this.txtPid.Text.Trim());
            InjectService.Start();
        }
    }
}

2.4  生成项目备用

三  综合测试

3.1  运行要被篡改的客户端程序TargetClient.exe,如下图:

可以看到被篡改前输出还是英文的hello world

3.2  运行注入程序InjectClient.exe

3.3 打开window的任务管理器,找到TargetClient.exe对应的进程Pid,如下图:

可以看到TargetClient.exe对应的进程Pid为27580,你的大概率不是这个

3.4  把TargetClient.exe对应的进程Pid为27580输入到注入程序InjectClient.exe中并点击注入按钮,如下图,可以看到注入成功了

3.5  再来点击TargetClient.exe的测试按钮

可以看到输出中文的世界你好了,证明方法被成功注入。

这就可以干很多坏事了,如把别人的系统登录方法该篡改了(不管是混淆过或者没被混淆过的代码,都有方法拿到,这里就不展开了),你懂的

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

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

相关文章

【经验模态分解】4.信号由时域向频域的转换

/*** poject 经验模态分解及其衍生算法的研究及其在语音信号处理中的应用* file 傅里叶变换与小波变换* author jUicE_g2R(qq:3406291309)* * language MATLAB* EDA Base on matlabR2022b* editor Obsidian&#xff08;黑曜石笔记软件&#…

Git的进阶操作,在idea中部署gie

&#x1f3c5;我是默&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; ​​ &#x1f31f;在这里&#xff0c;我要推荐给大家我的专栏《git》。&#x1f3af;&#x1f3af; &#x1f680;无论你是编程小白&#xff0c;还是有一定基础的程序员&#xff0c;这…

CCIA数安委等组织发布PIA星级标识名单,合合信息再次通过数据安全领域权威评估

近期&#xff0c;“中国网络安全产业联盟&#xff08;CCIA&#xff09;数据安全工作委员会”、“数据安全共同体计划&#xff08;DSC&#xff09;”等组织共同发起“个人信息保护影响评估专题工作&#xff08;简称“PIA专题工作”&#xff09;”&#xff0c;并为入围企业颁发了…

交通信号标志识别系统 python 深度学习 YOLOv5

[毕业设计]2023-2024年最新最全计算机专业毕设选题推荐汇总 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮助更多的人 。 1、项目介绍 本系统基于YOLOv5&#xff0c;采用登录注册进行用…

查找或替换excel换行符ctrl+j和word中的换行符^p,^l

一、excel中 直接上图。使用ctrlh调出替换&#xff0c;查找内容里按ctrlj&#xff08;会出现一个闪的小点&#xff09;&#xff0c;即为换行符。 二、word中 在word中&#xff0c;^p和^l分别代表换行符&#xff08;enter&#xff09;和手动换行符&#xff08;使用shiftenter&…

Spring高手之路16——解析Spring XML配置的BeanDefinition源码

文章目录 1. BeanDefinition阶段的分析2. 加载xml配置文件2.1 XML配置文件中加载bean的代码示例2.2 setConfigLocations - 设置和保存配置文件路径2.3 refresh - 触发容器刷新&#xff0c;配置文件的加载与解析2.4 loadBeanDefinitions - 具体的BeanDefinition加载逻辑2.5 load…

java数据结构--阻塞队列

目录 一.概念 二.生产者消费者问题 三.阻塞队列接口BlockingQueue 四.基于数组实现单锁的阻塞队列 1.加锁方式 2.代码实现 3.解释说明 (1).offer添加元素 &#xff08;2&#xff09;poll取出元素 4.timeout超时时间 5.测试 五.基于数组实现双锁的阻塞队列 1.问题 …

数据的使用、表关系的创建、Django框架的请求生命周期流程图

目录 一、数据的增删改查 1. 用户列表的展示 2. 修改数据的逻辑分析 3. 删除功能的分析 二、如何创建表关系 三、Django的请求生命周期流程图 一、数据的增删改查 1. 用户列表的展示 把数据表中得用户数据都给查询出来展示在页面上 查询数据 def userlist(request):&qu…

luckysheet的使用——14.开启表格只读模式(所有单元格无法编辑)

开启只读模式后&#xff0c;所有的单元格都无法编辑&#xff0c;与非编辑模式做区分。 1.在src/global/api.js文件中&#xff0c;新增开启只读模式的方法&#xff1a; /*** 开启工作表只读模式(所有单元格无法编辑)*/ export function setWorkBookReadOnly() {Store.allowEdi…

Docker部署ubuntu1804镜像详细步骤

Docker部署ubuntu1804镜像详细步骤 ubuntu镜像库地址&#xff1a;https://hub.docker.com/_/ubuntu/tags?page1&ordering-name 拉取镜像&#xff08;默认为最新版本&#xff09;&#xff1a; docker pull ubuntu或&#xff0c;拉取指定版本镜像&#xff1a; docker pull…

P1529 [USACO2.4] 回家 Bessie Come Home 题解

文章目录 题目描述输入格式输出格式样例样例输入样例输出 提示完整代码 题目描述 现在是晚餐时间&#xff0c;而母牛们在外面分散的牧场中。 Farmer John 按响了电铃&#xff0c;所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓&#xff08;在给出的测试数…

【文件IO】认识文件

文章目录 认识文件文件的结构和目录文件路径 认识文件 我们先来认识狭义上的文件(file)&#xff0c;针对硬盘这种持久化存储的I/O设备&#xff0c;当我们想要进行数据保存时&#xff0c;往往不是保存一个整体&#xff0c;而是独立成一个个单位进行保存&#xff0c;这个独立的单…

人工智能技术的高速发展,普通人如何借助AI实现弯道超车?

人工智能技术的高速发展&#xff0c;普通人如何借助AI实现弯道超车&#xff1f; 随着互联网信息传播的爆炸&#xff0c;人类科技文明的快速发展“人工智能”成为新的话题&#xff0c;科技的进步也让普通人觉得自己与社会脱节&#xff0c;找工作越来越难&#xff0c;创业越来越难…

前端开发学习指南

前端是一个看似入门门槛不高&#xff0c;但要学好很难的领域。前端的知识体系庞杂又松散&#xff0c;技术演进快&#xff0c;如果摸不清脉络的话很容易陷入盲人摸象的困境甚至跑偏。 其实只要掌握了正确的方法&#xff0c;学习前端和学好前端就只是个时间问题&#xff0c;希望下…

阻塞队列和定时器的使用

阻塞队列 谈到队列,大家就能想到队列的先进先出原则,但有些特殊的队列,虽然也是先进先出的,但是带有阻塞功能,我们把这种队列叫做阻塞队列. ★如果队列为空,执行出队操作就会阻塞,阻塞到另外一个线程往队列里添加元素(队列不为空)为止. ★如果队列满了,执行入队操作时,也会阻…

网工内推 | 运维工程师,软考认证优先,全额社保

01 北京中科网威信息技术有限公司 招聘岗位&#xff1a;运维工程师 职责描述&#xff1a; 1 熟悉网络安全标准&#xff0c;等级保护管理制度 2 负责等级保护管理制度的的企业管理要求编写&#xff1b; 3 熟系网络组网和相关安全产品&#xff1b; 4 负责用户需求挖掘、分析和…

关于锁策略

常见的锁策略悲观锁乐观锁读写锁轻量级锁、重量级锁自旋锁公平锁和非公平锁可重入锁 vs 不可重入锁synchronized是什么锁呢&#xff1f; 常见的锁策略 锁策略不仅仅限制于Java;其它锁相关的也是会涉及这些策略;这些特性主要是在实现锁的时候运用的。虽然我们的工作可能就是把轮…

中断处理程序的延迟可能导致中断标志位仍然被置位

当中断处理程序的执行时间超过了中断事件的频率时&#xff0c;可能出现中断标志位仍然被置位的情况。让我们来详细解释一下这种情况。 在一个典型的系统中&#xff0c;中断处理程序会在中断事件发生时被触发执行。中断处理程序负责处理中断事件&#xff0c;并可能执行一系列操…

sjvisualizer,一个超强的Python数据可视化动画库

大家好&#xff0c;今天给大家介绍一个非常棒的数据可视化库&#xff0c;sjvisualizer。 根据时间序列数据制作动态图表&#xff0c;包含条形图、饼图、堆叠条形图、折线图、堆叠面积图。 可以先看一下官方的示例~ 只需几行代码&#xff0c;就可以制作电脑浏览器发展史的动态…

使用jmeter进行简单压力测试

前言 最近项目要上线,需要项目进行简单的压力测试,本次使用的是jmeter来进行的,由于本人不是专业测试,只是对本次使用过程进行简单的记录. 一.jemeter的下载与安装 我这个已经安装很久了,具体过程这个可以查询下其他博客(偷个懒). 二.使用过程 1.测试计划右击-添加(add)-线…