Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замена кода С++ на ходу, нужно менять код во время выполнения 
:(
    Опции темы
dark_religion
Дата 17.7.2007, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 8.9.2006

Репутация: -3
Всего: -3



Подскажите пожалуйста как можно заменить код программы во время выполнения и выполнить его снова без перекомпиляции на С++

Или какие еще другие варианты возможны кроме С++
PM MAIL   Вверх
Daevaorn
Дата 17.7.2007, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(dark_religion @  17.7.2007,  21:01 Найти цитируемый пост)
Или какие еще другие варианты возможны кроме С++ 

С++ компилируемый язык, поэтому на выходе получается машинный код. Вот его с некоторыми трудностями, но можно редактировать в ран-тайм
PM MAIL WWW   Вверх
bsa
Дата 17.7.2007, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Имхо, проще для этого использовать наследование классов и виртуальные функции.
А если надо писать самомодифицирующийся код (вирус пишишь?), то пиши на ассемблере.
PM   Вверх
chipset
Дата 17.7.2007, 20:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Скрипты или (до некоторого уровня) полиморфизм спасет тебя smile


--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
dark_religion
Дата 17.7.2007, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 8.9.2006

Репутация: -3
Всего: -3



Ребята а можно поконкретнее про каждый метод. Каким образом . кто-то может предложить реализацию для 

например "Hello world "
шоб менялось С "привет Россия" 

если "Hello world" выводится вот так 

printf("Hello world"); без переменной. без всяких if & else шоб эта строчка в коде менялась на 
printf("Privet Russia");
PM MAIL   Вверх
Daevaorn
Дата 17.7.2007, 20:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(dark_religion @  17.7.2007,  21:37 Найти цитируемый пост)
если "Hello world" выводится вот так 

этого "так" в exe нет. менять нужно данные, а не код.
PM MAIL WWW   Вверх
dark_religion
Дата 17.7.2007, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 8.9.2006

Репутация: -3
Всего: -3



А мне нужно именно код. Но я не поспорить кто-то может показать конкретный метод?
PM MAIL   Вверх
dark_religion
Дата 17.7.2007, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 198
Регистрация: 8.9.2006

Репутация: -3
Всего: -3



Мне посоветовали менять линки в минарнике .. как это можно понять? что такое бинарник?
PM MAIL   Вверх
nickless
Дата 17.7.2007, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Вот тут был небольшой примерчик самомодифицирующегося кода smile 

Цитата(dark_religion @  17.7.2007,  20:10 Найти цитируемый пост)
что такое бинарник?

dark_religion, а ты уверен что оно тебе надо? smile 


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
fish9370
Дата 17.7.2007, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



Код

//оптимизация отключена полностью

//---------------------------------------------------------------------------
#include <stdio.h>
#include <conio.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
void Demo(int (*_printf) (const char *,...) )
{
  _printf("Hello, Word!\n");
  return;
}

int main(int argc, char* argv[])
{
  char buff[1000];
  int (*_printf) (const char *,...);
  int (*_main) (int, char **);
  void (*_Demo) (int (*) (const char *,...));
  _printf=printf;

  int func_len = (unsigned int) _main - (unsigned int) _Demo;
  for (int a=0;a<func_len;a++)
    buff[a]= ((char *) Demo)[a];
  _Demo = (void (*) (int (*) (const char *,...)))&buff[0];

  _Demo(_printf);
  getch();
  return 0;
}


пояснение к примеру.. здесь код фунции помещается в область стека, в которой позволяется производить запись/чтение/исполнение кода.. после чего функции передается управление..

Это сообщение отредактировал(а) fish9370 - 17.7.2007, 21:57


--------------------
undefined
PM MAIL WWW ICQ   Вверх
bsa
Дата 17.7.2007, 22:00 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



fish9370, мало того, что глупость сморозил, так еще и _main не проинициализировал перед использованием.
А потом, кто тебе сказал, что функция из области стека будет исполняться?
PM   Вверх
fish9370
Дата 17.7.2007, 22:07 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



а _main лишь нужен, чтобы вычислить конец функции..   smile 

читай матчасть!!

Это сообщение отредактировал(а) chipset - 20.7.2007, 21:35


--------------------
undefined
PM MAIL WWW ICQ   Вверх
bsa
Дата 17.7.2007, 22:31 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Во-первых, твой код компилируется так (после убирания кривых заголовков, прагм и getch):
Код
$ g++ -Wall aaa.cpp
aaa.cpp: In function ‘int main(int, char**)’:
aaa.cpp:25: ошибка: cast from ‘int (*)(int, char**)’ to ‘unsigned int’ loses precision
aaa.cpp:25: ошибка: cast from ‘void (*)(int (*)(const char*, ...))’ to ‘unsigned int’ loses precision
Как ты мог заметить, совсем не компилируется.
Во-вторых, после земены unsigned int на unsigned long (не забываем, что кроме 32-х битной windows существуют другие платформы с другой разрядностью) программа собирается без ошибок. Но при этом при запуске повисает.
В-третьих, после добавления между строк 25 и 26 операции printf("%i\n", func_len); появляется вывод:
Код
$ ./a.out 
4195952
Ошибка сегментирования
$ ./a.out 
905601952

$ ./a.out 
-941235616
Ошибка сегментирования
$ ./a.out 
74263248

$ ./a.out 
1408701296

$ ./a.out 
1316613024

$ ./a.out 
828955280

$ ./a.out 
75426800

$ ./a.out 
-1305704752
Ошибка сегментирования
 (там где нет ошибки сегментации я прерывал Ctrl-C, так как было понятно, что все равно вылетит из-за переполнения стека мусором).

Цитата(fish9370)
читай матчасть!!
Кто бы говорил. Как ты думаешь, почему число каждый раз разное, в том числе отрицательное? А я тебе отвечу:
Цитата(bsa)
_main не проинициализировал перед использованием


Это сообщение отредактировал(а) bsa - 17.7.2007, 22:39
PM   Вверх
Daevaorn
Дата 17.7.2007, 22:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(fish9370 @  17.7.2007,  23:07 Найти цитируемый пост)
bsa, ты бы чем такие умные речи толкать.. почитал бы литературу.. и код бы откомпилил.. и посмотрел на результаты.. пустозвон.. 

тааак, выбираем выражения господа, не на базаре!
PM MAIL WWW   Вверх
bsa
Дата 17.7.2007, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Более того, даже если бы эта прога заработала, то чуть более сложная все равно не пойдет, так как в ней обязательно будут внутренние абсолютные переходы, которые перестанут работать, если поместить код функции в другое место адресного пространства.
Я поражаюсь, меня - программиста-ассемблерщика с 10-ти летним стажем обвиняют в незнании матчасти!!! smile 
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0927 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.