geode/loader/dobby/builtin-plugin/Dyld2HideLibrary/dyld2_hide_library.cc
2022-07-30 19:24:03 +03:00

136 lines
4.2 KiB
C++

#include "Dyld2HideLibrary/dyld2_hide_library.h"
#include <mach-o/dyld.h>
#include <mach-o/loader.h>
#include <mach-o/nlist.h>
#include <mach-o/dyld_images.h>
#include <stdint.h>
#include <stdio.h>
#include <mach/mach.h>
#include <string.h>
#include <vector>
#include "dobby_internal.h"
typedef void ImageLoader;
typedef void ImageLoaderMachO;
static void *(*removeImageFromAllImages)(const struct mach_header *mh) = NULL;
static char *(*ImageLoader__getShortName)(ImageLoader *loader) = NULL;
static struct mach_header *(*ImageLoaderMachO__machHeader)(ImageLoaderMachO *loader) = NULL;
static std::vector<ImageLoader *> *sAllImages = NULL;
std::vector<char *> *g_prepare_remove_array;
static int dobby_hide_library_internal(const char *library_name) {
if (removeImageFromAllImages == NULL) {
removeImageFromAllImages =
(decltype(removeImageFromAllImages))DobbySymbolResolver("dyld", "__Z24removeImageFromAllImagesPK11mach_header");
}
if (ImageLoader__getShortName == NULL) {
ImageLoader__getShortName =
(decltype(ImageLoader__getShortName))DobbySymbolResolver("dyld", "__ZNK11ImageLoader12getShortNameEv");
}
if (ImageLoaderMachO__machHeader == NULL) {
ImageLoaderMachO__machHeader =
(decltype(ImageLoaderMachO__machHeader))DobbySymbolResolver("dyld", "__ZNK16ImageLoaderMachO10machHeaderEv");
}
if (sAllImages == NULL)
sAllImages = (decltype(sAllImages))DobbySymbolResolver("dyld", "__ZN4dyldL10sAllImagesE");
#if 0
if (dyld3__AllImages__imageLoadAddressByIndex == NULL) {
dyld3__AllImages__imageLoadAddressByIndex = (decltype(removeImageFromAllImages))DobbySymbolResolver(
"libdyld.dylib", "__ZNK5dyld39AllImages23imageLoadAddressByIndexEj");
}
if (dyld3_sAllImages == NULL)
dyld3_sAllImages = (decltype(dyld3_sAllImages))DobbySymbolResolver("libdyld.dylib", "__ZN5dyld310gAllImagesE");
#endif
#if 0
typedef void AllImages;
static void(*AllImages__decRefCount)(AllImages *_this, const struct mach_header *mh) = NULL;
if(AllImages__decRefCount == NULL) {
AllImages__decRefCount = (decltype(AllImages__decRefCount))DobbySymbolResolver("libdyld.dylib", "__ZN5dyld39AllImages11decRefCountEPK11mach_header");
}
static AllImages *gAllImages = NULL;
if(gAllImages == NULL) {
gAllImages = (decltype(gAllImages))DobbySymbolResolver("libdyld.dylib", "__ZN5dyld310gAllImagesE");
}
#endif
// int count = _dyld_image_count();
// for (int i = 0; i < count; i++) {
// const char *name = _dyld_get_image_name(i);
// const char *image_name = strrchr(name, '/');
// if (image_name == NULL) {
// continue;
// }
// image_name += 1;
// if (strcmp(image_name, library_name) == 0) {
// const struct mach_header *header = _dyld_get_image_header(i);
// AllImages__decRefCount(gAllImages, header);
// break;
// }
// }
for (std::vector<ImageLoader *>::iterator it = sAllImages->begin(); it != sAllImages->end(); it++) {
char *name = ImageLoader__getShortName(*it);
// LOG(2, "load library : %s", name);
if (strcmp(name, library_name) == 0) {
LOG(2, "strip load library : %s", library_name);
struct mach_header *header = ImageLoaderMachO__machHeader(*it);
removeImageFromAllImages(header);
sAllImages->erase(it);
break;
}
}
return 0;
}
PUBLIC int dyld2_hide_library(const char *library_name) {
#if 1
dobby_hide_library_internal(library_name);
return 0;
#endif
if (g_prepare_remove_array == NULL)
g_prepare_remove_array = new std::vector<char *>();
g_prepare_remove_array->push_back((char *)library_name);
}
static void common_handler(RegisterContext *ctx, const HookEntryInfo *info) {
if (g_prepare_remove_array == nullptr)
return;
for (auto name : *g_prepare_remove_array) {
dobby_hide_library_internal(name);
}
}
__attribute__((constructor)) static void ctor() {
#if 0
void *dyld__notifyMonitoringDyldMain = DobbySymbolResolver("dyld", "__ZN4dyldL24notifyMonitoringDyldMainEv");
DobbyInstrument(dyld__notifyMonitoringDyldMain, common_handler);
#endif
log_switch_to_syslog();
#if defined(DOBBY_DEBUG) && 0
dyld2_hide_library("Dobby");
dyld2_hide_library("liblangid.dylib");
#endif
}