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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись кода в исполняемый фаил 
:(
    Опции темы
TheDestroyer
Дата 25.7.2009, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте
Возник такой вопрос: как записать поседовательность байт в указанное место в самом исполняемом файле? Т.е. чтобы exe-шник писал сам в себя.
Есть примерчик:
Код

typedef struct s_PatchDef
{
long    Offset;
int    Count;
unsigned char Data[];
}t_PatchDef;

void MyLongSeek(long offset)
{
fseek(fp, offset, SEEK_SET);
}

void DoPatch(t_PatchDef *Patch)
{
int i;
MyLongSeek(Patch->Offset);
for (i=0; i<Patch->Count; i++)
fwrite(Patch->Data[i], 1, 1, fp);
//Putb(Patch->Data[i]);
}

void PatchFile()
{
unsigned char byte;
t_PatchDef    Patch1_On   = {0x0001D3E3, 5, {0xe9, 0xf2, 0x01, 0x00, 0x00}};

fp = fopen("file.exe", "r+b");
if (!fp) return;

DoPatch(&Patch1_On);
//fseek(fp, 0L, SEEK_END);
fclose(fp);
}

Но это патч не самого "себя", а бинарного файла отличного от запущенного exe-шника. А как изменить код самого запущенного файла?
PM MAIL   Вверх
jonie
Дата 25.7.2009, 18:25 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



операционная система какая? В *n?x можно просто так и писать в себя, в windows система блокирует файл во время работы и это сделать не удасться (кроме как скопировать патчер, запустить его, самим выйти, и после патча пусть патчер запускает новый экземпляр того что падчит).


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
TheDestroyer
Дата 25.7.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Операционка - windows. Похоже неправильно выразился. Имеется ввиду писать не в сам фаил, а в загруженный исполняемый фаил в память.Видимо надо копать в сторону WriteProcessMemory.

PM MAIL   Вверх
Gordon
Дата 25.7.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 2
Всего: 6



Цитата(TheDestroyer @  25.7.2009,  21:04 Найти цитируемый пост)
Видимо надо копать в сторону WriteProcessMemory.


 smile 

А может в сторону asm? 


--------------------

  
     
PM MAIL WWW   Вверх
TheDestroyer
Дата 25.7.2009, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да, про асм подумал в первую очередь, но к сожалению не знаю как на нем это реализовать. Если кто приведет пример, буду благодарен. И интересно как лучше/удобнее реализовать данную задачу (асм или Си++)?
PM MAIL   Вверх
Леопольд
Дата 25.7.2009, 21:07 (ссылка)  | (голосов:5) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 10
Всего: 13



Цитата(TheDestroyer @ 25.7.2009,  20:04)
Операционка - windows. Похоже неправильно выразился. Имеется ввиду писать не в сам фаил, а в загруженный исполняемый фаил в память.Видимо надо копать в сторону WriteProcessMemory.

Типичное поведение для вирусов.


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
GoldFinch
Дата 25.7.2009, 21:13 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



TheDestroyer, если надо патчить себя в памяти, то это делается обычным присваиванием
*ptr=value;
или memcpy()

процесс может патчить сам себя как хочет. единственный нюанс что часть памяти может быть защищена от записи, это снимается через VirtualProtectEx

при этом на диск ничего не сохранится

-------
WriteProcessMemory нужна чтобы патчить в памяти другой процесс, при этом на диск тоже ничего не сохранится

---------
процесс - это .exe + все .dll

Добавлено через 56 секунд
Леопольд, ты не знаешь что такое "вирус".
PM MAIL ICQ   Вверх
Леопольд
Дата 26.7.2009, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 10
Всего: 13



Цитата(GoldFinch @ 25.7.2009,  21:13)
Леопольд, ты не знаешь что такое "вирус".

Как ты догадался? smile


--------------------
вопросов больше чем ответов
PM MAIL   Вверх
andrew_121
Дата 26.7.2009, 15:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(GoldFinch @  25.7.2009,  21:13 Найти цитируемый пост)
единственный нюанс что часть памяти может быть защищена от записи, это снимается через VirtualProtectEx

Как раз сейчас есть подобная задача. Думал что это невозможно.
Спасибо!


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Alek86
Дата 27.7.2009, 12:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



интересно, а вариант создавать и подключать динамичсеки dll не лучше ли этих извращений?


--------------------
user posted image    user posted image
PM MAIL   Вверх
GoldFinch
Дата 27.7.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Alek86, в большинстве случаев - нет
PM MAIL ICQ   Вверх
Alek86
Дата 27.7.2009, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(GoldFinch @  27.7.2009,  12:44 Найти цитируемый пост)
в большинстве случаев - нет

ни разу такого не нужно было
потому просто интересно - почему не лучше? из-за скорости?

Это сообщение отредактировал(а) Alek86 - 27.7.2009, 12:46


--------------------
user posted image    user posted image
PM MAIL   Вверх
GoldFinch
Дата 27.7.2009, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(Alek86 @  27.7.2009,  13:45 Найти цитируемый пост)
ни разу такого не нужно было

ни разу небыло нужно - значит ты вообще не занимался этой темой?

это либо называется "расширение функциональности программ" - когда код .exe или .длл перехватывается в нескольких местах и управление передается на код расширяющий функциональность проги (он может быть в длл)
либо это самомодифицирующийся\самонастраивающийся код - когда код твоей проги патчит сам себя
в обоих случаях надо както патчить имеющийся в памяти код (можно иногда патчить значения указателей в данных)

для самомодифицируюегося кода, записывать чтото в длл на диск, потом грузить эту длл с диска - это очень странное решение.
оно говорит о том, что либо человек не понимает как работает ОС, и как чтото патчить в памяти
либо это подходит для задач когда модифицировать код надо редко, может всего 1 раз. однако для таких задач всеравно все формируется в памяти используя FileMapping и затем сбрасывается на диск.
Но при этом происходит столько лишних телодвижений, что это очень и очень сомнительно

так что не лучше - потому что непонятно ЗАЧЕМ
PM MAIL ICQ   Вверх
Alek86
Дата 28.7.2009, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(GoldFinch @  27.7.2009,  17:54 Найти цитируемый пост)
значит ты вообще не занимался этой темой?

именно
думаю, мало кто таким вообще занимается (кроме вирусов, канешн smile)

Цитата
Самомодифицирующийся код (полиморфизм) — программный приём, при котором приложение создаёт или изменяет часть своего программного кода во время выполнения. Такой код обычно применяют в программах, написанных под процессор с фон-неймановской организацией памяти.



--------------------
user posted image    user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0653 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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