Easyhook 32位应用程序

时间:2014-02-12 08:35:44

标签: c# winapi x86 unmanaged easyhook

我正在使用EasyHook来拦截注册表调用。更详细地说,我使用RegQueryValue来拦截从注册表中读取密钥并使用其他内容更改其值的调用。相关代码如下:

[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
delegate int DRegQueryValueExW(
    IntPtr hKey,
    string lpValueName,
    int lpReserved,
    ref Microsoft.Win32.RegistryValueKind lpType,
    StringBuilder lpData,
    ref int lpcbData);

[DllImport("Advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true, CallingConvention = CallingConvention.StdCall)]
static extern int RegQueryValueExW(
    IntPtr hKey,
    string lpValueName,
    int lpReserved,
    ref Microsoft.Win32.RegistryValueKind lpType,
    StringBuilder lpData,
    ref int lpcbData);

int RegQueryValueExW_Hooked(
    IntPtr hKey,
    string lpValueName,
    int lpReserved,
    ref Microsoft.Win32.RegistryValueKind lpType,
    StringBuilder lpData,
    ref int lpcbData)
{
    // todo: change value of lpData and return 0
    return RegQueryValueExW(hKey, lpValueName, lpReserved, ref lpType, lpData, ref lpcbData);                  
}

如果我使用目标x64构建所有内容,这一切都会毫无问题地执行。

但是,如果我使用目标x32构建它,它会在RegQueryValueExW_Hooked中崩溃并出现错误:

  

未处理的异常:System.Runtime.InteropServices.SEHException:外部组件引发了异常。在DummyDCA.Program.Main(String [] args)   未处理的异常:System.ArgumentOutOfRangeException:容量超过最大容量。   参数名称:AG.RU.Valuation.Controller.AFMToolbox上的AG.RU.Valuation.Controller.AFMToolbox.Inject.Main.RegQueryValueExW(IntPtrhKey,String lpValueName,Int32 lpReserved,RegistryValueKind& lpType,StringBuilder lpData,Int32& lpcbData)的容量.Inject.Main.RegQueryValueExW_Hooked(IntPtr hKey,String lpValueName,Int32 lpReserved,RegistryValueKind& lpType,StringBuilder lpData,Int32& lpcbData)

问题似乎是StringBuilder类型的lpData(某种溢出,StringBuilder不够大或什么的)。如果我用IntPtr替换StringBuilder,它不会崩溃;但是我有一个指针而不是StringBuilder,所以我不确定如何替换lpData的值。

有没有人知道为什么会这样,以及应该怎么做?

谢谢!

1 个答案:

答案 0 :(得分:1)

似乎我不得不使用IntPtr而不是StringBuilder;而RegQueryValueExW_Hooked的实现也有点特别。

Luaan在这个帖子中描述了实际的解决方案:Changing the string to which an IntPtr is pointing