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

C# 有没有办法改进这个库中的挂钩功能,c#,assembly,hook,reverse-engineering,detours,C#,Assembly,Hook,Reverse Engineering,Detours,链接: 在Hooks.cs中,我们调用原始函数 在这个库中,它是通过将挂接地址的字节反转回原始字节来完成的 这里的问题是,如果您每500毫秒或更短的时间有1000次呼叫,那么它会导致错误,并会造成内存问题和崩溃,或者因为错过的呼叫而非常糟糕 那么有没有办法防止这种情况发生 我很幸运地在没有像每秒50次这样多调用的函数上使用了这个库 这是一种非常好的方法,可以通过非托管的方式与.net进行交互。 比EasyHook、Deviare等更简单 使用x86应用程序 public object CallO

链接:

在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 
                };                                 
        }

找到了解决问题的方法。 我只需要分配一个新的内存区域,然后复制被覆盖的原始函数字节和被覆盖字节后的jmp。 我必须定义多少字节,因为我没有逻辑来检测正在使用的操作码。 我还通过检测字节是否为0,对原始方法或新方法进行了调整