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

Поиск:

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


Опытный
**


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

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



Цитата(Daevaorn @ 17.7.2007,  22:37)
тааак, выбираем выражения господа, не на базаре!

заметь, не я первый начал..  smile 

bsa, код заточен под Windows (включая XP).. при компиляции нужно отключать свяческую оптимизацию.. код проверялся компилятором из BDS 2006 c опцией С++ Compiler (bcc32)->optimizations->Optimize: Disable all optimizations. (-Od)


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


Эксперт
****


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

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



НУ НЕ МОГ ОН РАБОТАТЬ ПРАВИЛЬНО! Так как ты переменную _main не проинициализировал. У тебя размер функции определялся неправильно. Соответственно, ты неизвестно сколько байт скопировал в буфер.
PM   Вверх
fish9370
Дата 17.7.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bsa @ 17.7.2007,  22:46)
Более того, даже если бы эта прога заработала, то чуть более сложная все равно не пойдет, так как в ней обязательно будут внутренние абсолютные переходы, которые перестанут работать, если поместить код функции в другое место адресного пространства.
Я поражаюсь, меня - программиста-ассемблерщика с 10-ти летним стажем обвиняют в незнании матчасти!!! smile 

идея заключается в том, чтобы на основании этого реализовывать защиту програм.. поскольку самомодифицирующийся код анализировать труднее.. и ломается сложне.. вот эти все заморочки с описанием указателей на функции и призваны создать перемещаемый код.. ведь тут же нет прямого вызова printf.. тебе ли это не знать с твоим 10 летним опытом.. кстати, за 10 лет можно многое подзабыть.. уж я то со своим 15 летним опытом знаю..  smile

Добавлено через 3 минуты и 44 секунды
прикрепляю проект..

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  Security.rar 28,79 Kb


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


sceloglauxalbifacies
****


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

Репутация: 8
Всего: 158



Цитата(fish9370 @  17.7.2007,  22:49 Найти цитируемый пост)
код заточен под Windows (включая XP)

что такое DEP слышал?

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

это... как бы помягче... вобщем, если приведенный выше код - демонстрация защитного механизма, то это была плохая, негодная идея.

Цитата(fish9370 @  17.7.2007,  23:00 Найти цитируемый пост)
поскольку самомодифицирующийся код анализировать труднее.. и ломается сложне..

да, только никакой связи между твоим примером и "самомодифицирующимся кодом" нет.
PM MAIL   Вверх
bsa
Дата 17.7.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



У меня и сейчас основной доход именно от продукции на asm. smile

Про защиту это понятно... Но в данном случае у тебя простая ошибка. Более того, их две - значение func_len всегда случайное число...
Под Линуксом не работает в принципе, даже если это исправить. Вываливается сегфолт. Думаю, потому что у меня в ядре включено опция защиты от выполнения кода в левых местах.
PM   Вверх
fish9370
Дата 17.7.2007, 23:18 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bsa @ 17.7.2007,  22:55)
НУ НЕ МОГ ОН РАБОТАТЬ ПРАВИЛЬНО! Так как ты переменную _main не проинициализировал. У тебя размер функции определялся неправильно. Соответственно, ты неизвестно сколько байт скопировал в буфер.

по началу ты и в то, что код можно в стеке исполнять не верил..

еще по теме..
Цитата

Разрешение на выполнение кода в стеке объясняется тем, что исполняемый стек необходим многим программам, в том числе и самой операционной системе для выполнения некоторых системных функций. Благодаря этому упрощается генерация кода компиляторами и компилирующими интерпретаторами

Цитата

Замечательно, что для программ, выполняющихся в стеке, справедлив принцип Фон Неймана - в один момент времени текст программы может рассматриваться как данные, а в другой - как исполняемый код. Именно это необходимо для нормальной работы всех распаковщиков и расшифровщиков исполняемого кода.

Цитата

При разработке кода, выполняющегося в стеке, следует учитывать, что в операционных системах Windows 9x, Windows NT и Windows 2000 местоположение стека различно, и, чтобы сохранить работоспособность при переходе от одной системы к другой, код должен быть безразличен к адресу, по которому он будет загружен. Такой код называют перемещаемым, и в его создании нет ничего сложного, достаточно следовать нескольким простым соглашениям - вот и все.

Цитата

что произойдет, если следующую функцию "void Demo() { printf("Demo\n");}" скопировать в стек и передать ей управление? Поскольку, инструкция call, вызывающая функцию pritnf, "переехала" на новое место, разница адресов вызываемой функции и следующей за call инструкции станет совсем иной, и управление получит отнюдь не printf, а не имеющий к ней никакого отношения код! Вероятнее всего, им окажется "мусор", порождающий исключение с последующим аварийным закрытием приложения. 

Цитата

