Как передать управление зная только адрес в памяти?
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.84] |
|
|
Правила раздела C/C++: Системное программирование и WinAPI
FAQ Сайта (C++)
FAQ Форума
Наши Исходники
Поиск по Разделу
MSDN Library Online (Windows Driver Kit)
Google
Как передать управление зная только адрес в памяти?
|
Сообщ.
#1
,
|
|
|
|
есть пример на ассемлере загрузки dll из памяти
часть кода ![]() ![]() 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 запрещен. Можно как то извратиться, и минуя ассемблер, так же передать управление в точку входа? СПС |
|
Сообщ.
#2
,
|
|
|
|
![]() ![]() BOOL WINAPI (*rb)(HINSTANCE, DWORD, LPVOID) = PeHeader->OptionalHeader.AddressOfEntryPoint; rb(retadr, DLL_PROCESS_ATTACH, NULL); |
|
Сообщ.
#3
,
|
|
|
|
Я делаю так, но это не под Windows. Может сгодидзе?
![]() ![]() typedef void(*pFunction)(void); pFunction JumpToApplication; unsigned int JumpAddress; main() { JumpAddress = *(unsigned int*)(ADDR_FUNCT); // Адрес куда прыгать JumpToApplication = (pFunction)JumpAddress; JumpToApplication(); // Ушли на адрес return 0; } |
|
Сообщ.
#4
,
|
|
|
|
Это то же самое. Автор по-видимому пытается вызвать DllMain, я взял её реальный прототип из MSDN. Префикс WINAPI и имена typedef важны для предоставления компилятору соглашений о вызовах, кои у 32- и 64-бит слегка отличаются.
|
|
Сообщ.
#5
,
|
|
|
|
Спасибо
|