我想编写一个小工具,分析EXE文件(x32,x64),检查EXE是否具有访问互联网的能力。
我从“Noton Firewall 2003”(很老的......)知道这个功能,它能够扫描硬盘上有可以访问互联网的EXE文件。
问题是,如何检测它?是否有一些DLL文件,如果需要互联网访问,总是导入? (WININET.DLL?)我也想知道,如果它有所不同,如何开发通信(使用框架,使用套接字,使用WinAPI,......?)
相关的问题:是否有任何“简单”(并希望“干净”)方式阻止应用程序访问互联网? (例如,挂钩每次进行互联网访问所需的DLL导入?)
我的工具的使用情况类似于
my_easy_firewall.exe [target-application] [parameters]
- >如果应用程序具有Internet访问功能,则询问是否允许或拒绝Internet访问。然后根据用户的决定,使用带有或不带互联网访问权限的[参数]运行[target-application]。
我想在Borland Delphi中开发它。
谢谢。
此致
Daniel Marschall
答案 0 :(得分:6)
Daniel,扫描exe文件以检测是否导入了一些用于互联网访问的dll是不可靠的,因为存在许多方法来访问互联网而不直接导入dll。例如,您可以使用动态加载DLL的LoadLibrary
函数或使用后期绑定的WinHttpRequest
对象等COM对象。
{$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解析捕获的网络数据包。
答案 1 :(得分:1)
据我所知,所有反恶意软件都使用某种签名来检测受感染的文件 对于相关的问题,阻止应用程序访问Internet的最佳方法是拦截所有TCP / IP通信请求。这是一项防火墙工作,开发防火墙并非易事。
答案 2 :(得分:1)
我使用了解决方法
例如包含内容的.bat文件
"%~dp0"\hosts add access.blocked.com 127.0.0.1
call "%~dp0"\programname.exe
"%~dp0"\hosts del access.blocked.com
它使用下面url中的hosts.exe编辑windows hosts文件。上面的bat文件将编辑hosts文件以阻止不需要的示例连接access.blocked.com,它将启动程序exe,完成后将等待它关闭,它将删除hosts文件中的条目,使其再次清理。效果很好。