Программируя на ассемблере, такое ограничение можно легко обойти, используя регистровую адресацию. Перемещаемый вызов функции printf упрощенно может выглядеть, например, так:"lea eax, printf\ncall eax" В регистр eax (или любой другой регистр общего назначения на выбор) заносится абсолютный линейный, а не относительный адрес и, независимо от положения инструкции call, управление будет передано функции printf, а не чему-то еще.
Для решения данной задачи исключительно средствами языка высокого уровня, - необходимо передать стековой функции указатели на вызываемые ее функции как аргументы. Это несколько неудобно, но более короткого пути, по-видимому, не существует.



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


Опытный
**


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

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



Цитата(dumb @  17.7.2007,  23:09 Найти цитируемый пост)
что такое DEP слышал?


нет.. но с удовольствием послушаю.. )

Цитата(dumb @  17.7.2007,  23:09 Найти цитируемый пост)
это... как бы помягче... вобщем, если приведенный выше код - демонстрация защитного механизма, то это была плохая, негодная идея.


как бы это помягче сказать.. это похоже на защитный код!?! это лишь пример доказывающий, что код может быть исполнен в области стека..

Цитата(dumb @  17.7.2007,  23:09 Найти цитируемый пост)
да, только никакой связи между твоим примером и "самомодифицирующимся кодом" нет.


нет? то что можно править код в области стека ты не веришь? 

P.S. читай выше.. 

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


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


found myself
****


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

Репутация: 20
Всего: 121



Цитата(fish9370 @  17.7.2007,  23:00 Найти цитируемый пост)
 и ломается сложне.. вот эти все заморочки с описанием указателей на функции и призваны создать перемещаемый код..


Повешают бряк на исполнение в стеке и будут отлаживать точно такой же код, а все эти заморочки побокуsmile 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
dark_religion
Дата 18.7.2007, 13:22 (ссылка)   | (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Спасибо fish9370, Я хоть и ниче не понял и немогу подискусировать, что будет, а чего не будет, но он единственный из всех показал реальное решение остальные просто поговорили. Может это и не оптимально, но лучшего никто не предложил. 
PM MAIL   Вверх
Daevaorn
Дата 18.7.2007, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(dark_religion @  18.7.2007,  14:22 Найти цитируемый пост)
из всех показал реальное решение

ага. которое не правильное.
PM MAIL WWW   Вверх
bsa
Дата 18.7.2007, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(dark_religion @ 18.7.2007,  13:22)
Спасибо fish9370, Я хоть и ниче не понял и немогу подискусировать, что будет, а чего не будет, но он единственный из всех показал реальное решение остальные просто поговорили. Может это и не оптимально, но лучшего никто не предложил.

Ты не понял. Повторяю еще раз коротко и ясно то, что было сказано ранее:
1. Данный код содержит ошибки.
2. Данный код если и работает, то только у автора. А после включения DEP может и перестать работать.
3. Даже после устранения всех ошибок код у меня не заработал.
PM   Вверх
anthony
Дата 18.7.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



bsa, Программа полностью работоспособна с небольшой модификацией (инициализацией _main и _Demo) (Microsoft Visual Studio 2005 Professional Edition C++) даже с включенной оптимизацией (контроль ошибок выключен, сборка в Release).

Код

#include <stdio.h>
#include <conio.h>

#pragma pack ( 1 )

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 **) = main;
  void (*_Demo) (int (*) (const char *,...)) = Demo;
  _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;
}



W4FhLF, DEP по умолчанию отключен, с включенным протестирую после (нужно перегружаться). Но и в принципе Ваш довод не так силен.

Так что господа Вы не правы. 

bsa относитесь к другим и их программам с большим уважением и пониманием, а не предвзято.
PM MAIL ICQ   Вверх
W4FhLF
Дата 18.7.2007, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 20
Всего: 121



Цитата(anthony @  18.7.2007,  14:47 Найти цитируемый пост)
W4FhLF, DEP по умолчанию отключен, с включенным протестирую после (нужно перегружаться). Но и в принципе Ваш довод не так силен.


Я что-то про DEP говорил?


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
anthony
Дата 18.7.2007, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да с включенным DEP тоже работает.


Та же программа немного модифицированная для языка С (проверено на MSVC 2005 PE, Release, Warnings Level 1)

Код

#include <stdio.h>

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

int main ( void ) {

    char buff [ 1000 ];
    int (*_printf) (const char *,...) = printf;
    int (*_main) ( void ) = main;
    void (*_Demo) (int (*) (const char *,...)) = Demo;
    int a = 0;
    int func_len = ( unsigned int ) _main - ( unsigned int ) _Demo;

    for ( a=0; a < func_len; a++ ) {
        buff [ a ] = ( ( char * ) Demo ) [ a ];
    }
    _Demo = ( void (*) ( int (*) ( const char *,... ) ) ) &buff [ 0 ];
    _Demo(_printf);
    getchar ( );
    return 0;
}


Это сообщение отредактировал(а) anthony - 18.7.2007, 15:33
PM MAIL ICQ   Вверх
bsa
Дата 18.7.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Хорошо, плюс еще один компилятор, который это делать позволяет. Но только после исправления ошибок, про которые я кучу раз говорил...
Повторяю, на Linux x86_64 с компилятором g++ 4.1.2 программа не заработала, даже после исправления ошибок.
PM   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1123 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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