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中开发它.
谢谢.
问候
丹尼尔马歇尔
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解析捕获的网络数据包.