macOS Monterey和Ventura之间的malloc_default_zone差异

vohkndzv  于 8个月前  发布在  Mac
关注(0)|答案(1)|浏览(45)

我在Monterey上运行这段代码,用Apple clang 14.0.0编译,在那里调用了自定义函数my_malloc。当我在Ventura上运行相同的代码时,用Apple clang 14.0.3编译,然后my_malloc没有被调用。

#include <stdlib.h>
#include <malloc/malloc.h>
#include <signal.h>

void *(*system_malloc)(malloc_zone_t *zone, size_t size);

void *my_malloc(malloc_zone_t *zone, size_t size) {
    kill(0, SIGABRT);
    return 0;
}

void setup_intercept() {
    malloc_zone_t *zone = malloc_default_zone();
    system_malloc = zone->malloc;
    zone->malloc = my_malloc;
}

void reverse_intercept() {
    malloc_zone_t *zone = malloc_default_zone();
    zone->malloc = system_malloc;
}

int main(int argc, char* argv[]) {
    setup_intercept();
    void* v = malloc(42);
    reverse_intercept();
    return 0;
}

这里有什么区别吗?I can see that上游LLVM Clang版本在这些Apple Clang版本之间从14变为15。
在浏览器Explorer中,程序集看起来有点不同。With Clang 14,只有对malloc的调用。With Clang 15,则存在对malloc@PLT的调用。我不确定这是否与malloc_default_zone有关。

gkl3eglg

gkl3eglg1#

似乎存储函数指针的内存是受保护的。
这一方法:

#include <stdlib.h>
#include <malloc/malloc.h>
#include <mach/mach_init.h>
#include <mach/mach.h>

malloc_zone_t* getTheDefault() {
    malloc_zone_t **zones = nullptr;
    unsigned int num_zones = 0;

    if (KERN_SUCCESS != malloc_get_all_zones(0, NULL,
                                             (vm_address_t**)&zones, &num_zones)) {
        // Reset the value in case the failure happened after it was
        num_zones = 0;
    }
    if (num_zones) {
        return zones[0];
    }
    return malloc_default_zone();
}

using malloc_ptr = void*(malloc_zone_t *zone, size_t size);
malloc_ptr* original_malloc;

void *my_malloc(malloc_zone_t *zone, size_t size) {
    return original_malloc(zone, size);
}

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

    auto defaultZone = getTheDefault();
    original_malloc = defaultZone->malloc;

    vm_protect(mach_task_self(), (uintptr_t)defaultZone, sizeof(malloc_zone_t), 0,
               VM_PROT_READ | VM_PROT_WRITE);

    defaultZone->malloc = my_malloc;
    void* v = malloc(123);
    return 0;
}

相关问题