Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Silvermatic
3 / 3 / 0
Регистрация: 27.02.2014
Сообщений: 34
#1

Выполнение подгружаемого кода - C++

27.02.2014, 22:56. Просмотров 277. Ответов 6
Метки нет (Все метки)

Постараюсь объяснить максимально доступно, хотя корректно сформулировать задачу мне будет тяжеловато.
Языки: С\Срр\Asm
ОС: Win

1. Динамически выделяем некоторый объём памяти
2. Записываем в эту память некоторый корректный код (не важно как пишем, главное код корректный)

Как исполнить этот код? Я так понимаю простым jmp **** здесь не обойтись? Всякие моменты, касающиеся возврата по окончанию исполнения кода пока не рассматриваю.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
27.02.2014, 23:03     Выполнение подгружаемого кода #2
по простому не выйдет.
сам не знаю как, но начал бы наверно с
http://ru.wikipedia.org/wiki/Portable_Executable
Somebody
2777 / 1591 / 142
Регистрация: 03.12.2007
Сообщений: 4,169
Завершенные тесты: 1
27.02.2014, 23:22     Выполнение подгружаемого кода #3
Цитата Сообщение от Silvermatic Посмотреть сообщение
Я так понимаю простым jmp **** здесь не обойтись?
Почему? Должно выйти. Надо только, чтобы атрибуты этих страниц памяти разрешали исполнение кода. В стеке по умолчанию можно (во всяком случае в моей системе).
Silvermatic
3 / 3 / 0
Регистрация: 27.02.2014
Сообщений: 34
28.02.2014, 01:57  [ТС]     Выполнение подгружаемого кода #4
Цитата Сообщение от Somebody Посмотреть сообщение
Надо только, чтобы атрибуты этих страниц памяти разрешали исполнение кода.
Какими функциями это решается? Крайне желательно не из WinAPI. Хотя бы названия, а дальше сам разберусь.

Цитата Сообщение от Somebody Посмотреть сообщение
В стеке по умолчанию можно (во всяком случае в моей системе).
Про фокус со стеком знаю, когда вершину устанавливают где-то в коде и пушат в стек байты в обратном порядке. Но это не то, что хотелось бы видеть.
Somebody
2777 / 1591 / 142
Регистрация: 03.12.2007
Сообщений: 4,169
Завершенные тесты: 1
28.02.2014, 10:03     Выполнение подгружаемого кода #5
Цитата Сообщение от Silvermatic Посмотреть сообщение
Какими функциями это решается? Крайне желательно не из WinAPI.
WinAPI - VirtualProtect или сразу при выделении VirtualAlloc'ом нужные атрибуты. Без системного API никуда. Всё равно кроссплатформенно ничего серьёзного внедрённым кодом не сделаешь...
Цитата Сообщение от Silvermatic Посмотреть сообщение
Про фокус со стеком знаю, когда вершину устанавливают где-то в коде и пушат в стек байты в обратном порядке. Но это не то, что хотелось бы видеть.
Зачем указатель стека ставить на код? Сам код можно записать в стек.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
 
int f(int x)
{
    char code[] = "\x8b\x45\x08\x01\xc0\xc9\xc3";
    asm("jmp %0" : : "r"(code));
}
 
int main(void)
{
    std::cout << f(42);
}
Добавлено через 18 минут
Да, у меня XP. Думаю, это пофиксили со стеком потом...
Silvermatic
3 / 3 / 0
Регистрация: 27.02.2014
Сообщений: 34
28.02.2014, 11:18  [ТС]     Выполнение подгружаемого кода #6
Т.е. атрибуты страниц памяти устанавливаются и соблюдаются только ОС, а на уровне процессора такого понятия не существует?

Цитата Сообщение от Somebody Посмотреть сообщение
asm("jmp %0" : : "r"(code));
Впервые вижу такую запись.
Как понимаю символы "%0" - представляют аргумент для команды "jmp", который указан после оператора "::". Но что означает символ "r"? Чтение? Взятие адреса? Или что?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2014, 20:10     Выполнение подгружаемого кода
Еще ссылки по теме:

Выполнение в стеке кода C++
Выполнение из переменных C++
C++ Выполнение строки
Запуск ассемблерного кода на выполнение из main() C++
C++ Повторное выполнение кода

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
headcrab
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 18
17.03.2014, 20:10     Выполнение подгружаемого кода #7
Присоединяюсь. Нужно, чтобы на всех системах моя программа могла грузить код в стек и там выполнять его. Компилирую через msvc. Можно ли параметрами компиляции, ну или правкой секций бинаря гарантированно сделать стек исполняемым? Вызывать из него планирую только внутренние функции программы. Или обязательно надо выставлять права на страницы стека VirtualProtect'ом? Хотелось бы без этого.

C
1
asm("jmp %0" : : "r"(code));
%0 - означает, что на это место подставляется первый по счету аргумент. После первого ':' перечисляются аргументы-примники, после второго ':' аргументы-источники.
"r" означает, что аргумент в скобках это регистр, "m" - что это память. Их много разных есть.
Не уверен, но вроде при указании абсолютного адреса для jmp или call нужно перед %0 добавлять символ '*'.
А вообще можно без асм вставки привести массив к типу функция и вызвать ее. Тут главное не забыть восстановить указатель стека перед ret, иначе нормального возврата не будет.
Yandex
Объявления
17.03.2014, 20:10     Выполнение подгружаемого кода
Ответ Создать тему
Опции темы

Текущее время: 16:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru