Форум: Форум C++Разное
Новые темы: 00
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум C++

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Можно ли во время исполнения программы добавлять что-нибудь в ехе файл самой программы?
 
 автор: alex19921992   (03.03.2007 в 11:09)   письмо автору
 
 

сабж

  Ответить  
 
 автор: cheops   (03.03.2007 в 13:28)   письмо автору
 
   для: alex19921992   (03.03.2007 в 11:09)
 

Вообще можно...

  Ответить  
 
 автор: oleg_alexeev   (03.03.2007 в 14:33)   письмо автору
 
   для: alex19921992   (03.03.2007 в 11:09)
 

Вообще-то нельзя :-)
Но если знаете как - напишите.

  Ответить  
 
 автор: Ниkоза   (13.03.2007 в 21:45)
 
   для: oleg_alexeev   (03.03.2007 в 14:33)
 

Конечно можно. Работает ведь загруженный в память ексешник. а сам файл *.exe лежит мёртвым грузом. Можно что угодно с ним сделать.
Но можно изменить файл даже прямо в памяти. Можно вообще творить всё что угодно.
Вот простейший пример вставки в exe - файл.

asm:
.586
.model flat, stdcall
option casemap :none

include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\kernel32.inc
includelib \MASM32\LIB\kernel32.lib
includelib \MASM32\LIB\shell32.lib
includelib \MASM32\LIB\user32.lib
BSIZE equ 128

.data

fName BYTE "C:\test.exe", 0
fHandle DWORD ?
cRead DWORD ?
cWrite DWORD ?
cWritten DWORD ?
comma BYTE "Изучайте мануалы, и Вы проживёте долгую жизнь!"
buf BYTE BSIZE dup (?)
.code

start:

invoke CreateFile, ADDR fName, ;Открываем exe.файл fName

GENERIC_READ+GENERIC_WRITE, ;Для чтения и записи
0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0
mov fHandle, eax ;Запоминаем Хендл
invoke SetFilePointer, fHandle, 0, ;Перемещаем указатель на самую 1 позицию (т.е. в начало файла)...
NULL, FILE_BEGIN ;От начала файла
invoke ReadFile, fHandle, ADDR buf, ;А всё что после - пока копируем в буфер...
BSIZE, ADDR cRead, NULL
invoke SetFilePointer, fHandle, 1,
NULL, FILE_BEGIN ;Такс, теперь опять возвращаемся на первую позицию (т.е. в самое начало файла)
invoke WriteFile, fHandle, ADDR comma, ;Вставляем нашу заготовку (адрес - comma )
20, ADDR cWrite, NULL ; И для этого раздвигаем место для 46 знаков
invoke WriteFile, fHandle, ADDR buf, ; А теперь дописываем из буфера наш скопированный файл
cRead, ADDR cWrite, NULL
invoke CloseHandle, fHandle
invoke ExitProcess, 0 ; Вот и всё...
end start

Вместо ексешника можно переписать любой файл.
Правда, при повторном запуске ексешник не откроется...
так сказать, "зашифровали" мы его... Хрен кто его запустит...


А вернуть всё на место также легко - немного переписать код. Сначала ставим указатель на 46 позицию (считая ноль), копируем всё это в буфер. (это мы скопировали наш прежний файл без добавки), теперь обрезаем файл до нуля, теперь ставим указатель на 1 позицию, и пишем из буфера. Теперь закрываем файл.

  Ответить  
 
 автор: alex19921992   (14.03.2007 в 08:51)   письмо автору
 
   для: Ниkоза   (13.03.2007 в 21:45)
 

Я конечно же ничего не понял, просто я видел программы, которые разговаривают с человеком и по окончании разговора самообучаются - записывают в себя что-то. Я никаких файлов не увидел рядом, ну и подумал что прога сама в себя пишет...

  Ответить  
 
 автор: oleg_alexeev   (14.03.2007 в 09:29)   письмо автору
 
   для: alex19921992   (14.03.2007 в 08:51)
 

