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++ は名前マングリングを行います。これは、メンバー関数がリンカーにQString::mid()似ていることを意味します。__ZNK7QString3midEii介入しているライブラリでコマンドを実行してnm(1)、シンボルを表示します。

于 2010-09-29T17:31:42.667 に答える
0

これははるかに簡単になります。QString は memcpy を使用して文字列を連結して操作します。memcpy を簡単にオーバーライドして、結果に正規表現を適用し、必要な文字列のみをログに記録できます。簡単なことです。魔法のブードゥー教は必要ありません:)

于 2010-09-30T09:43:31.700 に答える