vm_write возвращает (os / kern) неверный адрес - PullRequest
0 голосов
/ 04 августа 2011

Я сделал самозаверяющий кодовый знак - но не уверен, почему vm_write терпит неудачу. (Я использую 10.6.6)

, пытаясь выяснить, чего не хватает, чтобы заставить его работать - я ценюнекоторая помощь по этим вопросам.

#include <mach/vm_map.h>
#include <mach/mach_traps.h>
#include <mach/mach_error.h>

int main (int argc, const char * argv[])
{

    //get the task for PID
    kern_return_t err;
    int pid = 73002; // PID of process in the system
    mach_port_name_t t;


    err = task_for_pid(mach_task_self(), pid, &t);


    if(0 != err)
    {
        printf("task_for_pid : %s",mach_error_string(err));
    }

    vm_address_t address;
    vm_size_t size = 108;

    err =  vm_allocate(t,&address,size,TRUE);

    if(0 != err)
    {
        printf("vm_allocate : %s",mach_error_string(err));
    }

    vm_offset_t data = pid;
    mach_msg_type_number_t dataCnt = sizeof(pid);

    err = vm_write(t,address,data,dataCnt);

    if(0 != err)
    {
        printf("vm_write : %s",mach_error_string(err));
    }


    return 0;
}

Обновление:

  1. кодовый знак с собственной подписью --- Я создал сертификат в системе и использовал для кодового знака.

  2. vm_write возвращает (os / kern) неверный адрес (возвращаемое значение равно "1")

Ответы [ 2 ]

3 голосов
/ 04 августа 2011

Вы должны использовать более современные mach_vm_address_t, mach_vm_size_t, mach_vm_allocate, mach_vm_offset_t, mach_vm_write () и т. Д. Насколько я помню из опыта, старые API не особенно хорошо работают на 64-битных процессы (которые могут быть весьма актуальны на 10.6). Кроме того, используйте pid_t вместо int для идентификатора процесса.

Другой постер прав, что вы неправильно передаете третий аргумент в vm_write, и, возможно, вы хотите передать & data, но вам, кстати, следует использовать mach_vm_write. Я ожидал, что ваша программа потерпит крах или попытается записать мусор так, как вы использовали vm_write, но возвращаемая ошибка, похоже, KERN_INVALID_ADDRESS, что указывает на то, что в процессе записи не удалось выполнить запись в адрес памяти.

Я считаю, что вы правильно подписали свой код, если task_for_pid возвращается без ошибок. Вам также следует использовать константу KERN_SUCCESS, а не 0, где это уместно.

1 голос
/ 04 августа 2011

Третий аргумент vm_write принимает указатель на ячейку памяти (pointer_t), но вы передаете PID, который просто не является допустимой ячейкой памяти.Вам нужно передать правильную ячейку памяти, например:

char *text = "123";
err = vm_write(t, address, text, strlen(text));

... которая передаст указатель на статическую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...