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

Som*_*ody 2 delphi module packet-sniffers libraries

我使用此代码来确定是否已将特定模块注入到我的应用程序的进程中(我使用它来阻止某些数据包嗅探器软件)

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

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

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

提前致谢

Dav*_*nan 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;
Run Code Online (Sandbox Code Playgroud)

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

我真的不知道这会在你的场景中起作用.例如,您的流程静态链接是非常合理的WSock32.在这种情况下,没有任何电话FreeLibrary会被踢出去.即使你可以解决这个问题,你的进程与它静态链接的事实可能意味着它会很难失败.

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


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

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

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

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


其他一些观点:

  • GetModuleHandle返回,并FreeLibrary接受HMODULE.对于兼容的32位Cardinal,但不适用于64位.使用HMODULE.
  • 未找到的条件GetModuleHandle是返回值是0.在文档中没有任何地方声明值大于0表示成功.我意识到这一点Cardinal并且HMODULE没有签名,因此<>0也是如此>0,但测试真的没有意义>0.它让程序员思考,"有什么特别之处<0?"