Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Изменение кода на лету  (Прочитано 12232 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Migmile
Помогающий

ru
Offline Offline

« : 23-10-2003 10:30 » 

Любопытства ради, кто-нибудь знает как менять свой-же исполняемый код по w2k, а то при попытке записи получаю вполне обоснованный AV Улыбаюсь
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 23-10-2003 11:07 » 

Код, находящийся в страницах только для исполнения и чтения, модифицировать нельзя. Для этого распологают код в стеке.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Migmile
Помогающий

ru
Offline Offline

« Ответ #2 : 23-10-2003 11:09 » 

Неужели так все запущено? Отлично RXL,
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 23-10-2003 11:31 » 

Цитата

Код, находящийся в страницах только для исполнения и чтения, модифицировать нельзя. Для этого распологают код в стеке


Можно проще, есть системные процедуры для изменения атрибутов страниц. Например в винде VirtualProtectEx. И не забудь после изменения вызвать FlushInstructionCache.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 23-10-2003 11:50 » 

SlavaI, на каком уровне доступно это? На всех?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #5 : 23-10-2003 12:06 » 

Цитата

SlavaI, на каком уровне доступно это? На всех?


Ну надо иметь handle процесса, открытый с разрешение PROCESS_VM_OPERATION, конечно не всем его дадут. Функция естественно юзер модовская.
Записан
Migmile
Помогающий

ru
Offline Offline

« Ответ #6 : 23-10-2003 13:31 » new

Вот что получилось (код грязный, но работает) Улыбаюсь
#include <windows.h>
void f1(int &a)
{
 a=a+5;
}

void f2(int &a)
{
 a=a-5;
}
int main(int argc, char* argv[])
{
 int a;
 MEMORY_BASIC_INFORMATION mb;
 unsigned char * ptr1=(char *)(void*)f1,*ptr2=(char *)(void *)f2;
 VirtualQuery(ptr1,&mb,sizeof(mb));
 DWORD     oldprotect;
 VirtualProtect(ptr1, 4, PAGE_WRITECOPY, &oldprotect);
 for (int i=0;;i++)
 {
  ptr1=ptr2;
  if (ptr1[i-1]==0xC3 && ptr1==0x90) break;
 }
 VirtualProtect(ptr1, 4, PAGE_EXECUTE, &oldprotect);
 a=5;
 f1(a);
 return 0;
}
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #7 : 23-10-2003 13:48 » 

Цитата

Вот что получилось


Молодец! FlushInstructionCache все таки вызови.
Записан
Migmile
Помогающий

ru
Offline Offline

« Ответ #8 : 23-10-2003 13:54 » 

SlavaI, не успел Отлично  Отлично
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #9 : 23-10-2003 16:41 » 

Migmile, какой молодец - действительно интересно...
Записан

А птичку нашу прошу не обижать!!!
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines