c# r3 inline hook

摘要:
果心dll函数远程注入和HookApi更方便的封装。主要的。上面的dll用于远程注入。果心dll是弯路的封装,也是的加载器。网络组件。使其更易于使用核心。dll,我编写了一个名为coreNet的程序集。dll使用。网它是核心导出函数的封装。dll中。它提供了APiHook、WindowHook和注入相关的方法。

前言

老婆喜欢在QQ游戏玩拖拉机,且安装了一个记牌器小软件,打开的时候弹出几个IE页面加载很多广告,于是叫我去掉广告。想想可以用OD进行nop填充,也可以写api hook替换shellexecute函数的调用,以前也有见过有人使用hex editor修改shellexecute函数的,但搞了多年C#,其它很多原来就不熟悉的都忘记了,迫于无奈于是选择Api Hook这个方式。选择这Api Hook也面临很多难题,如何远程注入,如何让远程进程加载.net的程序集,.net程序集如何完成Api的hook工作,网上查到微软的detours库,可以满足APi Hook需求,由于非班科出身,所以从0基础开始使用VC对detours库进行封装和导出给.net进行pinvoke调用(以前搞delphi去了)。

解决方案

1、使用C++编写Core.dll这个动态连接库,封装detours库的函数并导出,同时开启C++/CLI,使用托管代码编写反射加载和执行外部.Net程序集的Main入口函数;

2、外部.Net程序集使用pinvoke调用Core.dll来完成Api Hook;

3、再编写一个Main.dll动态连接库,dllMain创建线程加载Core.dll,使Core.dll加载和运行指定的.Net程序集。

Core.dll功能

c# r3 inline hook第1张

远程注入并Hook Api

c# r3 inline hook第2张

更方便的封装

上面的main.dll是给远程注入使用的,core.dll是detours的封装,也是.net程序集的加载器,为了更容易使用core.dll,我使用.net写了一个叫coreNet.dll的程序集,是对core.dll的导出函数的封装,提供了APi Hook、Window Hook,还有注入相关方法。

创建进程并注入DotNet_ApiHook.dll例子:

Inject.InjectToProcess("TargetProcess.exe", null, "DotNet_ApiHook.dll");

DotNet_ApiHook.dll 代码例子,下面是Hook住MessageBoxW函数:

    public class Program
    {  
        [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode)]
        private delegate int MessageBoxW(IntPtr hwnd, string text, string caption, int type);

        private static HookResult<MessageBoxW> messageBoxW;

        /// <summary>
        /// 程序集入口函数
        /// </summary>
        /// <param name="args"></param>
        public static void Main(string[] args)
        {            
            messageBoxW = Hook.HookApi<MessageBoxW>("user32.dll", "MessageBoxW", MessageBoxW_Proxy);            
        }

        private static int MessageBoxW_Proxy(IntPtr hwnd, string text, string caption, int type)
        {
            return messageBoxW.TargetApi.Invoke(hwnd, "[Hook]" + text, "[Hook]" + caption, type == 0 ? 1 : type);
        }
    }


代码下载 

当然,所有代码,包括我蹩脚的非托管代码部分,还有网上抄写的,以及.Net的,都拿出给大家看看,工程已经放在了https://github.com/xljiulang/HookSln

如果你想只下载编译好的可以 点击这里下载

其它工程:高性能高可扩展性Socket组件

免责声明:文章转载自《c# r3 inline hook》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇CentOS6.6安装及配置vsftpd文件服务器MAC-下安装php-redis扩展下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【C#】使用OWIN创建Web API

OWIN的介绍 OWIN 的全称是 "Open Web Interface for .NET", OWIN 在 .NET Web 服务器和 .NET Web 应用之间定义了一套标准的接口, 其目的是为了实现服务器与应用之间的解耦,使得便携式 .NET Web 应用以及跨平台的愿望成为现实, 标准的 OWIN 应用可以在任何 OWIN 兼容的服务器上运行,...

Maven 梳理 -多模块 vs 继承

Maven提高篇系列之(一)——多模块 vs 继承     这是一个Maven提高篇的系列,包含有以下文章:    Maven提高篇系列之(一)——多模块 vs 继承 Maven提高篇系列之(二)——配置Plugin到某个Phase(以Selenium集成测试为例) Maven提高篇系列之(三)——使用自己的Repository(Nexus) Mave...

EFCore梳理

一、CodeFirst模式 官网:https://docs.microsoft.com/zh-cn/ef/core/get-started/overview/first-app?tabs=visual-studio 下面进行一个简单的示例。 代码:https://github.com/qiuxianhu/EFCoreSummary 1、创建一个.NETCo...

Nuxt+Express后端api接口配置与实现方式

Nuxt.js 是一个基于 Vue.js 的轻量级应用框架,可用来创建服务端渲染 (SSR) 应用。本文带你了解在 Nuxt.js 中使用 Express 如何编写实现后端的 api 接口。 创建接口文件 在项目根目录中新建 server 文件夹并在该文件夹下创建一个 index.js 文件。 server └── index.js 然后,在 serve...

Qt5模块化详细总结

Qt 5 与 Qt 4 最大的一个区别之一是底层架构有了修改。Qt 5 引入了模块化的概念,将众多功能细分到几个模块之中。Qt 4 也有模块的概念,但是是一种很粗的划分,而 Qt 5 则更加细化。本节主要对 Qt 5 的模块进行一个简单的介绍,以便以后大家需要哪些功能的时候知道到哪个模块去寻找。 Qt 5 模块分为Essentials Modules 和A...

.Net使用Redis详解之ServiceStack.Redis(七)

序言本篇从.Net如何接入Reis开始,直至.Net对Redis的各种操作,为了方便学习与做为文档的查看,我做一遍注释展现,其中会对list的阻塞功能和事务的运用做二个案例,进行记录学习。 Redis官方推荐的.NET驱动类库为Service.Stack.Redis。然而网上对这个类库的中文文档不是很全面与合理,这篇文章主要就对这个类库做注释展现。不足遗漏...