2013-12-10 21 views
1

我用这个代码,以确定是否一个特定的模块已经注入到我的应用程序的进程 (我用它来防止一些数据包嗅探器软件)德尔福:强制卸载注入模块

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

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

我不想显示的消息,然后结束我只是想卸载注入模块默默

在此先感谢

回答

6

好,首先我会尝试回答这个问题的应用程序要求。然后,我会试着争辩说你问的是错误的问题。


模块被引用计数。可能有多个对这个模块的引用。因此,保持通话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注入到进程中,为什么它会注入系统DLL?你有没有检查你的进程或它的一个依赖关系是否静态链接到WSock32

我宁可怀疑你刚才错误地诊断了发生的事情。


的其他一些观点:

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

有价值的信息:) “有很多非常正常的原因,你的模块可能已预装WSOCK32” 这就是为什么我只是想卸载它不是当检测到它终止应用程序。 我不使用这个模块在我的应用程序,但我想要防止程序,例如“WPE”数据包嗅探器注入此模块的工作, 不幸的代码没有工作(无限循环) –

+0

毫无意义地试图击败一个数据包可以注入的嗅探器。想想看。如果攻击者能够注入进程中,他们可以做任何他们喜欢的事情。他们可以使用不依赖注入的嗅探器来收听数据包。 –

+0

我还怀疑你的过程是静态链接到'WSock32'。查看我的更新。 –