Jan*_*ard 6 c macos kernel exception mach
我想使用Mach Exception Ports处理MacOS上运行的所有任务(进程)的异常。我的理解是host_set_exception_ports要在这种情况下使用。但是,即使使用执行我的程序,也会host_set_exception_ports返回KERN_NO_ACCESS(错误代码8)sudo。我的实验代码使用来处理单个任务的异常task_set_exception_ports。
我已经有一个看看马赫内核代码的host_set_exception_ports。有一个单一的代码行,其中KERN_NO_ACCESS从函数返回。我很难理解那里发生的事情。似乎内核代码检查了我传递给的异常掩码host_set_exception_ports。我使用不同的异常掩码进行了测试,但始终得到相同的否定结果。
我的问题:这是否意味着host_set_exception_ports对用户空间应用程序的使用存在一般限制?如果没有,我将如何设置主机异常端口以在我的应用程序中接收系统范围的异常?
下面的程序是一个显示行为的最小示例,否则没有太多用处。使用gcc example.c编译程序和sudo ./a.out执行它。
#include <mach/mach.h>
#include <stdio.h>
#include <stdlib.h>
void catchMachExceptions() {
mach_port_t exception_port;
kern_return_t rc;
rc = mach_port_allocate(mach_task_self(),
MACH_PORT_RIGHT_RECEIVE,
&exception_port);
if (rc != KERN_SUCCESS) {
fprintf(stderr, "Unable to allocate exception port: %d\n", rc);
exit(-1);
}
rc = mach_port_insert_right(mach_task_self(),
exception_port,
exception_port,
MACH_MSG_TYPE_MAKE_SEND);
if (rc != KERN_SUCCESS) {
fprintf(stderr, "Unable to insert right: %d\n", rc);
exit(-1);
}
rc = host_set_exception_ports(mach_host_self(),
EXC_MASK_ALL,
exception_port,
EXCEPTION_STATE_IDENTITY,
MACHINE_THREAD_STATE);
if (rc != KERN_SUCCESS) {
fprintf(stderr, "Unable to set exception: %d\n", rc);
exit(-1);
}
}
int main(int argc, char **argv) {
catchMachExceptions();
}
Run Code Online (Sandbox Code Playgroud)
正如您所指出的,挖掘源代码host_set_exception_ports正在调用。mac_task_check_set_host_exception_ports
深入研究,您可以发现它mac_task_check_set_host_exception_ports正在根据任务检索凭据,然后调用MAC_CHECK(proc_check_set_host_exception_port, cred, exception).
这是在 中定义的宏security/mac_internals.h。请参阅此处的 xnu 代码。读取时,它会遍历策略模块列表,检查策略模块是否允许或拒绝该请求。
根据代码,所有策略模块必须一致并且不能发布错误。所以看来您需要拥有正确的权限。GNU Mach 项目的一些文档表明,发送到特权主机端口的权限已授予第一个任务,并且只能从那里传递。请参阅host_ports 等的 GNU Mach 定义。
将其组合在一起,您不仅不能作为用户进程进行更改,而且还需要从启动时通过链专门继承权限。
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |