Я успешно использую dyld -macosx-, чтобы вставлять стандартные функции C в стороннее приложение, получая важную информацию об обходных решениях, которые он делает. Но мне действительно нужно заменить определенную функцию определенного класса.Использование DYLD для взаимодействия функций класса
Функция, которую я хочу переопределить, это QString :: append (..., ..., ...), поэтому каждый раз, когда строка добавляется в другую, все приложение использует qstring-, я узнаю.
Есть ли способ? Вот код, который у меня уже есть.
// libinterposers.c
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdarg.h>
#include <dlfcn.h>
#include <stdlib.h>
typedef struct interpose_s {
void *new_func;
void *orig_func;
} interpose_t;
int my_open(const char *, int, mode_t);
int my_close(int);
void* my_malloc(size_t);
static const interpose_t interposers[] \
__attribute__ ((section("__DATA, __interpose"))) = {
{ (void *)my_open, (void *)open },
{ (void *)my_close, (void *)close },
{ (void *)my_malloc, (void *)malloc },
};
int
my_open(const char *path, int flags, mode_t mode)
{
int ret = open(path, flags, mode);
printf("--> %d = open(%s, %x, %x)\n", ret, path, flags, mode);
return ret;
}
int
my_close(int d)
{
int ret = close(d);
printf("--> %d = close(%d)\n", ret, d);
return ret;
}
void*
my_malloc(size_t size)
{
void *ret = malloc(size);
//fprintf(stderr, "Reserva de memoria");
return ret;
}
Большое спасибо
+1 Ровно. Используйте * nm *, чтобы найти правильный символ метода, который вы хотите заменить, а затем создайте функцию C с этим точным именем в общей библиотеке, которую вы строите. – karlphillip
Я как только вернусь домой. Функция находится в пакете, расположенном в каталоге приложения. Это файл * .bundle. Если символ существует в AND-объекте в главном приложении, что делать? Ç – flaab
Спасибо за ваши ответы. Карлфиллип: узнав точный символ, должен ли я использовать приведенный выше код, чтобы вставить их обоих? – flaab