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

今天在看之前收藏的一个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的测试按钮

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE5数字孪生制作-数据篇(二) - 数据处理

1.卫星图与DEM高度图坐标一致处理 https://www.bilibili.com/video/BV1op4y1V71r?p4&vd_source707ec8983cc32e6e065d5496a7f79ee6 坐标系的调整 先把工程默认坐标调整下&#xff0c;建议调整到3857&#xff0c;在菜单的设置&#xff08;s&#xff09;里找到&#xff0c;修…

java excel、word、PPT转换成pdf预览

先引入包&#xff1a;[lib下载地址](https://mp.csdn.net/mp_download/manage/download/UpDetailed)Controllerpublic AjaxResult fileToPdf(RequestBody VerifyCode url, HttpServletResponse response, HttpServletRequest request) throws IOException {String fileUrl req…

Jupyter Notebook 内核似乎挂掉了,它很快将自动重启

报错原因&#xff1a; OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade perfo…

户外台灯设计:照亮你的户外空间

在一个温暖的夏夜&#xff0c;能够在户外享受美味的晚餐是一种特殊的愉悦。这种露天用餐的体验不仅让你感受大自然的美丽&#xff0c;还提供了独特的放松感。为了让这个时刻更加难忘&#xff0c;户外台灯的用途与设计至关重要。 户外台灯能够创造出温馨的氛围&#xff0c;为用餐…

第六章 :Spring Boot web开发常用注解(一)

第六章 &#xff1a;Spring Boot web开发常用注解&#xff08;一&#xff09; 前言 本章节知识重点&#xff1a;作者结合自身开发经验&#xff0c;以及觉察到的一个现象&#xff1a;Springboot注解全面理解和掌握的并不多&#xff0c;对注解进行了全面总结&#xff0c;共分两个…

(三)、MySQL索引

一、索引基础 索引是存储引擎用于快速找到记录的一种数据结构。(可以理解为一本书的目录)。 例子&#xff1a;where id1 如果在id列上建有索引&#xff0c;则MySQL将使用该索引找到id为1的行&#xff0c;也就是说&#xff0c;MySQL先在索引上按值进行查找&#xff0c;然…

kernel32.dll是什么 ,分享一些解决kernel32.dll丢失的修复方法

kernel32.dll丢失&#xff1f;电脑突然出现这样的弹窗错误是为什么&#xff1f;那么kernel32.dll是什么的东西呢&#xff1f;今天就带大家了解小编对于kernel32.dll的理解和作用&#xff0c;同时在给小伙伴们分享一些解决kernel32.dll丢失的修复方法。 一.对Kernel32.dll的理解…

【Springboot】基于注解式开发Springboot-Vue3整合Mybatis-plus实现分页查询

系列文章目录 文章目录 系列文章目录系统版本实现功能操作步骤1. 新建Mybatis的全局分页配置文件2. 编写OrderMapper :继承Mybatis-plus提供的BaseMapper3. 编写OrderServiceImpl&#xff0c;实现OrderService4. 编写OrdersController 控制类 发送接口请求测试 系统版本 后端&…

《未来之路:技术探索与梦想的追逐》

创作纪念日 日期&#xff1a;2023年07月05日文章标题&#xff1a;《从零开始-与大语言模型对话学技术-gradio篇&#xff08;1&#xff09;》成为创作者第128天 在这个平凡的一天&#xff0c;我撰写了自己的第一篇技术博客&#xff0c;题为《从零开始-与大语言模型对话学技术-…

JTS: 18 DistanceToPoint 最近距离计算

这里写目录标题 版本代码 版本 org.locationtech.jts:jts-core:1.19.0 链接: github 代码 import org.locationtech.jts.algorithm.distance.DistanceToPoint; import org.locationtech.jts.algorithm.distance.PointPairDistance; import org.locationtech.jts.geom.Coordin…

遇到问题[已解决]TypeError: ‘odict_keys‘ object is not subscriptable

