1

我已经成功地使用 dyld -macosx- 将标准 C 函数插入到第三方应用程序中,获得了有关它所做的变通方法的重要信息。但我真正需要的是替换某个类的某个功能。

我要覆盖的函数是 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;
}

非常感谢你

4

2 回答 2

3

C++ 确实命名为 mangling。这意味着成员函数QString::mid()看起来像__ZNK7QString3midEii链接器。在要插入的库上运行nm(1)命令以查看符号。

于 2010-09-29T17:31:42.667 回答
0

这会容易得多。QString 使用 memcpy 连接和处理字符串,我可以轻松地覆盖 memcpy,并将正则表达式应用于结果,只记录我想要的字符串。小菜一碟。不需要魔法巫毒 :)

于 2010-09-30T09:43:31.700 回答