德尔福:强制卸载注入模块

时间:2013-12-10 00:08:47

标签: delphi module libraries packet-sniffers

我使用此代码来确定是否已将特定模块注入到我的应用程序的进程中 (我用它来阻止一些Packet Sniffer软件)

 Var
 H:Cardinal;
 Begin
 H:= GetModuleHandle('WSock32.dll');
 if H >0 then FreeLibrary(H);
 end;

问题是,当我打电话给Freelibrary时,它什么都不做!

我不想显示消息然后终止应用程序我只想静静地卸载注入的模块

提前致谢

1 个答案:

答案 0 :(得分:7)

好吧,首先,我会尝试回答问题。然后,我会试着争辩说你问错了。


模块被引用计数。可能存在多个对此模块的引用。所以,请继续致电FreeLibrary

procedure ForceRemove(const ModuleName: string);
var
  hMod: HMODULE;
begin
  hMod := GetModuleHandle(PChar(ModuleName));
  if hMod=0 then 
    exit;
  repeat
  until not FreeLibrary(hMod);
end;

如果你是偏执狂,你可以选择添加一个替代的循环终止,以避免无限循环。

我真的不知道这会在你的场景中起作用。例如,您的流程静态链接到WSock32是非常合理的。在这种情况下,调用FreeLibrary的任何数量都不会被激活。即使你可以解决这个问题,你的进程与它静态链接的事实可能意味着它会很难失败。

即使您可以将其踢出,您的进程中的其他代码似乎也可以保存对模块中函数的引用。所以你只会在其他地方失败。我可以想到很少有这样的场景,即在完全忽视该模块的其他用户的情况下将模块从流程中踢出来是有意义的。


现在,让我们退一步看看你在做什么。您正在尝试从进程中删除标准系统DLL,因为您认为它仅存在,因为您的进程正在嗅探其数据包。这似乎不太可能是真的。

由于您声明您的进程受到数据包嗅探攻击。这意味着该过程通过TCP / IP进行通信。这意味着它可能使用系统模块来执行该通信。其中一个是WSock32。因此,您很可能会静态链接到WSock32。如果您杀死用于提供其功能的模块之一,您的流程将如何运作?

您是否确定过程中WSock32的存在表明您的流程受到了攻击?如果数据包嗅探器要向您的进程注入一个DLL,为什么它会注入WSock32系统DLL?您是否检查过程或其中一个依赖关系是否静态链接到WSock32

我宁愿怀疑你错误地诊断了正在发生的事情。


其他一些观点:

  • GetModuleHandle返回,FreeLibrary接受HMODULE。对于与Cardinal兼容的32位,但不与64位兼容。使用HMODULE
  • GetModuleHandle未找到的条件是返回值为0。文档中没有任何地方声明大于0的值表示成功。我意识到CardinalHMODULE是无符号的,因此<>0>0相同,但测试>0真的没有意义。它让程序员思考,“<0有什么特别之处?”