一.实现目标:在第三方应用程序运行时,启动应用程序监控第三方应用程序指定函数方法,在指定函数方法被调用时,拦截该方法并可修改函数方法的内容及返回值。

二.背景条件

  1. 应用程序是.Net应用程序
  2. 拦截程序和第三方应用程序在同一设备上
  3. 知悉第三方应用程序调用的函数方法名称及传参和返回值

二使用开源类库:

  1. DotNetDetour :生成Hook,将被拦截函数方法实现替换为拦截程序中设置的实现
  2. FastWin32  :      将Hook注入到第三方程序中

三.使用方法

3.1第三方函数实现

public class ProcessService
{
public ProcessResponse GetProcessInfo(ProcessRequest request)
{
return new ProcessResponse()
{
Name = "这是TargetClient 客户端(第三方程序)",
Version = request.Version
};
}
}

  

3.2Hook部分

引用DotNetDetour类库,并在覆盖类内引用IMethodHook接口,按如下格式实现,“GetProcessInfo”为第三方程序需要被拦截的函数名称,“”“GetProcessInfo_Original”为占位方法,此部分内容为原始方法是否实现的内容,为空即可

//被覆盖后的函数实现
[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 版本"
};
}
//实现一个占位方法,此方法代表被Hook覆盖的原始方法
[OriginalMethod]
public object GetProcessInfo_Original([RememberType("Jlion.Process.Target.Client.Model.ProcessRequest", false)] object request)
{
return null;
}
 

  

3.3 注入部分

在拦截程序启动部分需引用FastWin32类库,负责将Hook内容注入到第三方程序中,具体操作为调用Injector.InjectManaged函数,截图如下:

参数含义:

  • processId:目标进程的进程id ->pid
  • assemblyPath:核心Hook 注入的dll 绝对路径
  • typeName:Hook 初始化方法的命名空间
  • methodName : 注入后执行的方法名称
  • argument : 方法所需要的参数
  • returnValue:返回注入后运行的方法返回值

3.4Hook生效

引用DotNetDetour,调用下列函数:

  1. MethodHook.Install();

 

3.5  在上述操作操作执行完成后,拦截程序与第三方程序都在运行状态下时可测试,  实例Demo下载

 

写这个的目的更多的是记录下自己学习的过程,详细内容可查看下方链接,写的很详细,超赞

参考资料:https://www.cnblogs.com/jlion/p/12897963.html

posted on 2020-05-22 11:39  Khandasas  阅读(447)  评论(0编辑  收藏  举报