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

Dan*_*all 2 windows delphi api firewall

我想写一个小工具,分析一个EXE文件(x32,x64),它检查EXE是否具有访问互联网的能力.

我知道这个功能来自"Noton Firewall 2003"(很老......),它能够扫描硬盘上有可以访问互联网的EXE文件.

问题是,如何检测它?是否有一些DLL文件,如果需要互联网访问,总是导入?(WININET.DLL?)我也想知道,如果它有所不同,如何开发通信(使用框架,使用套接字,使用WinAPI,......?)

相关的问题:是否有任何"简单"(并希望"干净")的方式来阻止应用程序访问互联网?(例如,挂钩每个类型/实现互联网访问所需的DLL导入?)

我的工具的使用情况就是这样的

my_easy_firewall.exe [target-application] [parameters]
Run Code Online (Sandbox Code Playgroud)

- >如果应用程序具有Internet访问功能,则询问是否允许或拒绝Internet访问.然后根据用户的决定,使用带有或不带互联网访问权限的[参数]运行[target-application].

我想在Borland Delphi中开发它.

谢谢.

问候

丹尼尔马歇尔

RRU*_*RUZ 6

Daniel,扫描exe文件以检测是否导入了一些用于互联网访问的dll是不可靠的,因为存在许多方法来访问互联网而不直接导入dll.例如,您可以使用LoadLibrary动态加载DLL 的函数或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.
Run Code Online (Sandbox Code Playgroud)

现在使用工具检查dll依赖关系,你会看到一个像这样的小列表

oleaut32.dll
advapi32.dll
user32.dll
kernel32.dll
ole32.dll
Run Code Online (Sandbox Code Playgroud)

这些dll都不能直接用于访问互联网.

我认为不是检测互联网访问,而是可以使用类似的函数监控任何应用程序的TCP和UDP连接GetExtendedTcpTable (在这里此处检查delphi示例),确定应用程序正在访问的端口和服务器并通知用户.或另一种方式使用更先进的东西,如Winpcap解析捕获的网络数据包.