Mach API - сбой записи в другие задачи - PullRequest
0 голосов
/ 27 сентября 2019

Я начал работать с Mach API на своем взломанном iPhone X пару дней назад.Моя цель - написать небольшой отладчик, способный устанавливать точки останова и проверять регистры.

void dafq(mach_port_t  port, vm_address_t addr,  unsigned int data, size_t size) {

    //Works perfectly
    unsigned char* buf = (unsigned char*)malloc(sizeof(unsigned char) * size);  //Buffer for read data
    vm_read_overwrite(port, (vm_address_t)addr, size, (vm_address_t)buf, &size); //<- works perfectly

    fprintf(stderr, "PC: 0x%.2hhx%.2hhx%.2hhx%.2hhx\n", buf[0], buf[1], buf[2], buf[3]); //<- outputing the correct data

    ////kern_return_t kr = mach_vm_protect(task, addr, (mach_vm_size_t)size, FALSE, VM_PROT_WRITE | VM_PROT_READ | VM_PROT_EXECUTE); <- results in error: protection failure
    kern_return_t kr = vm_write(port, (vm_address_t)addr, (vm_offset_t)&data, sizeof(data)); //<- (os/kern) invalid address

    if (kr != KERN_SUCCESS) {
        printf("[!] Write failed. %s\n", mach_error_string(kr));
    }
    else {

        printf("Succesfully written bytes to memory!\n");
    }
} 

Вызов vm_read_overwrite() работает как чудо, поэтому я знаю, что данный адрес допустим.

Проблема возникает, когда я пытаюсь вызвать vm_write(), как видно из моего кода, ядро ​​вернет (os/kern) invalid address.Я также попытался использовать mach_vm_write(), что также приводит к той же ошибке.

После этого мне стало интересно, связана ли проблема с уровнем защиты, поэтому я назвал mach_vm_protect(), как видно из кода.Этот призыв тоже не удачен.На этот раз код ядра ошибки protection failure.

У меня действительно нет идей, чтобы решить эту проблему.Для меня очень запутанно, что вызов vm_read_overwrite() успешен, но два других вызова - нет.

...