我在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
有关。
1条答案
按热度按时间gkl3eglg1#
似乎存储函数指针的内存是受保护的。
这一方法: