有没有办法改进这个库中的挂钩功能

Posted

技术标签:

【中文标题】有没有办法改进这个库中的挂钩功能【英文标题】:Is there a way to improve the hooking functionality in this library 【发布时间】:2020-03-09 23:41:52 【问题描述】:

链接:https://github.com/xcvd/Detours

在 Hooks.cs 中我们调用原始函数。

在这个库中,它是通过将挂钩地址的字节反转回原始字节来完成的。

这里的问题是,如果您每 500 毫秒或更短的时间内有 1000 次调用,那么它会导致错误,并会造成内存问题和崩溃,或者由于未接来电而导致非常糟糕的错误。

那么有没有办法防止这种情况发生?

我很幸运地将这个库用于没有那么多调用的函数,比如每秒 50 个调用。

这是一种非常好的与非托管方式与 .net 交互的方式。 比 EasyHook、Deviare 等简单得多。

使用 x86 应用程序。

public object CallOriginal(params object[] args)
        
            this.Uninstall();
            var ret = this.targetDelegate.DynamicInvoke(args);
            this.Install();
            return ret;
                
public bool Install()
        
            try
            
                Memory.Write(this.target, this.newBytes);
                return true;
            
            catch (Exception)
            
                return false;
            
                
public bool Uninstall()
        
            try
            
                Memory.Write(this.target, this.originalBytes);                
                this.IsInstalled = false;                
                return true;
            
            catch (Exception)
            
                return false;
            
        

挂钩就是这样完成的。


        public Hook(Delegate target, Delegate hook)
                    
            this.target = Marshal.GetFunctionPointerForDelegate(target);
            this.targetDelegate = target;
            this.hook = Marshal.GetFunctionPointerForDelegate(hook);

            this.originalBytes = new byte[6];
            Marshal.Copy(this.target, this.originalBytes, 0, 6);

            var hookPointerBytes = BitConverter.GetBytes(this.hook.ToInt32());
            this.newBytes = new byte[]
                
                   0x68, hookPointerBytes[0], hookPointerBytes[1], hookPointerBytes[2], hookPointerBytes[3], 0xC3 
                ;                                 
        

【问题讨论】:

【参考方案1】:

想出了如何解决。 我只需要分配一个新的内存区域,然后复制被覆盖的原始函数字节并在被覆盖的字节之后返回。 我必须定义多少字节,因为我没有逻辑来检测正在使用的操作码。 我还进行了调整,通过检测字节是否为 0 来允许使用原始方法或新方法。

【讨论】:

以上是关于有没有办法改进这个库中的挂钩功能的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法像在 C++ 中挂钩非托管函数一样在 C# 中挂钩托管函数?

有没有办法像在 C++ 中挂钩非托管函数一样在 C# 中挂钩托管函数?

有啥办法可以为windows下的进程挂钩整个绘图功能?

有没有办法改进这个查询

关于 Linux 中的共享库,有没有办法在库中选择导出函数?

有没有办法将分页器控件附加到扩展库中的 dynamicViewPanel?