gpt4 book ai didi

德尔福: force unload injected module

转载 作者:行者123 更新时间:2023-12-02 03:26:19 26 4
gpt4 key购买 nike

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

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

问题是当我调用 Freelibrary 时它什么也不做!

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

提前致谢

最佳答案

首先,我将尝试回答所提出的问题。然后,我会试图证明你问了错误的问题。

<小时/>

模块是有引用计数的。该模块可能有多个引用。所以,继续调用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 注入(inject)到您的进程中,为什么它会注入(inject) WSock32系统DLL?您是否检查过您的进程或其依赖项之一是否静态链接到 WSock32

我相当怀疑你只是误判了正在发生的事情。

<小时/>

其他一些要点:

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

关于德尔福: force unload injected module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20483486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com