Ну, файлы могли быть и не рядом, а где-нибудь в Documents and Settings
А если данных немного, то они могли быть не в файлах, а в реестре.

Есть неплохая утилита "Process Explorer" от Sysinternals. С ее помощью можно следить за всеми
операциями с файлами или реестром, выполняемыми разными программами.

  Ответить  
 
 автор: oleg_alexeev   (14.03.2007 в 09:17)   письмо автору
 
   для: Ниkоза   (13.03.2007 в 21:45)
 

>> Конечно можно. Работает ведь загруженный в память ексешник. а сам файл *.exe лежит мёртвым грузом. Можно что угодно с ним сделать.

В windows exe-файл после запуска не лежит мертвым грузом на диске, а является источником,
откуда windows будет считывать код, если он был выгружен из оперативной памяти во время
работы. Это написано у Рихтера в разделе про отображаемые на память файлы (memory-mapped
files). Логично предположить, что windows не даст туда ничего записать во время работы exe.

Я делал такую проверку -

1. открыл exe текстовым редактором и внес изменения в текст.
2. запустил exe - он вывел этот текст.
3. при запущенном exe пытаюсь открыть его редактором - не удается.

Мой exe - это стандартное GUI-приложение, скомпилированное Visual Studio.
А при каких условиях работает ваш пример ?

  Ответить  
 
 автор: Ниkоза   (14.03.2007 в 11:23)
 
   для: oleg_alexeev   (14.03.2007 в 09:17)
 

Никогда не делай больше этого - вносить изменения в файл с помощью текстового редактора. (если только это не текстовый файл. ) Иначе вообще навсегда его потеряешь. Дело вот в чём - текстовый редактор все пробелы заменит нулями. Для примера - открой файл *.jpg с помощью текстового редактора, и измени всего 1 первый символ. А потом сохрани. Потом опять открой этот файл, и верни всё назад. А попробуй запустить - ничего не получится. файл загублен.
А знаешь что произошло? Возьми windows comander, и дай приказ сравнить оба файла - у меня получилось более 600 изхменений !!! Это поменял только 1 знак. Редактор заменил пропуски на нули. А обратно никак нельзя, ведь где-то есть настоящие нули. Короче - файл загублен. Изменять можно только напрямую - открыв файл программно для чтения и записи.

... В exe файл можно записать всё что угодно и во время работы.

Исскуственный интеллект - больная тема для серьёзных программистов. Я тоже интересуюсь этой темой. Очень уж серьёзная вещь... Теоретически - можно самого себя (свою личность) записать в мегабитный мир, и жить вечно. Где нет ни смерти, ни болезней, а ты равен богу. Но всё это в будущем, к сожалению... Я тут как-то пытался хотя бы теорию какую-то начальную создать - что такое "Я"... Но... Чёрт его знает, как работает мой мозг. Где приоритеты? Какие константы? Инстинкт самосохр. Секс? Но одно точно - нужен компьютер с громадной оперативкой, огромное количество инфы. и многопоточная прога, основанная на сравнительном анализе (по типу мозга человека). Создать такой комп кстати наверное уже можно будет скоро - так быстро они растут... Есть в Инете ( я знаю) серьёзные дяденьки, не в России конечно, занимаются этим, хорошо платят за советы. Может. где-то что-то...

  Ответить  
 
 автор: alex19921992   (14.03.2007 в 12:49)   письмо автору
 
   для: Ниkоза   (14.03.2007 в 11:23)
 

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

  Ответить  
 
 автор: Ниkоза   (14.03.2007 в 13:30)
 
   для: alex19921992   (14.03.2007 в 12:49)
 

