【问题标题】:mprotect errno 22 iOSmprotect errno 22 iOS
【发布时间】:2016-03-12 22:16:07
【问题描述】:

我正在 iOS 上开发越狱应用,调用时出现 errno 22

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

【问题讨论】:

    标签: ios c jailbreak jit mprotect


    【解决方案1】:

    使用 posix_memalign() 解决了这个问题。原来我没有正确地将指针与页面大小对齐

    【讨论】:

      猜你喜欢
      • 2011-07-20
      • 1970-01-01
      • 2019-10-13
      • 2019-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      相关资源
      最近更新 更多