переход по адресу в x64 программе

Тема в разделе "WASM.BEGINNERS", создана пользователем promtpol, 19 окт 2011.

  1. promtpol

    promtpol New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    60
    Необходимо получив адрес функции через вызов GetProcAddress сразу передать управление на нее, при этом нельзя порушить стек, для примера:
    void MyProc(void)
    {
    DWORD a = GetProcAddress(hModule, "ExportFunc");
    //и тут надо сделать что-то типа jmp a
    }
    Если кто может помочь, подскажите.
    Заранее спасибо
     
  2. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    684
    __asm mov eax,a
    __asm jmp eax

    должно помочь
     
  3. promtpol

    promtpol New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    60
    Не-не, в x64 нет __asm. Но все равно спасибо
     
  4. sl0n

    sl0n Мамонт дзена **

    Публикаций:
    0
    Регистрация:
    26 сен 2003
    Сообщения:
    684
    аа я про х64 не увидел
     
  5. kernel16

    kernel16 Human Vl

    Публикаций:
    0
    Регистрация:
    29 окт 2010
    Сообщения:
    316
    не пробовал, но что, если взять и вписать функцию как экстэрн инлайн и прилинковать ассемблерный модуль в формате .obj с mov eax,a jmp eax?...
     
  6. promtpol

    promtpol New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    60
    вот студия почему-то ругается что x86 и x64 не совместимы, masm вообще компилирует в x64?
     
  7. kernel16

    kernel16 Human Vl

    Публикаций:
    0
    Регистрация:
    29 окт 2010
    Сообщения:
    316
    [​IMG]

    в комплекте со студиет 2010 идёт, кстати, там по папкам поброди.
     
  8. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    promtpol
    умеет : http://www.codeproject.com/KB/cpp/InterfaceVCandMASM.aspx
     
  9. kernel16

    kernel16 Human Vl

    Публикаций:
    0
    Регистрация:
    29 окт 2010
    Сообщения:
    316
    C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\x86_amd64

    C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64
     
  10. promtpol

    promtpol New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    60
    Спасибо большое, как разберусь, отчитаюсь
     
  11. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Код (Text):
    1. void MyProc(void)
    2. {
    3.       void *func = GetProcAddress(hModule, "ExportFunc");
    4.       void **pret =  (void**)_AddressOfReturnAddress();
    5.       *pret = func;
    6. }
     
  12. promtpol

    promtpol New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    60
    typedef void (__cdecl *MYPROC)(LPWSTR);
    char GetUsNamExA[] = "GetUserNameExA";
    __declspec(dllexport) void __stdcall GetUserNameExA(void)
    {
    (MYPROC)GetProcAddress(secur32, GetUsNamExA);
    }
    компилятор сам скомпилил без прологов и эпилогов как мне и надо было:
    GetUserNameExA proc near
    mov rcx, cs:qword_180014F00
    lea rdx, aGetusernameexa ; "GetUserNameExA"
    jmp cs:GetProcAddress
    GetUserNameExA endp
    всем спасибо и спасибо MSDN:)