Использование вставки DYLD для вставки функций класса - PullRequest
1 голос
/ 29 сентября 2010

Я успешно использовал dyld -macosx- для вставки стандартных функций C в стороннее приложение, получая важную информацию об обходных путях, которые оно выполняет. Но что мне действительно нужно, это заменить определенную функцию определенного класса.

Функция, которую я хочу переопределить, это QString :: append (..., ..., ...), поэтому каждый раз, когда строка добавляется к другому - все приложение использует qstring-, я узнаю. 1003 *

Есть ли способ? Вот код, который у меня уже есть.

// 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;
}

Большое спасибо

Ответы [ 2 ]

3 голосов
/ 29 сентября 2010

C ++ делает искажение имени . Это означает, что функция-член QString::mid() выглядит для компоновщика примерно как __ZNK7QString3midEii. Выполните команду nm(1) в библиотеке, в которую вы вставляете, чтобы увидеть символы.

0 голосов
/ 30 сентября 2010

Это будет намного проще, чем это. QString использует memcpy для объединения и работы со строками, и я могу легко переопределить memcpy и применить к результату регулярное выражение, регистрируя только нужные мне строки. Кусок пирога. Не нужно волшебства вуду-худо:)

...