Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Запись кода в исполняемый фаил


Автор: TheDestroyer 25.7.2009, 17:18
Здравствуйте
Возник такой вопрос: как записать поседовательность байт в указанное место в самом исполняемом файле? Т.е. чтобы 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-шника. А как изменить код самого запущенного файла?

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

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

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


 smile 

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

Автор: TheDestroyer 25.7.2009, 20:37
Да, про асм подумал в первую очередь, но к сожалению не знаю как на нем это реализовать. Если кто приведет пример, буду благодарен. И интересно как лучше/удобнее реализовать данную задачу (асм или Си++)?

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

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

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

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

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

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

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

Добавлено через 56 секунд
Леопольд, ты не знаешь что такое "вирус".

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

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

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

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

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

Автор: GoldFinch 27.7.2009, 12:44
Alek86, в большинстве случаев - нет

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

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

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

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

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

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

так что не лучше - потому что непонятно ЗАЧЕМ

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)