- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用此代码来确定是否已将特定模块注入(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
的值。表示成功。我意识到Cardinal
和HMODULE
是无符号的,所以 <>0
与 >0
相同,但测试确实没有意义 >0
。它让程序员思考,“<0
有什么特别之处?”关于德尔福: force unload injected module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20483486/
我是一名优秀的程序员,十分优秀!