3

我正在使用 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.Inject.Main.RegQueryValueExW(IntPtrhKey, String lpValueName, Int32 lpReserved, RegistryValueKind& lpType, StringBuilder lpData, Int32& lpcbData) at AG.RU.Valuation.Controller.AFMToolbox.Inject 的容量.Main.RegQueryValueExW_Hooked(IntPtr hKey, String lpValueName, Int32 lpReserved, RegistryValueKind& lpType, StringBuilder lpData, Int32& lpcbData)

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

有谁知道为什么会这样,应该怎么做?

谢谢!

4

1 回答 1

1

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

Luaan 在此线程中描述了实际的解决方案:更改 IntPtr 指向的字符串

于 2014-02-13T12:23:09.167 回答