gpt4 book ai didi

.net - Hook 来自托管代码的 LoadLibrary 调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:57:09 31 4
gpt4 key购买 nike

我们想 Hook 对 LoadLibrary 的调用,以便下载未找到的程序集。我们有一个处理托管程序集的 ResolveAssembly 处理程序,但我们还需要处理非托管程序集。

我们已尝试通过使用“Microsoft Windows 应用程序编程”中指定的技术重写导入表来 Hook LoadLibrary 调用,但是当我们调用 WriteProcessMemory() 时,我们会遇到权限被拒绝的错误 (998)。 (是的,我们正在以提升的权限运行)

有没有人在加载 CLR 时成功地重写了导入表?谁能指出我正确的方向?

更新:我们解决了权限被拒绝的问题,但现在当我们迭代混合程序集(托管 + 非托管)的导入表时,我们找到的唯一条目是 mscoree.dll。有谁知道如何找到本地进口商品? (我们在 C++/CLI 中工作)。

最佳答案

我已成功 Hook 托管代码。但是,我是通过将非托管 DLL 注入(inject)远程进程并让它重写 DllMain 中的导入表来实现的。您可能需要考虑这种方法。

这是我的 Hook 函数:

//structure of a function to hook
struct HookedFunction {
public:
LPTSTR moduleName;
LPTSTR functionName;
LPVOID newfunc;
LPVOID* oldfunc;
};

BOOL Hook(HMODULE Module, struct HookedFunction Function) {
//parse dos header
IMAGE_DOS_HEADER* dos_header = (IMAGE_DOS_HEADER*)Module;
if (dos_header->e_magic != IMAGE_DOS_SIGNATURE) return 0; //not a dos program

//parse nt header
IMAGE_NT_HEADERS* nt_header = (IMAGE_NT_HEADERS*)(dos_header->e_lfanew + (SIZE_T)Module);
if (nt_header->Signature != IMAGE_NT_SIGNATURE) return 0; //not a windows program

//optional header (pretty much not optional)
IMAGE_OPTIONAL_HEADER optional_header = nt_header->OptionalHeader;
if (optional_header.Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC) return 0; //no optional header

IMAGE_IMPORT_DESCRIPTOR* idt_address = (IMAGE_IMPORT_DESCRIPTOR*)(optional_header.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + (SIZE_T)Module);
if (!optional_header.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size) return 0; //no import table

//enumerate the import dlls
BOOL hooked = false;
for(IMAGE_IMPORT_DESCRIPTOR* i = idt_address; i->Name != NULL; i++)
//check the import filename
if (!_stricmp(Function.moduleName, (char*)(i->Name + (SIZE_T)Module)))
//enumerate imported functions for this dll
for (int j = 0; *(j + (LPVOID*)(i->FirstThunk + (SIZE_T)Module)) != NULL; j++)
//check if the function matches the function we are looking for
if (!_stricmp(Function.functionName, (char*)(*(j + (SIZE_T*)(i->OriginalFirstThunk + (SIZE_T)Module)) + (SIZE_T)Module + 2) )) {
//replace the function
LPVOID* memloc = j + (LPVOID*)(i->FirstThunk + (SIZE_T)Module);
if (*memloc != Function.newfunc) { //not already hooked
DWORD oldrights;
DWORD newrights = PAGE_READWRITE;
VirtualProtect(memloc, sizeof(LPVOID), newrights, &oldrights);
if (Function.oldfunc && !*Function.oldfunc)
*Function.oldfunc = *memloc;
*memloc = Function.newfunc;
VirtualProtect(memloc, sizeof(LPVOID), oldrights, &newrights);
}
hooked = true;
}

return hooked;
}

关于.net - Hook 来自托管代码的 LoadLibrary 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/769537/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com