Ну если у этой программы уже есть база вопрос-ответ, то о каком развитии речь? Она и ответит из базы вопрос-ответ. Хотя человеку огромная помощь. это как в шахматы - ты можешь зевнуть, а компьютер - нет.
Вот если програма будет менять саму базу "вопрос - ответ" с возможностью наращивать её до бесконечности - вот это уже настоящая личность. Искусственный интеллект Но такого пока нет в массовом пользовании. Эх, какие деньги тут светят, робяты...

Кстати, что за программа? Что-то интересно стало...

  Ответить  
 
 автор: alex19921992   (14.03.2007 в 18:04)   письмо автору
 
   для: Ниkоза   (14.03.2007 в 13:30)
 

Так вот в том-то и дело, что прога всегда обучается! Прога ChatMaster вообще после каждого разговора грузит диалог себе в исполняемый файл и таким образом самообучается!!!!! И даже в ее руководстве написано: не учите ее плохим словам)))) Кстати этот эксешник уже размером с мегабайт)))

  Ответить  
 
 автор: oleg_alexeev   (14.03.2007 в 13:54)   письмо автору
 
   для: Ниkоза   (14.03.2007 в 11:23)
 

Ну, не все текстовые редакторы одинаковы... Я пользовался таким, который ничего лишнего
не делает с файлом (EditPlus называется). Я же написал, что после редактирования файл
нормально запустился. И вот, когда он запущен, редактор уже не может его открыть. Открывает
он его все той же функцией CreateFile (я так полагаю :) с правами на запись.

Я описал эксперимент, который каждый может повторить и убедиться, что записать в запущенный exe
нельзя. Опиши свой эксперимент, который показывает, что можно.

А ИИ действительно интересная тема, прокомментирую только одно высказывание:
>> можно самого себя (свою личность) записать в мегабитный мир, и жить вечно
Жить-то буду не я, а моя копия. Не очень-то устраивает :)

  Ответить  
 
 автор: Ниkоза   (14.03.2007 в 18:23)
 
   для: oleg_alexeev   (14.03.2007 в 13:54)
 

Да, конечно, запущеный РЕ гораздо проще Вам править в памяти. ( хотя повторюсь.есть способ и более наглый. написать код - можно конечно... Тут ничего сложного, просто я буду использовать свою собственную функцию. Выкладывать тут свой исходник такой полезной штучки я не буду, конечно. Ну а через память понятно да. Сначала находим первый байты адрес файла в памяти. вычисляем размер, потом резервируем в памяти место для будущей вставки, потом ... Что потом? Вот я недопонимаю, а что нужно сделать с файлом? Изменить-испортить, или дописать сверху кусок своего кода (заразить)? Так это можно сделать и с неоткрытым файлом. Почему именно открытый, в чём хитрость? Может, проще использовать хук? Нельзя ли узнать что Вы задумали? Что за файл? Что он должен сделать-не сделать?

  Ответить  
 
 автор: Ниkоза   (14.03.2007 в 18:31)
 
   для: oleg_alexeev   (14.03.2007 в 13:54)
 

А насчёт ИИ что в мегабитном мире живёшь не ты а копия - не согласен. Прежде всего. как ни печально, давайте реально и честно ответим на вопрос - что такое "Я". А это не тело. Это наша память, и где-то сбоку приделанный процессор. только директивы его нам неизвестны. Есть и операционная система - наши инстинкты и прочее. Значит, "Я" это просто файл. И он может быть скопирован. Смиримся.

И вот ещё в порядке бреда... Электричество лучше всего циркулирует в плазме. Никаких энергопотерь. Сверхпроводимость. А теперь представьте Солнце. Огромный шар плазмы. Вполне кто-то там может сейчас жить.
:-)

  Ответить  
 
 автор: alex19921992   (14.03.2007 в 18:36)   письмо автору
 
   для: Ниkоза   (14.03.2007 в 18:31)
 

И что, еще ученые не придумали приборов, способных улавливать биохимические сигналы наших нервов, а значит и мозга? и не могут просто так скопировать память куда-нибудь на винчестер?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования