Запустить функцию, определенную как переменная - PullRequest
0 голосов
/ 15 марта 2011

У меня есть программа, написанная на C, которая включает 2 функции, одна функция - main(), а другая - предварительно скомпилированная функция, которая хранится в виде байтового массива (назовем ее varFunc()).Указатель на массив преобразуется в функции main в указатель на функцию, а затем вызывается из функции main.(см. код ниже)

Теперь я знаю, что существуют операционные системы и некоторые процессоры, которые не позволяют выполнять код из раздела данных, и мой varFunc должен быть только там ...

Есть ли способ использовать язык C, чтобы компилятор C добавил некоторые переменные в раздел кода / текста?если нет, есть ли способ обеспечить это компилятором в большинстве компиляторов?

    char varFuncArr[] = { 0xDE, 0x67, 0x6F, 0x6F, 0xAC, 0x13, 0x05, 0x01, 0xDA, 0xF0, 0xBD, 0x79, 0xA9, 0x10, 0x00, 0x00, 0xB8, 0x74, 0x00, 0x00, 0x00, 0x3F, 0x58, 0x13, 0xEA, 0x0A, 0x2E, 0xEE, 0xC7, 0x01, 0x05, 0xD0, 0x6E, 0xB8, 0x9E};

    typedef unsigned long (*funcPtr)(void* d[]);

    int main(int argc, char** argv)
    {
        unsigned int ra[8];
        funcPtr varFunc;
        for (i=0; i<8; i++)
             ra[i] = 0;
        varFunc = (funcPtr)varFuncArr;
        return varFunc(ra);
    }

Примечание 1: Я знаю, что это очень неуклюжий способ вызова функции, а также делает ее супер платформой и компилятором, но я покажу этот пример, чтобы упростить егофактическое использование включает зашифрованную функцию вместо varFuncArr().

Примечание 2: Не пытайтесь запустить этот код, в этом примере varFuncArr зашифрован:)

Спасибо, Биньямин

Ответы [ 2 ]

5 голосов
/ 15 марта 2011

В GCC вы можете использовать __attribute__((section("text"))), чтобы поместить что-то в определенный раздел; см. здесь для документации. Visual C ++ имеет __declspec(allocate("section")); см. здесь для документации.

3 голосов
/ 15 марта 2011

В качестве альтернативы предложению Джеремии Уилкока об использовании атрибутов компилятора, вы можете mmap немного памяти и запросить разрешение на выполнение, а затем скопировать туда свои данные перед вызовом.

Вы будете обменивать переносимость платформы (Posix / Windows) на переносимость компилятора (gcc / ...), поскольку она зависит не от конкретного компилятора, а от стандартной функции Posix.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...