有EXE上网吗? (阻止吗?)

时间:2011-03-26 20:36:01

标签: windows delphi api firewall

我想编写一个小工具,分析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

3 个答案:

答案 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示例herehere)确定应用程序正在访问的端口和服务器并通知用户。或另一种方式使用更先进的方法,如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文件中的条目,使其再次清理。效果很好。

https://code.google.com/p/hostscmd/downloads/list