如何使用 Authorization API 将用户权限提升到 root 以便可以使用 mach_inject?
问问题
2356 次
3 回答
6
您无需成为 root 即可使用 mach_inject;相反,您需要签署您的代码。仅出于测试目的(以及在 10.4/10.5 中),您还可以将您的应用程序设置为 setgid procmod。
有关详细信息,请参阅TN2206。
于 2009-08-11T20:28:21.687 回答
4
老问题,但答案不正确:
除非您拥有 pid/task,否则您实际上需要是 root 或 procmod 的成员。在 OS X 中,这与代码签名无关。Mach_inject/Mach_star 由 Mach 陷阱 task_for_pid() 使用,需要上述权限。在 iOS 中,您还需要相应的权利 (task_for_pid-allow),这是代码签名派上用场的地方(使用 ldid 进行自签名)。
于 2012-08-26T17:12:08.013 回答
3
对于那些希望在 macOS 10.11 及更高版本中使用 mach_inject(在内部使用 task_for_pid())的用户,您需要添加适当的权利才能使其正常工作。然后用 sudo 运行。请参阅下面的示例:https ://gist.github.com/attilathedud/e58917c9fd095a84fd5bbfb31674be05
/*
Full explanation is available here: http://attilathedud.me/mac-os-x-el-capitan-10-11-and-task_for_pid/
*/
/*
To compile, create a file called Info.plist with the following content:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SecTaskAccess</key>
<array>
<string>allowed</string>
</array>
</dict>
</plist>
When compiling, use -sectcreate to create a section for the plist:
gcc task_for_pid.c -sectcreate __TEXT __info_plist ./Info.plist -o task_for_pid
Run using sudo ./task_for_pid _some_pid
*/
/*!
* task_for_pid.c: Given a pid in argv[ 1 ], return the mach task port.
*/
#include <stdio.h>
#include <stdlib.h>
#include <mach/mach.h>
int main( int argc, char** argv )
{
kern_return_t kern_return = 0;
mach_port_t task = 0;
long int pid = 0;
char *endptr = NULL;
if( argc < 2 )
{
return 0;
}
pid = strtol( argv[ 1 ], &endptr, 10 );
kern_return = task_for_pid( mach_task_self(), pid, &task );
if( kern_return != KERN_SUCCESS )
{
printf( "task_for_pid failed: %s\n", mach_error_string( kern_return ) );
return 0;
}
printf( "%u\n", task );
return 0;
}
只要至少设置了该权利并且您拥有正确的权限,您就可以使用终端程序和可可应用程序来执行此操作。
于 2020-04-19T01:15:40.427 回答