Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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. Может сгодидзе? <{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 |
Спасибо |