我通过二进制映像中的TLS 回调将本机 x86 代码注入 .NET 应用程序。不幸的是,.NET 可执行文件只mscorlib.dll
在 PE 中导入,并kernel32.dll
在运行时自动映射到内存空间。我不想注入任何进口。这使得查找地址LoadLibrary
变得GetProcAddress
尴尬。
我首先想到的解决方案是通过 找到 PEB mov eax, dword ptr [fs:030h]
,然后从那里加载PEB->Ldr
并PEB->Ldr.InMemoryOrderModuleList.Flink
使用它们在内存中查找模块。从那里我可以获取kernel32.dll
内存中的基地址,并偏移到 PE 标头和导出目录 RVA。从那里我可以通过名称扫描导入条目以查找导出,并找到地址。
这有以下问题:
- 大量代码用于像 API 调用这样微不足道的事情。
- 代表 API 名称的 ASCII 字符串必须嵌入到代码中。
- 跨长时间运行/多个线程缓存找到的地址很尴尬。
有没有一种更清洁的方法可以解决这些问题,而无需使用导入注入?请记住,我无法更改映像的 EP,因为 CLR 依赖 EP 作为到托管 IL 的跳转。