EasyHook을 사용하여 레지스트리 호출을 가로 채고 있습니다. 좀 더 자세히 설명 드리면 RegQueryValue를 사용하여 레지스트리에서 키를 읽고 다른 값으로 값을 변경하는 호출을 가로 챌 수 있습니다. 내가 목표 64로 모든 것을 구축 할 경우,이 모든 문제없이 실행,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);
}
: 관련 코드처럼 보인다. 내가 목표 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는 충분하지 않은 또는 뭔가). StringBuilder를 IntPtr로 대체하면 충돌이 발생하지 않습니다. 하지만 난 포인터가 아니라 StringBuilder, 그래서 어떻게 lpData 값을 대체 할 수 있는지 잘 모르겠습니다.
누구에게 왜 그런지, 어떻게해야하는지 생각해볼 수 있습니까?
감사합니다.