2015-12-08 12 views
1

Я разрабатываю джейлбрейкиутое приложение на прошивке и получать Errno 22 при вызовеmprotect ERRNO 22 IOS

mprotect(p, 1024, PROT_READ | PROT_EXEC) 

ERRNO 22 означает недопустимые аргументы, но я не могу понять, что случилось. Я выровнял p, чтобы быть кратным размеру страницы, и я предварительно запрограммировал память перед вызовом mprotect.

Вот мой код и пример вывода

#define PAGESIZE 4096 

FILE * pFile; 
pFile = fopen ("log.txt","w"); 

uint32_t code[] = { 
    0xe2800001, // add r0, r0, #1 
    0xe12fff1e, // bx lr 
}; 

fprintf(pFile, "Before Execution\n"); 

p = (uint32_t *)malloc(1024+PAGESIZE-1); 

if (!p) { 
    fprintf(pFile, "Couldn't malloc(1024)"); 
    perror("Couldn't malloc(1024)"); 
    exit(errno); 
} 

fprintf(pFile, "Malloced to %p\n", p); 

p = (uint32_t *)(((uintptr_t)p + PAGESIZE-1) & ~(PAGESIZE-1)); 

fprintf(pFile, "Moved pointer to %p\n", p); 

fprintf(pFile, "Before Compiling\n"); 

// copy instructions to function 
p[0] = code[0]; 
p[1] = code[1]; 

fprintf(pFile, "After Compiling\n"); 

if (mprotect(p, 1024, PROT_READ | PROT_EXEC)) { 
    int err = errno; 
    fprintf(pFile, "Couldn't mprotect2: %i\n", errno); 
    perror("Couldn't mprotect"); 
    exit(errno); 
} 

И выход:

Before Execution 
Malloced to 0x13611ec00 
Moved pointer 0x13611f000 
Before Compiling 
After Compiling 
Couldn't mprotect2: 22 

ответ

0

Fixed это с помощью posix_memalign(). Оказывается, я не правильно установил свой указатель на размер страницы.