2014-02-12 190 views
2

我使用EasyHook攔截註冊表調用。更詳細地說,我使用RegQueryValue攔截從註冊表中讀取密鑰的調用,並用其他方法更改其值。相關代碼如下所示:Easyhook 32位應用程序

[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崩潰與錯誤:

Unhandled Exception: System.Runtime.InteropServices.SEHException: External component has thrown an exception. at DummyDCA.Program.Main(String[] args) Unhandled Exception: System.ArgumentOutOfRangeException: Capacity exceeds maximum capacity. Parameter name: capacity at 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的值。

有沒有人有一個想法,爲什麼這是,它應該如何做?

謝謝!

回答