我为Mac OS X开发了一个网络内核扩展(套接字过滤器),用作阻止某些应用程序的网络访问的防火墙。
以下是套接字过滤器的简单附加功能(每次应用程序打开TCP套接字时):
<!-- language: C -->
static errno_t
filter_attach_fn(void **cookie, socket_t so)
{
errno_t result = 0;
char name[PATH_MAX];
*cookie = NULL;
proc_selfname(name, PATH_MAX);
printf("Filter attaching to process: %s\n", name);
if (strcmp(name, "Google Chrome") != 0) result = ENOPOLICY; // don't attach to this socket.
return result;
}
现在我正在使用proc_selfname。假设我要阻止来自Google Chrome的所有连接。所以我要检查名称var是否等于“Google Chrome”,如果是,则应附加过滤器。
稍后我想使用套接字控件将应用程序名称动态添加到一种“阻止列表”。
有没有更好的方法来识别这些应用程序(期望进程名称)?如果我检查“Safari”这种方法不起作用,因为打开套接字的进程的名称被命名为“com.apple.Webkit”而不是“Safari”。我确信其他应用程序还有更多例外。
有没有办法知道com.apple.Webkit的“根进程”是Safari?
答案 0 :(得分:0)
您可以通过在用户模式下发送进程ID来执行此操作。在用户模式下,您可以获取可执行文件的路径。通过使用该路径,您可以获得该流程的封闭应用程序名称。然后将结果发送回内核。
要在内核中获取进程ID,可以使用function getLocation(){
var url = 'https://opensky-network.org/api/states/all?time=1458564121&icao24=3c6444'
return fetch(url) // Call the fetch function passing the url of the API as a parameter
.then(function(resp){
data = resp.json() // Transform the data into json
return data
}).then(function(data) {
lat = data.states[0][5]
long = data.states[0][6]
lat = lat.toString()
long = long.toString()
location = [lat,long]
return location
})
}
}
函数调用。