Повышение прав на использование mach_inject

Как вы повышаете права пользователя до root с помощью API авторизации, чтобы можно было использовать mach_inject?


person James Hu    schedule 11.08.2009    source источник


Ответы (3)


Вам не нужно быть пользователем root, чтобы использовать mach_inject; вместо этого вам нужно подписать свой код. Только в целях тестирования (и в 10.4/10.5) вы также можете настроить приложение setgid procmod.

См. TN2206 для получения дополнительной информации.

person Nicholas Riley    schedule 11.08.2009

Старый вопрос, но неверный ответ:

Если вы не являетесь владельцем pid/task, вам действительно нужно ЛИБО быть пользователем root или членом procmod. В OS X это имеет мало общего с подписыванием кода. Mach_inject/Mach_star используется ловушкой Маха task_for_pid(), для которой требуются указанные выше привилегии. В iOS вам также потребуется соответствующее право (task_for_pid-allow), где может пригодиться подписывание кода (используя ldid для самоподписания).

person Technologeeks    schedule 26.08.2012

Для тех, кто хочет использовать mach_inject (который использует task_for_pid() внутри) для macOS 10.11 и выше, вам нужно будет добавить соответствующие права, чтобы это работало. Затем запустите с помощью 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;
}

Вы можете сделать это как с терминальными программами, так и с приложениями какао, если хотя бы это право установлено, и у вас есть правильные привилегии.

person blueshogun96    schedule 19.04.2020