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

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

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

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

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

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

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

Как исполнить этот код? Я так понимаю простым jmp **** здесь не обойтись? Всякие моменты, касающиеся возврата по окончанию исполнения кода пока не рассматриваю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2014, 22:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выполнение подгружаемого кода (C++):

Повторное выполнение кода - C++
Здравствуйте! Ребята как я могу сделать так чтобы эта программа т.е Калькулятор повторил свою работу каждый раз когда я получаю свой...

Выполнение в стеке кода - C++
Есть такой код: void Demo(int(*_printf) (const char *, ...)) { _printf("Hello, Word!\n"); return; } int WriteMe(void...

Выполнение кода в стеке - C++
Доброго времени суток! Не могу разобратся в коде void Demo(int (*_printf) (const char *,...) ) { _printf("Hello, Word!\n"); ...

Запуск ассемблерного кода на выполнение из main() - C++
Добрый день. Подскажите, если есть готовый файл на ассемблерном коде, то как его можно запустить на выполнение из C++? Взаимодействовать...

Выполнение кода не доходит до определенной строки - C++
Где здесь ошибка: #include <iostream.h> #include <math.h> #include <conio.h> int main(void) { double x; std::cin>>x; ...

Выполнение исходного кода в Visual Studio - C++
Возник вопрос: Не создавая проект я создал файл с разрешением ".cpp". Как выполнить исходный код в программе Microsoft Visual Studio,...

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

Цитата Сообщение от Somebody Посмотреть сообщение
В стеке по умолчанию можно (во всяком случае в моей системе).
Про фокус со стеком знаю, когда вершину устанавливают где-то в коде и пушат в стек байты в обратном порядке. Но это не то, что хотелось бы видеть.
0
Somebody
2789 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 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. Думаю, это пофиксили со стеком потом...
0
Silvermatic
3 / 3 / 0
Регистрация: 27.02.2014
Сообщений: 34
28.02.2014, 11:18  [ТС] #6
Т.е. атрибуты страниц памяти устанавливаются и соблюдаются только ОС, а на уровне процессора такого понятия не существует?

Цитата Сообщение от Somebody Посмотреть сообщение
asm("jmp %0" : : "r"(code));
Впервые вижу такую запись.
Как понимаю символы "%0" - представляют аргумент для команды "jmp", который указан после оператора "::". Но что означает символ "r"? Чтение? Взятие адреса? Или что?
0
headcrab
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 19
17.03.2014, 20:10 #7
Присоединяюсь. Нужно, чтобы на всех системах моя программа могла грузить код в стек и там выполнять его. Компилирую через msvc. Можно ли параметрами компиляции, ну или правкой секций бинаря гарантированно сделать стек исполняемым? Вызывать из него планирую только внутренние функции программы. Или обязательно надо выставлять права на страницы стека VirtualProtect'ом? Хотелось бы без этого.

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

Как остановить выполнение кода в запущенном таймере? - C++
Здравствуйте. У меня есть таймер(в С++), в нем выполняются какие-либо действия и когда я нажимаю на кнопку мне надо остановить выполнение...

Как измерить потраченное время на выполнение кода - C++
Нужно измерить время затраченное на выполнене функции. Кто что посоветует? Решил так: LARGE_INTEGER time_n,time_s,freq; ...

Проверка введенных данных; выполнение кода по условию - C++
#include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include &quot;math.h&quot; int _tmain(int argc, _TCHAR* argv) { float a, b, c, x, res; ...

Таймер (выполнение кода через заданный промежуток времени) - C++
Всем привет, подскажите, как создать внутренний таймер, то есть через что бы через некоторое количество секунд, программа опять выполняла...


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
17.03.2014, 20:10
Ответ Создать тему
Опции темы

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