Задать вопрос

Из-за чего ошибка чтения?

Код:
unsigned char source[] = { ... };
    int sourceSize = sizeof(source);
    DWORD old_protect;
    VirtualProtect(&source, sourceSize, PAGE_EXECUTE_READWRITE, &old_protect);
    void(*f)() = (void(*)()) &source;
    f();

Проблема:
5b0fd88c0f02a525891577.jpeg
  • Вопрос задан
  • 173 просмотра
Подписаться 2 Средний 16 комментариев
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
Вы компилируете функцию в двоичный код и на месте же вызываете. Так что есть вопросы.
1. Функции обеспечили правильное соглашение вызова?
Мне что-то кажется, что при подобной ручной компиляции проще работать с соглашением PASCAL или STDCALL — ну, шут его знает.
2. VirtualProtect работает с целыми страницами. Так что на куске памяти из сегмента данных (ну или из стека, полного кода не вижу) она в лучшем случае откажет, в худшем ничего не сделает. Проверьте, была ли ошибка.
3. Первый параметр должен быть source, а не &source.
Ответ написан
Комментировать
drem1lin
@drem1lin
чуть программист, чуть чуть админ...
В добавлении к Mercury13, в предпоследней строке должно быть void(*f)() = (void(*)()) source;
А вообще, лучше выделить отдельную страницу, скопировать туда shell, и потом вызывать
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы