C# EasyHook LoadLibrary在崩溃中失败

C# EasyHook LoadLibrary在崩溃中失败,c#,winapi,loadlibrary,easyhook,C#,Winapi,Loadlibrary,Easyhook,我正在尝试使用EasyHook检测本机LoadLibrary调用 它确实检测到库的加载,但是该过程会导致冻结。 这是因为下面的LoadLibrary\u Hook方法无法加载dll或库,因为返回0 IntPtr(可能找不到库) 我甚至尝试将事件设置为“void”类型,但随后该过程就会崩溃,这可能是因为EasyHook希望我返回一个值来覆盖该函数 有没有一种方法可以让我返回需要加载的库,或者直接获取正在加载的库的名称,而不必手动加载库 (也有类似的名称正在加载过程中:瑮汤⹬汤L邐邐讐嗿謘ౕ㍓四

我正在尝试使用EasyHook检测本机LoadLibrary调用

它确实检测到库的加载,但是该过程会导致冻结。 这是因为下面的LoadLibrary\u Hook方法无法加载dll或库,因为返回0 IntPtr(可能找不到库)

我甚至尝试将事件设置为“void”类型,但随后该过程就会崩溃,这可能是因为EasyHook希望我返回一个值来覆盖该函数

有没有一种方法可以让我返回需要加载的库,或者直接获取正在加载的库的名称,而不必手动加载库

(也有类似的名称正在加载过程中:瑮汤⹬汤L邐邐讐嗿謘ౕ㍓四襗ﱝ嶉觬嶉觰嶉㯨࿓トă謀ࡅ쌻萏Ͽ䶋㬔瓋㤉ᡝ萏ϯ팻Ѵ᪉ᢉ疋㬐࿳ă㬀瓋謇ᡅᦉᢉ綋㬜 这有点奇怪……)


解决方案是使用原始函数地址调用原始方法:

public IntPtr LoadLibrary_Hook(string lpFileName)
{
    Logger.Log("File load: " + lpFileName);
    LoadLibraryDelegate origMethod = (LoadLibraryDelegate)Marshal.GetDelegateForFunctionPointer(LoadLibraryAddress, typeof(LoadLibraryDelegate));
    return origMethod(lpFileName);
}

使用托管代码挂钩
LoadLibrary
似乎是一个非常好的方法,可以完全地连接您的进程,因为即使它工作得很好,您也可能最终在运行时不希望它运行的地方运行托管代码。如果您只想在加载时进行检测,那么一种明智的方法是使用ETW来跟踪库加载事件(如前所述)。如果你真的想重定向加载的库,那么我能建议的就是:不要,或者使用一个专用的CLR托管进程,让非托管代码来执行。因此,基本上这个ETW也可以用来检测LoadLibrary调用?ETW不会检测到对
LoadLibrary
本身的调用,它会检测到进程中加载的DLL(无论是通过显式
LoadLibrary
调用还是其他方式).差不多,但不完全相同;这取决于你想要什么。如果
LoadLibrary
返回null,你需要调用
GetLastError
Marshall.GetLastWin32Error
来找出原因,这是一种常见的winapi情况,这是你如何找出哪里出了问题的,我的蜘蛛感觉告诉我这可能是一个小问题
 System.Console.WriteLine(Marshal.GetLastWin32Error());
您还想在DLL端口上设置
SetLastError=true
,请参见此
public IntPtr LoadLibrary_Hook(string lpFileName)
{
    Logger.Log("File load: " + lpFileName);
    LoadLibraryDelegate origMethod = (LoadLibraryDelegate)Marshal.GetDelegateForFunctionPointer(LoadLibraryAddress, typeof(LoadLibraryDelegate));
    return origMethod(lpFileName);
}