Я начал работать с 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()
успешен, но два других вызова - нет.