我成功地使用dyld -macosx-将标准C函数插入第三方应用程序,获取有关其所做的变通方法的重要信息。但我真正需要的是替换某个类的某个函数。
我要覆盖的函数是QString :: append(...,...,...),所以每次将一个字符串附加到另一个 - 整个应用程序使用qstring-时,我会发现。 / p>
有办法吗?这是我已有的代码。
// 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;
}
非常感谢
答案 0 :(得分:3)
C ++做name mangling。这意味着成员函数QString::mid()
看起来像链接器__ZNK7QString3midEii
。在您插入的库上运行nm(1)
命令以查看符号。
答案 1 :(得分:0)
这会更容易。 QString使用memcpy连接和使用字符串,我可以轻松地覆盖memcpy,并将正则表达式应用于结果,只记录我想要的字符串。小菜一碟。不需要魔法voodo-hoodo:)