EasyHook LoadLibrary завершается с ошибкой
Я пытаюсь использовать EasyHook для обнаружения собственных вызовов LoadLibrary.
Это действительно обнаруживает загрузку библиотек, однако процесс приводит к зависанию. Это потому, что метод LoadLibrary_Hook ниже не может загрузить DLL или библиотеку, так как он возвращает 0 IntPtr (вероятно, не может найти библиотеку.).
Я даже пытался установить для событий тип "void", но затем процесс просто завершается сбоем, возможно, это связано с тем, что EasyHook ожидает, что я верну значение для перезаписи функции.
Есть ли способ вернуть мне нужную библиотеку для загрузки или просто получить имя загружаемой библиотеки без необходимости загружать библиотеку вручную?
(Есть также такие имена, которые загружаются в процессе: 瑮 瑮 汤 汤 汤 嗿謘ౕ㍓四 四 ﱝ ﱝ 觬 嶉 嶉 嶉㯨 㯨 㯨 ࿓ ă ă ࡅ 萏 萏 䶋 䶋㬔瓋 瓋㬜 ᡝ萏ϯ팻Ѵ᪉ᢉ疋㬐 㬀 㬀瓋謇ᡅᦉᢉ綋㬜, что довольно странно...)
private static LocalHook hook;
[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
public static extern IntPtr LoadLibrary(string lpFileName);
[DllImport("kernel32.dll", CharSet=CharSet.Ansi, ExactSpelling=true, SetLastError=true)]
public static extern IntPtr GetProcAddress(IntPtr handle, string varormethodname);
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)]
public delegate IntPtr LoadLibraryDelegate(string lpFileName);
public TestHook()
{
IntPtr kernel32 = GetModuleHandle("kernel32.dll");
Logger.Log("Kernel: " + kernel32);
IntPtr address = GetProcAddress(kernel32, "LoadLibraryA");
Logger.Log("Address: " + address);
hook = LocalHook.Create(address,
new LoadLibraryDelegate(LoadLibrary_Hook),
null);
hook.ThreadACL.SetExclusiveACL(new Int32[] {0});
//RemoteHooking.WakeUpProcess();
}
public IntPtr LoadLibrary_Hook(string lpFileName)
{
Logger.Log("File load: " + lpFileName);
return LoadLibrary(lpFileName);
}
1 ответ
Решением было вызвать оригинальный метод, используя оригинальный адрес функции:
public IntPtr LoadLibrary_Hook(string lpFileName)
{
Logger.Log("File load: " + lpFileName);
LoadLibraryDelegate origMethod = (LoadLibraryDelegate)Marshal.GetDelegateForFunctionPointer(LoadLibraryAddress, typeof(LoadLibraryDelegate));
return origMethod(lpFileName);
}