前言

老婆喜欢在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功能

远程注入并Hook Api

更方便的封装

上面的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 == ? : type);
}
}

代码下载

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

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

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

c# r3 inline hook的更多相关文章

  1. android inline hook

    最近终于沉下心来对着书把hook跟注入方面的代码敲了一遍,打算写几个博客把它们记录下来. 第一次介绍一下我感觉难度最大的inline hook,实现代码参考了腾讯GAD的游戏安全入门. inline ...

  2. 对付ring0 inline hook

    对付ring0 inline hook的基本思路是这样的,自己写一个替换的内核函数,以NtOpenProcess为例,就是MyNtOpenProcess.然后修改SSDT表,让系统服务进入自己的函数M ...

  3. Inline Hook NtQueryDirectoryFile

    Inline Hook NtQueryDirectoryFile 首先声明这个是菜鸟—我的学习日记,不是什么高深文章,高手们慎看. 都总是发一些已经过时的文章真不好意思,几个月以来沉迷于游戏也是时候反 ...

  4. 在已有软件加壳保护 下实现 Inline hook

    如写的不好请见谅,本人水平有限. 个人简历及水平:. http://www.cnblogs.com/hackdragon/p/3662599.html 正常情况: 接到一个项目实现对屏幕输出内容的获取 ...

  5. windows 32位以及64位的inline hook

    Tips : 这篇文章的主题是x86及x64 windows系统下的inline hook实现部分. 32位inline hook 对于系统API的hook,windows 系统为了达成hotpatc ...

  6. Inline Hook

    @author: dlive IAT Hook时如果要钩取的API不在IAT中(LoadLibrary后调用),则无法使用该技术.而Inline Hook不存在这个限制. 0x01 Inline Ho ...

  7. INLINE HOOK过简单驱动保护的理论知识和大概思路

    这里的简单驱动保护就是简单的HOOK掉内核API的现象 找到被HOOK的函数的当前地址在此地址处先修改页面保护属性然后写入5个字节.5个字节就是一个简单的JMP指令.这里说一下JMP指令,如下: 00 ...

  8. x86平台inline hook原理和实现

    概念 inline hook是一种通过修改机器码的方式来实现hook的技术. 原理 对于正常执行的程序,它的函数调用流程大概是这样的: 0x1000地址的call指令执行后跳转到0x3000地址处执行 ...

  9. Android Hook框架adbi的分析(2)--- inline Hook的实现

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/74452308 一. Android Hook框架adbi源码中inline Hoo ...

随机推荐

  1. Google Guava之--cache

    一.简介 Google Guava包含了Google的Java项目许多依赖的库,如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives support ...

  2. Same Tree

    Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...

  3. loop指令

    loop系列的指令有:loop,loope/loopz,loopne/loopnz,它们都是借助于ECX寄存器作为计数来实现循环,每轮循环先ecx自动减1,再来判断ecx值,ecx的自减不会影响OF和 ...

  4. HBase 专题技术收录

    HBase系列: 博客地址:http://www.cnblogs.com/panfeng412/tag/HBase/ 技术专题文章: HBase中MVCC的实现机制及应用情况 HBase在单Colum ...

  5. GoLang 的 daemonize 实现

    func daemonize(cmd string, args []string, pipe io.WriteCloser) error { pid, _, sysErr := syscall.Raw ...

  6. hdu-5929 Basic Data Structure(双端队列+模拟)

    题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  7. HDU 4782 Beautiful Soup --模拟

    题意: 将一些分散在各行的HTML代码整理成标签树的形式. 解法: 模拟,具体见代码的讲解. 开始没考虑 '\t' .. 代码: #include <iostream> #include ...

  8. 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列

    一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...

  9. 【shiro】shiro学习笔记1 - 初识shiro

    [TOC] 认证流程 st=>start: Start e=>end: End op1=>operation: 构造SecurityManager环境 op2=>operati ...

  10. Java常用类库——Runtime

    runtime运行时候,是封装了一个JVM进程的类,每一个JAVA程序实际上启动了一个JVM进程,那么每个JVM对应一个runtime实例.此实例是由JVM为其实例化. 本类的定义中没有构造方法,因为 ...