Обход и встроенная сборка GCC (Linux)

Я программирую расширения для игры, которая предлагает API для (нас, )моддеров. Этот API предлагает широкий спектр возможностей, но имеет одно ограничение. API предназначен только для «движка», что означает, что все модификации (моды ), выпущенные на основе движка, не предлагают/не имеют какого-либо (специфичного для мода )API. Я создал «сканер подписи» (примечание :мой плагин загружается как общая библиотека, скомпилированная с помощью -общего доступа и -fPIC ), который находит интересующие функции (, что легко так как я на линуксе ). Итак, чтобы объяснить, я возьму конкретный случай :Я нашел адрес интересующей функции, ее заголовок функции очень прост int * InstallRules(void);. Он принимает ничего (void )и возвращает целочисленный указатель (на интересующий меня объект ). Теперь то, что я хочу сделать, это создать обход (и помнить, что у меня есть начальный адрес функции )к моей собственной функции, которую я хотел бы вести примерно так :

void MyInstallRules(void)
{
    if(PreHook() == block) // <-- First a 'pre' hook which can block the function
        return;
    int * val = InstallRules(); // <-- Call original function
    PostHook(val); // <-- Call post hook, if interest of original functions return value
}

. Теперь вот сделка; У меня нет никакого опыта в перехвате функций, и у меня есть только поверхностное знание встроенного ассемблера (только AT&T ). Предварительно -сделанные обходные пакеты в Интернете только для Windows или используют совершенно другой метод (, т.е. предварительно загружают dll для переопределения исходного ). Итак, в основном; что мне делать, чтобы встать на путь? Должен ли я прочитать о соглашениях о вызовах (cdecl в этом случае )и узнать о встроенном ассемблере, или что делать? Лучше всего, вероятно, будет уже функциональный класс-оболочка для обхода Linux. В конце концов,Я хотел бы что-то столь же простое, как это:

void * addressToFunction = SigScanner.FindBySig("Signature_ASfs&43"); // I've already done this part
void * original = PatchFunc(addressToFunction, addressToNewFunction); // This replaces the original function with a hook to mine, but returns a pointer to the original function (relocated ofcourse)
// I might wait for my hook to be called or whatever
//....

// And then unpatch the patched function (optional)
UnpatchFunc(addressToFunction, addressToNewFunction);

Я понимаю, что не смогу получить здесь полностью удовлетворительный ответ, но я был бы более чем признателен за помощь с направлениями, потому что я здесь на тонком льду... Я читал об обходе, но почти нет документации (специально для Linux ), и я думаю, что хочу реализовать то, что известно как «батут», но я не могу найти способ, как приобрести это знание.

ПРИМЕЧАНИЕ. :Меня также интересует _thiscall, но, судя по тому, что я читал, не так уж сложно вызвать с помощью соглашения о вызовах GNU (?)

8
задан kuba 2 May 2012 в 20:18
поделиться