背景 运行CPD代码时&#xff0c;由于源代码踊跃python2.7&#xff0c;但是我的是3.8出现报错 【Python3】【报错】- TypeError: ‘dict_keys‘ object is not subscriptable-CSDN博客 原因&#xff1a; 在Python3中&#xff0c;keys()方法不允许切片 VGG代码如下 解决办法: 就…

Exploration by random network distillation论文笔记

Exploration by Random Network Distillation (2018) 随机网络蒸馏探索 0、问题 这篇文章提出的随机网络蒸馏方法与Curiosity-driven Exploration by Self-supervised Prediction中提出的好奇心机制的区别&#xff1f; 猜想&#xff1a;本文是基于随机网络蒸馏提出的intrin…

手撕数据库连接池

1.有开源的数据库连接池&#xff0c;你为啥不用&#xff1f; 这个不是因为闲的没事干&#xff0c;先说下需求背景 我们有一个数据源管理模块&#xff0c;配置的数据源连接&#xff0c;用户名&#xff0c;密码等信息 在数据源管理模块配置好之后&#xff0c;去另一个模块选择数…

【探索】HelloGitHub上面推荐几个程序我的真实体验与收藏

第一个项目——体验成为操作系统 youre-the-os&#xff1a;模拟计算机操作系统的游戏。这是一个 Python 写的 Web 游戏&#xff0c;在游戏中玩家扮演的是一台计算机的操作系统。玩家必须通过管理进程、内存和 I/O 事件&#xff0c;不让进程闲置太久&#xff0c;因为进程等待太…

Linux系统服务器日常运维常用系统监控指令

常用系统监控指令 1. top命令1.1 命令语法1.2 命令选项1.3 命令详解 2. free命令2.1 命令语法2.2 命令选项2.3 命令详解 3. df命令3.1 命令语法3.2 命令选项3.3 命令详解 4. ps命令4.1 命令语法4.2 命令选项4.3 命令详解 5. crontab命令6. 查看端口命令6.1 netstat命令6.2 lsof…

RFID智慧物流设计解决方案

物流行业需求 物流是将物质资料从供应者运送到需求者的物理运动过程&#xff0c;涉及运输、保管、包装、装卸、流通加工、配送以及信息等多个基本活动的统一整合&#xff0c;在经济全球化和电子商务的推动下&#xff0c;快递物流和医药物流成为现代物流的两大重要产业。随着智…

报错信息Update your application‘s configuration

在使用Maven项目时&#xff0c;有一个报错信息是&#xff1a;Update your applications configuration 这类问题&#xff0c;就是我们的application.yml文件 或者 application.properties文件 内容哪里写错了 我的问题是格式对齐方式出错&#xff0c;如下&#xff1a; 修改过后…

Javascript知识点详解:对象的继承、原型对象、原型链

目录 对象的继承 原型对象概述 构造函数的缺点 prototype 属性的作用 原型链 constructor 属性 instanceof 运算符 构造函数的继承 多重继承 对象的继承 面向对象编程很重要的一个方面&#xff0c;就是对象的继承。A 对象通过继承 B 对象&#xff0c;就能直接拥有 B …

PHP的curl会话

介绍: Curl&#xff08;Client for URLs&#xff09;在PHP中是一个强大而灵活的工具&#xff0c;用于进行各种网络请求。PHP中的Curl库允许开发者通过代码模拟HTTP请求、与API交互、进行数据传输等。在这里&#xff0c;我们将详细解析PHP中Curl会话的各个方面&#xff0c;涵盖…

Ubuntu18.04 安装docker教程

Ubuntu18.04 安装docker教程 1、前言 Docker Engine-Community 支持以下的 Ubuntu 版本&#xff1a; Xenial 16.04 (LTS)Bionic 18.04 (LTS)Cosmic 18.10Disco 19.04 Docker Engine-Community 支持以下CPU架构&#xff1a; x86_64&#xff08;或 amd64&#xff09;armhfarm…