2010-09-29 4 views
1

Я успешно использую 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; 
} 

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

ответ

3

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

+1

+1 Ровно. Используйте * nm *, чтобы найти правильный символ метода, который вы хотите заменить, а затем создайте функцию C с этим точным именем в общей библиотеке, которую вы строите. – karlphillip

+0

Я как только вернусь домой. Функция находится в пакете, расположенном в каталоге приложения. Это файл * .bundle. Если символ существует в AND-объекте в главном приложении, что делать? Ç – flaab

+0

Спасибо за ваши ответы. Карлфиллип: узнав точный символ, должен ли я использовать приведенный выше код, чтобы вставить их обоих? – flaab

0

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

Смежные вопросы