WIN64: "Магический" вызов функции
От: kankan Украина  
Дата: 21.05.09 09:06
Оценка:
Всем привет!

Портирую старый проект из 6-й студии в 2005(x64).
Проблема такая: есть указатель на ф-цию и буффер, который содержит упакованные параметры этой ф-ции.
Надо ее как-то вызвать в x64.

В шестерке юзается следующий код:
    int* pArgsBegin = ...;
    int* pArgsEnd = ...;

    int* pArg = pArgsEnd; // use __stdcall
    while (pArg > pArgsBegin )
    {
        int val = *(--pArg );
        __asm push val
    }

    void* functionAddress = ...;

    __asm
    {
        call functionAddress
    }


Вот такой хак. Работает на ура.
В 2005-й студии компилится для x86, но не проверял работает ли.
Под x64 не компилится — говорит, что асмовские вставки не супортятся.

Есть ли какой-то другой способ вызвать ф-цию по указателю и запихнуть туда параметры?
Re: WIN64: "Магический" вызов функции
От: DTB Россия  
Дата: 21.05.09 09:44
Оценка:
Здравствуйте, kankan, Вы писали:

K>Вот такой хак. Работает на ура.

K>В 2005-й студии компилится для x86, но не проверял работает ли.
K>Под x64 не компилится — говорит, что асмовские вставки не супортятся.

не супортятся(и похоже будет не скоро) и тип вызова функции всегда __fastcall

K>Есть ли какой-то другой способ вызвать ф-цию по указателю и запихнуть туда параметры?


что нибудь вроде

typedef void (*fn_myfunc_t)(int param);
void* fn_ptr = (void*)0x1234567;
fn_myfunc_t fn = (fn_myfunc_t)fn_ptr;
fn(123);
Have fun...
Re: WIN64: "Магический" вызов функции
От: Chichikadze Израиль http://mika0x65.livejournal.com
Дата: 21.05.09 09:45
Оценка: +1
Здравствуйте, kankan, Вы писали:

K>Всем привет!

K>Есть ли какой-то другой способ вызвать ф-цию по указателю и запихнуть туда параметры?

Самое простое -- реализовать переходник на ассемблере в виде стороннего .obj. А obj сассемблировать, например, FASM'ом.
Re[2]: WIN64: "Магический" вызов функции
От: kankan Украина  
Дата: 21.05.09 09:49
Оценка:
Здравствуйте, DTB, Вы писали:

DTB>Здравствуйте, kankan, Вы писали:


K>>Вот такой хак. Работает на ура.

K>>В 2005-й студии компилится для x86, но не проверял работает ли.
K>>Под x64 не компилится — говорит, что асмовские вставки не супортятся.

DTB>не супортятся(и похоже будет не скоро) и тип вызова функции всегда __fastcall


K>>Есть ли какой-то другой способ вызвать ф-цию по указателю и запихнуть туда параметры?


DTB>что нибудь вроде


DTB>
DTB>typedef void (*fn_myfunc_t)(int param);
DTB>void* fn_ptr = (void*)0x1234567;
DTB>fn_myfunc_t fn = (fn_myfunc_t)fn_ptr;
DTB>fn(123);
DTB>


Дело в том, что неизвесно, что это за функция и какие у нее параметы
Re[2]: WIN64: "Магический" вызов функции
От: DTB Россия  
Дата: 21.05.09 09:51
Оценка: +1
Здравствуйте, DTB, Вы писали:

упс, с изменяемым количеством параметров могут быть проблемы, в x64 первые 4 параметра идут не через стек, а через регистры, тупо кидать их в стек не выйдет. можно попытаться реализовать через ассемблер, как ниже подсказали, но геморрой еще тот
Have fun...
Re[3]: WIN64: "Магический" вызов функции
От: DTB Россия  
Дата: 21.05.09 09:53
Оценка:
Здравствуйте, kankan, Вы писали:

K>Дело в том, что неизвесно, что это за функция и какие у нее параметы


даже адреса функции нет? должен быть, тогда взять дизассемблер, раскрутить и посмотреть, что функция из себя представляет. некоторые продвинутые дизассемблеры (например IDA) показывают примерные параметры (тип и кол-во)
Have fun...
Re[4]: WIN64: "Магический" вызов функции
От: kankan Украина  
Дата: 21.05.09 10:37
Оценка:
Здравствуйте, DTB, Вы писали:

DTB>Здравствуйте, kankan, Вы писали:


K>>Дело в том, что неизвесно, что это за функция и какие у нее параметы


DTB>даже адреса функции нет? должен быть, тогда взять дизассемблер, раскрутить и посмотреть, что функция из себя представляет. некоторые продвинутые дизассемблеры (например IDA) показывают примерные параметры (тип и кол-во)


Вы меня неправильно поняли.
Код, который я привел, работает с кучей функций, и мне не надо их знать — это типа "универсальный" враппер на ф-цию. С его помощью могут вызываются например ф-ции, загруженные GetProcAddress().
Что конкретно вызывает пользователь этого враппера — я хз, у меня есть только указатель на вызываемую ф-цию и ее параметры.
Проблема в том как вызвать эту функцию и передать ей все эти параметры в x64.
Re[5]: WIN64: "Магический" вызов функции
От: DTB Россия  
Дата: 21.05.09 11:17
Оценка:
Здравствуйте, kankan, Вы писали:

K>Вы меня неправильно поняли.

K>Код, который я привел, работает с кучей функций, и мне не надо их знать — это типа "универсальный" враппер на ф-цию. С его помощью могут вызываются например ф-ции, загруженные GetProcAddress().
K>Что конкретно вызывает пользователь этого враппера — я хз, у меня есть только указатель на вызываемую ф-цию и ее параметры.
K>Проблема в том как вызвать эту функцию и передать ей все эти параметры в x64.

теперь понял, прошу прощения. тогда похоже только через хард кодинг, брать в руки ассемблер, разбираться как передаются параметры (это хорошо если они однотипные, если нет, то будет сложнее — целочисленные и числа с плавающей запятой передаются в разных регистрах). и ваять код, либо в асме, линковать obj, либо представлять в байткоде в С

еще можно сделать такой тупняк (если количество параметров не огромно):

void Fn1(int i, int i2)
{
    printf("i=%d,i2=%d\n", i, i2);
}
void Fn2(int i)
{
    printf("i=%d\n", i);
}

typedef void (*fn_myfunc_t)(...);

fn_myfunc_t fn = (fn_myfunc_t)&Fn1;
fn(123, 456);
fn_myfunc_t fn1 = (fn_myfunc_t)&Fn2;
fn(123);


то бишь для каждого конкретного кол-ва параметров делать соответствующий вызов (по крайней мере работает), хотя может как то и разом туда все передать, в массиве например, у меня не получилось
Have fun...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.