Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > C/C++: Системное программирование и WinAPI > Как передать управление зная только адрес в памяти?


Автор: cutecode 03.11.21, 10:04
есть пример на ассемлере загрузки dll из памяти

часть кода
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
        rb = PeHeader->OptionalHeader.AddressOfEntryPoint;
        __asm
        {
            mov eax, rb
            add eax, retadr // EAX = ENTRY POINT
            push 0
            push DLL_PROCESS_ATTACH // ставим флаг что подгрузили DLL
            push retadr
            call eax // передадим управление на точку входа в DLL
        }


Прекрасно работает в 32-битной версии, но 64-битной __asm запрещен.
Можно как то извратиться, и минуя ассемблер, так же передать управление в точку входа?

СПС

Автор: Qraizer 03.11.21, 15:01
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    BOOL WINAPI (*rb)(HINSTANCE, DWORD, LPVOID) = PeHeader->OptionalHeader.AddressOfEntryPoint;
    rb(retadr, DLL_PROCESS_ATTACH, NULL);
Не?

Автор: DrUnkard 03.11.21, 15:24
Я делаю так, но это не под Windows. Может сгодидзе? :D


<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    typedef  void(*pFunction)(void);
    pFunction JumpToApplication;
    unsigned int JumpAddress;
     
     
    main()
    {
    JumpAddress = *(unsigned int*)(ADDR_FUNCT); // Адрес куда прыгать
    JumpToApplication = (pFunction)JumpAddress;
     
    JumpToApplication(); // Ушли на адрес
     
    return 0;
    }

Автор: Qraizer 04.11.21, 17:40
Это то же самое. Автор по-видимому пытается вызвать DllMain, я взял её реальный прототип из MSDN. Префикс WINAPI и имена typedef важны для предоставления компилятору соглашений о вызовах, кои у 32- и 64-бит слегка отличаются.

Автор: cutecode 06.11.21, 01:24
Спасибо

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)