怎样建立网站赚钱,网站建设简单,windows 用wordpress,wordpress自定义html5一、前言由于项目需要#xff0c;最近研究了一下跨进程通讯改写第三方程序中的方法#xff08;运行中#xff09;#xff0c;把自己程序中的目标方法直接覆盖第三方程序中的方法函数#xff1b;一直没有头绪#xff0c;通过搜索引擎找了一大堆解决方案#xff0c;资料甚… 一、前言由于项目需要最近研究了一下跨进程通讯改写第三方程序中的方法运行中把自己程序中的目标方法直接覆盖第三方程序中的方法函数一直没有头绪通过搜索引擎找了一大堆解决方案资料甚是稀少最后功夫不负有心人经过两天的研究终于在github 上找到两个开源的代码通过两个开源代码结合起来即可实现我的需求。下面进一步来分析实践原理后面会把源代码地址贴上来通过该文章分享你会知道怎样通过注入一个dll模块改写第三方运行的程序中的某个方法在里面实现自己的业务这个场景在做外挂程序中特别实用!!!二、场景假如有一个第三方应用程序这时候需要对第三方应用程序进行方法拦截比如第三方应用程序中的某个操作需要用我们的业务覆盖掉他们的业务那这种情况下我们有什么好的方案解决呢我们不可能修改第三方程序的代码那有什么方案可以解决呢其实我们还是有办法进行”修改“第三方程序的代码的怎么”修改“呢请看下面实践原理下面带你走入不一样的代码世界三、实践原理简化图:这里实践我就直接写两个客户端程序来进行代码上的演示3.1. 实现原理Hook 目标方法需要改写拦截第三方程序的指定的方法那就得需要Hook 该方法经过查找资料在github上找到开源代码DotNetDetour,但是开源作者是从.net framework 4.5开始支持不支持.net framework 4.0, 我的需求需要运行在老爷机xp 上,故必须要支持4.0 的框架所有我fork了一份把源代码做了修改支持到了.net framework 4.0 框架fork 源代码地址https://github.com/a312586670/DotNetDetourInject 注入dll到目标进程 写好针对目标进程的方法Hooke dll 模块后需要考虑把该dll模块注入到第三方程序进程中这样才可以实现完全的hook成功改写目标进程的方法我这里使用fastWin32 开源代码代码地址如下https://github.com/a312586670/FastWin323.2 创建第三方程序Demo这里为了演示我自己创建了一个目标客户端程序主要有如下核心代码方法public class ProcessService
{public string GetProcessInfo(){return 这是TargetClient 客户端第三方程序;}public ProcessResponse GetProcessInfo(ProcessRequest request){return new ProcessResponse(){Name 这是TargetClient 客户端第三方程序,Version request.Version};}
}
UI界面交互代码如下 /// summary/// MainWindow.xaml 的交互逻辑/// /summarypublic partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void btnInfo_Click(object sender, RoutedEventArgs e){var service new ProcessService();this.txtInfo.Text service.GetProcessInfo();}private void btnComplateInfo_Click(object sender, RoutedEventArgs e){var service new ProcessService();var response service.GetProcessInfo(new ProcessRequest() { Version v-Demo 1.0 版本 });this.txtInfo.Text response.Name response.Version;}}
上面代码中有两个按钮事件分别调用了ProcessService 的两个方法我们先来运行目标客户端Demo程序分别点击两个按钮运行结果如下3.3 创建核心Hook类库好了上面我们的目标第三方Demo程序已经写好了接下来我们需要写一个核心的Jlion.Process.HookCore类库 改写目标的ProcessService 的两个方法。我这里建了一个Jlion.Process.HookCore类库通过nuget包引用我fork 后的DotNetDetour 类库如下图应用成功后我们建立核心的hook 方法代码如下 public class ProcessHookService : IMethodHook{[HookMethod(Jlion.Process.Target.Client.ProcessService, null, null)]public string GetProcessInfo(){TextHelper.LogInfo($这是Jlion.Process.HookCore.HookService dll. 改写TargetClient 客户端 的GetProcessInfo 方法后得到的结果);return 这是Jlion.Process.HookCore.HookService dll. 改写TargetClient 客户端 的GetProcessInfo 方法后得到的结果;}[OriginalMethod]public string GetProcessInfo_Original(){return null;}[HookMethod(Jlion.Process.Target.Client.ProcessService, null, null)]public object GetProcessInfo([RememberType(Jlion.Process.Target.Client.Model.ProcessRequest, false)] object request){var json JsonConvert.SerializeObject(request);TextHelper.LogInfo($json:{json});var name 这是Jlion.Process.HookCore.HookService dll. 改写TargetClient 客户端的GetProcessInfo(obj)后得到的结果;return new ProcessResponse(){Name name,Version 改写的dll 版本};}[OriginalMethod]public object GetProcessInfo_Original([RememberType(Jlion.Process.Target.Client.Model.ProcessRequest, false)] object request){return null;}}
我这里就不详细的写DotNetDetour 的使用需要知道它的使用可以访问 https://github.com/a312586670/DotNetDetour 查看具体的文档核心的Jlion.Process.HookCore hook 类库 也已经创建完了接下来还需要创建一个初始化Hook的服务类特别重要,并且还必须是静态方法代码如下 public class HookService{/// summary/// Hook 初始化/// /summary/// param namemsg/param/// returns/returnspublic static int Start(string msg){try{TextHelper.LogInfo(开始msg);MethodHook.Install();}catch{return -1;}return 1;}}
到这一步基本上Jlion.Process.HookCore Hook 核心的类库已经创建完了3.4 模块注入客户端程序创建客户端后需要引用FastWin32类库如下图:客户端注入Dll核心代码如下public class InjectService
{//注入的核心dll 路径public static string path AppDomain.CurrentDomain.BaseDirectory Jlion.Process.HookCore.dll;/// summary/// 进程id/// /summarypublic static uint pid 0;/// summary/// 启动/// /summarypublic static void Start(){Inject();}#region 私有方法private static void Inject(){try{Injector.InjectManaged(pid, path, Jlion.Process.HookCore.HookService, Start, ss, out int returnValue);}catch (Exception ex){}}#endregion}
代码中核心的代码是Injector.InjectManaged(),该方法有如下两个重构方法参数说明processId目标进程的进程id -pidassemblyPath核心Hook 注入的dll 绝对路径typeNameHook 初始化方法的命名空间一般注入一个模块dll后需要执行的入口初始化方法这里是Hook 核心dll 中的HookService.Start 方法的命名空间Jlion.Process.HookCore.HookServicemethodName : 注入后执行的方法名称argument : 方法所需要的参数returnValue返回注入后运行的方法返回值客户端UI 核心代码如下:/// summary/// MainWindow.xaml 的交互逻辑/// /summarypublic partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void btnInject_Click(object sender, RoutedEventArgs e){InjectService.pid Convert.ToUInt32(txbPid.Text.Trim());InjectService.Start();}}
这里核心的注入Client Demo 也写完了,我们把注入的客户端也运行起来输入目标的进程pid也可以程序中查找目标进程Id,运行后再来执行上面创建的第三方程序的两个按钮结果如下通过编写客户端程序点击注入dll后再点击第三方程序的两个按钮事件结果如下可以看到点击后运行的结果已经被动态注入的Jlion.Process.HookCore.dll改写了不过上面的代码也可以改写后同时还运行原有目标的方法就是通过调用_Original后缀结尾的方法方法体返回null即可。四、总结通过DotNetDetour 框架可以编写对目标进程的方法进行Hook 重写使用新的方法覆盖第三方进程的方法也可以继续执行第三方的方法。通过FastWin32调用Win32 API 把开发的dll模块注入到第三方进程中同时注入后执行初始化方法可以进行原有的Hook方法进行覆盖。到这里是不是感觉很神奇它可以在以下场景中使用想必大家想到的就是外挂程序通过改写目标程序的方法进行外挂处理写上自己的覆盖业务灰产地带比较实用破解第三方收费软件等等用途感兴趣的朋友可以下载Demo 源代码玩一玩github 源代码地址https://github.com/a312586670/processClientDemo往期精彩回顾【.net core】电商平台升级之微服务架构应用实战.Net Core微服务架构技术栈的那些事Asp.Net Core 中IdentityServer4 授权中心之应用实战Asp.Net Core 中IdentityServer4 授权中心之自定义授权模式Asp.Net Core 中IdentityServer4 授权流程及刷新TokenAsp.Net Core 中IdentityServer4 实战之 Claim详解Asp.Net Core 中IdentityServer4 实战之角色授权详解Asp.Net Core 中间件应用实战中你不知道的那些事Asp.Net Core Filter 深入浅出的那些事-AOPAsp.Net Core EndPoint 终结点路由工作原理解读ASP.NET CORE 内置的IOC解读及使用