我想编写一个分析 EXE 文件(x32、x64)的小工具,检查 EXE 是否具有访问互联网的能力。
我从“Noton Firewall 2003”(非常老...)知道这个功能,它能够扫描硬盘以查找可以访问互联网的 EXE 文件。
问题是,如何检测呢?如果需要访问互联网,是否有一些总是导入的 DLL 文件? (WININET.DLL?)我还想知道,如果它有所不同,通信是如何开发的(使用框架、使用套接字、使用 WinAPI,...?)
相关的附带问题:是否有任何“简单”(并且希望“干净”)的方法来阻止应用程序访问互联网? (例如, Hook 每一种/实现互联网访问所需的 DLL 导入?)
我的工具的预期用途类似于
my_easy_firewall.exe [target-application] [parameters]
--> 如果应用程序具有互联网访问功能,则询问是否允许或拒绝互联网访问。然后根据用户的决定,在有或没有 Internet 访问的情况下运行带有 [parameters] 的 [target-application]。
我想在 Borland Delphi 中开发它。
谢谢。
问候
丹尼尔·编码(marshal)
最佳答案
Daniel,扫描 exe 文件来检测是否导入一些用于互联网访问的 dll 是不可靠的,因为存在许多无需直接导入 dll 即可访问互联网的方法。例如,您可以使用 LoadLibrary
动态加载 dll 或 COM 对象的函数,如 WinHttpRequest
使用后期绑定(bind)的对象。
例如你可以这样创建一个项目
{$APPTYPE CONSOLE}
uses
ActiveX,
ComObj,
SysUtils;
Procedure HttpGetText(const Url:string);
var
objHTTP : OleVariant;
begin
objHTTP:=CreateOleObject('WinHttp.WinHttpRequest.5.1');
objHTTP.Open('GET', Url, False);
objHTTP.Send();
Writeln(objHTTP.ResponseText);
end;
begin
try
CoInitialize(nil);
try
HttpGetText('https://stackoverflow.com/questions/5445133/has-exe-internet-access-block-it');
Readln;
finally
CoUninitialize;
end;
except
on E:Exception do
begin
Writeln(E.Classname, ':', E.Message);
Readln;
end;
end;
end.
现在使用一个工具来检查dll依赖你会看到一个像这样的小列表
oleaut32.dll
advapi32.dll
user32.dll
kernel32.dll
ole32.dll
这些 dll 都不用于直接访问互联网。
我认为您可以使用 GetExtendedTcpTable
之类的函数监控任何应用程序的 TCP 和 UDP 连接,而不是检测互联网访问。 (检查 delphi 样本 here 和 here )从这里您可以确定应用程序正在访问的端口和服务器并通知用户。或者使用更高级的东西的另一种方式,比如 Winpcap解析捕获的网络数据包。
关于windows - 有 EXE 互联网接入吗? (阻止它?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5445133/