我正在开发一个安全应用程序,它应该阻止某些进程的地址空间中的 dll 注入。假设我们的进程处于挂起状态(尚未初始化),是否可以访问该进程将要加载的 DLL 的“列表”?我已经尝试过 EnumProcessModules 函数,但它似乎不起作用(我认为这很明显,因为该进程仍处于挂起状态并且尚未加载 DLL)。此外,我想在DLL加载中进行一些更改,例如假设进程要加载X.dll,Y.dll和Z.dll,是否可以避免加载Y.dll?
提前感谢=)
如果您想在程序控制下加载 Dll,请不要尝试使用动态链接器自动加载它们。您正在与编译器的设计作斗争。
只是不要与 Dll 链接,而只需包含它们的标题,并使用“LoadLibrary”手动加载 Dll,然后使用“GetProcAddress”获取每个函数。
如果根据您的评论,您正在尝试制作防篡改程序......无法使其完全防篡改。如果有人有权登录计算机并拥有足够的权限来设置代码注入,那么他们迟早可以做任何他们喜欢的事情。注入的代码肯定会弄乱加载程序并替换 dll 或阻止 dll。它可以做任何事情。
要检索将要加载的库列表(包括延迟加载),您需要遍历用于该过程的二进制文件的 pe,就像 Windows 加载器一样。
避免加载某些链接库变得更加复杂,因为您需要以某种方式修复对从库加载的符号的任何引用,这涉及更改 IAT,删除链接,然后从 pe 中删除 dll 链接,然后调整引用现在删除的 IAT 条目的任何内容。
使用诸如 LordPE 之类的离线工具会更容易一些,但它的成功和复杂性最终取决于您为什么需要停止 dll 加载......
另一种方法是使用 windows 调试器 api 暂停 dll 加载,如果不应该加载则强制卸载(但这也充满了问题,可能会导致系统锁定和蓝屏死机)