Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];

Вниз

Как можно что то запихать в Exe файл?   Найти похожие ветки 

 
k-sergey   (2002-10-30 11:41) [0]

Как можно что то запихать в Exe файл?
ну как бы сохранение данных программы в самом exe фйле...
Помогите кто знает...!
пишите на мыло k-sergey@mail.ru


 
cutter-pro   (2002-10-30 11:52) [1]

Один из вариантов легкий, другой - трудный.
Трудный вариант: изучить структуру exe файла, заголовки, таблицы сегментов и т.д. и корректировать в необходимом месте, определяемом на основании выше приведенной информации.
Легкий вариант: объявить, например, типизированную константу с каким-нибудь предопределенным (редким:) значением типа 1234h, затем найти в файле смещение этой переменной, а зная смещение данных в файле, можно туда записывать все, что хочешь.

P.S. Это классический банальный подход (когда ничего другого в голову больше не приходит:). Естественно, есть и другие варианты и их практически бесконечное количество. Работало бы воображение.


 
MegaVolt   (2002-10-30 12:09) [2]

Есть ещё один очень простой вариант но для него неужно иметь копию ехешника: Дописываем в конец ехешника то что вы хотите а далее например в самый конец дописываете ссылку на конец исходного ехешника. Работа с таким файлом возможна и из самого ехешника: первым делом лезем в конец файла-4 байта (размер integer) читаем указатель и далее перемещаемся в файле на позицию указанную в указателе и получаем начало наших данных.


 
F1   (2002-10-30 12:34) [3]

А как насчет того, что винды блокируют запущенный exe-шник даже на чтение???


 
MegaVolt   (2002-10-30 13:26) [4]

А для чего я написал что необходимо иметь копию? А на счёт того что винды блокируют доступ даже на чтение это не совсем так :) Я собственноручно проверял совет который привёл выше покрайней мере по 98! Всё прекрасно извлекалось :)


 
cutter-pro   (2002-10-30 13:27) [5]

>F1 Насчет блокировки на запись - это ты правильно подметил. Надо подумать... А вот насчет блокировки даже на чтение - позволю себе с тобой не согласиться - в w98se файл читается без проблем.
Насчет w95, wme, wnt, w2000, wxp - понятия не имею, да и честно говоря не имею желания пробовать.


 
F1   (2002-10-30 14:00) [6]

>MegaVolt (30.10.02 13:26)
>cutter-pro (30.10.02 13:27)
А я не знаю, как там в 98, а вот в 2000, XP сто пудово не работает даже чтение.
Хотя он ведь делается MemoryMapped, может быть его читать сразу из памяти, только вот где эта память???
Кстати, даже размер файла нельзя узнать :(


 
KSergey   (2002-10-30 14:10) [7]

Люди!!! Есть же отличный способ и отличное место - ресурсы. Туда можно совершенно законно и стандартными методами пихать/читать все что угодно! Любые пользовательсие данные!
Лично мне известен только одино неудобство такого подхода: ресурся впихиваются на этапе линковки, понятно, и если пихать в ресурсы сильно большие данные (ну там 100Мб, например, а что?) - то при отладке надоедает ждать каждый раз перекомписяции/перелинковки. Ну тут выход наверное такой: отлаживем на небольшом объеме модельных данных, а как все готоро - пересобираем с реальными данными. В принципе любой из предложенных способов страдает тем же. Зато тут все законно ;)


 
KSergey   (2002-10-30 14:12) [8]

> F1 © (30.10.02 14:00)
> А я не знаю, как там в 98, а вот в 2000, XP сто пудово не
> работает даже чтение.

Вранье наглое. Читать можно сколько угодно. (равно как и копировать внешними программами запущеный exe-шник)


 
F1   (2002-10-30 14:16) [9]

>KSergey © (30.10.02 14:10)
>ресурся впихиваются на этапе линковки

Как я понял, так не пойдет.

Я вот вспомнил, что у есть hInstance-указатель на начало спроецированного exe-шника в памяти процесса. А оттуда можно читать(насколько я знаю), а если нужно писАть, то в копию.


 
F1   (2002-10-30 14:22) [10]

>KSergey © (30.10.02 14:12)
>Вранье наглое. Читать можно сколько угодно
Согласен, стормозил, я пытался:
St:=TFileStream.Create(прям сам ехешник,fmOpenRead);
Так он меня отругал неподетски.
А о копировании как-то не подумал /:(


 
KSergey   (2002-10-30 16:44) [11]

> F1 © (30.10.02 14:22)
> А о копировании как-то не подумал /:(

Да при чем тут, блин, копирование? Про копирование я сказал к тому, что при копировании файл необходимо прочитать, а раз копируется - значит и читать можно. Вот пример, наконец. Точно работает.

procedure TForm1.Button1Click(Sender: TObject);
var
FStream: TFileStream;
Buffer: PChar;
begin
GetMem(Buffer, 100);
try
FStream := TFileStream.Create(Application.ExeName, fmOpenRead + fmShareDenyNone);
try
FStream.Read (Buffer^, 99);
Memo1.Lines.Text := Buffer;
finally
FStream.Free;
end;
finally
FreeMem(Buffer);
end;
end;


Ну в Memo, понятно, не все 99 байт скопируются, но это уже отдельная тема. Факт в том, что сам exe-шник читает себя запросто.


 
F1   (2002-10-30 16:48) [12]

Все понятно!!!
Я когда так же делал не указал fmShareDenyNone
Вот меня и отругали неподетски.


 
ЬупфМщде   (2002-10-30 16:56) [13]

Я же написал ясно и чётко что работает и именно так как написал KSergey. У меня приложение во время работы читает файл с ехешником в поток к нему дописывает всё что мне нужно и записывает под другим именем. А при запуске этого приложения оно автоматически извлекает данные из своего хвоста и исспользует их :)


 
KSergey   (2002-10-31 12:17) [14]

Я до кучи сюда добавлю еще про чтение из ресурсов, т.к., по-моему, это наиболее правильно.

Путь таков (если кто не в курсе)

Делаем файл который надо в ресурсы запихать. Пусть, например, это будет какой-нибудь текст. Файл Text.txt. Потом в любом текстовом редакторе делаем файл text.rc следующего содержания:

TEXTDATA USERDATA Text.txt

Далее в командной строке набираем

brcc32.exe text.rc

Должно пройти без сообщений об ошибках. Ошибки - исправляем. В результате должен получиться компилрованный файл ресурсов Text.RES.

Теперь собственно кусок кода в дельфи:

....
implementation

{$R *.DFM} // это было
{$R Text.RES} // а вот эту строчку добавляем

....

procedure TForm1.Button2Click(Sender: TObject);
var
Buffer: PChar;
ResStream: TResourceStream;
begin
GetMem(Buffer, 100);
try
ResStream := TResourceStream.Create(HInstance, "TEXTDATA", pChar("USERDATA"));
try
ResStream.Read (Buffer^, 100);
Memo1.Lines.Text := Buffer;
finally
ResStream.Free;
end;
finally
FreeMem(Buffer);
end;
end;

Ну тут я навернул через буфер - это чтобы показать, что куда то это все можно сгрузить. Для помещения в Memo по идее можно проще поступить. Но не в этом суть. Важно, что мы прочитали текст!

Еще один пример можно посмотреть http://people.alt.ru/computers/brsoft/delphi/DEL30.html


 
k-sergey   (2002-10-31 13:04) [15]

Да....дискуссия...
а мне надо пример хотябы....например как сохранить значение какой-нибудь переменной программы после её завершения, в самом exe файле? киньте пример на мыло K-Sergey@mail.ru


 
MegaVolt   (2002-10-31 13:13) [16]

А теперь как это всё сделать в реалтайме и для заранее не извесного текстового файла?


 
Zemal   (2002-10-31 13:18) [17]

Что за хрень? От кого инфу прятать собрались? Зачем именно в экзэшник? Что? Текстового или ини-файла нехватает? Что вы спорите-то? Экзешник никак неполучится изменить, т.к. винды его блокируют на запись!!! Читать и запускать вторую копию - это пожалуста, а вот изменить, пока прога экспонирована в памяти, никак невыйдет... ну может быть и выйдет, если грохнуть ядро системы или как-то блокировать его, но это уже другая история... :). Вирусы что-ли писать надумали? К чему такой геморой?


 
KSergey   (2002-10-31 14:22) [18]

> k-sergey (31.10.02 13:04)
> а мне надо пример хотябы....например как сохранить значение
> какой-нибудь переменной программы после её завершения, в
> самом exe файле? киньте пример на мыло K-Sergey@mail.ru

Да мне много что надо, и что?
Много раз саказано: нельзя так сделать. Ну НЕЛЬЗЯ! Единственный выход (вот если уж в exe-шник приспичило) - то надо еще один делать и его запускать, а он уже будет в первый дописывать как угодно (хоть и в ресурсы - примеры есть, см. интернет). Но, как верно заметил Zemal © (31.10.02 13:18) - а нафига?! Чем, напрмер, ini-файл не нравится? Хочется что-то спрятать - ну так зашифруйте в том же инишнике - вот и все!
Кто-то межет объяснить ценль? Может тогда и средство легче подберем, а?


 
KSergey   (2002-10-31 14:26) [19]

> MegaVolt (31.10.02 13:13)
> А теперь как это всё сделать в реалтайме и для заранее не
> извесного текстового файла?

А интернет на что? Попадалось и такое. Правда компилятор нужен, но в принципе формат res-файлов думаю не бешено хитрый - прорвемся, если что.
Но не забудьте, что речь упорно про незапущеный exe-шник. А по другому - а нафиг оно надо?


 
F1   (2002-10-31 14:31) [20]

Чем с этим париться, лучше про криптографию почитай, и шифруй данные, которые ни кто не должен видеть :)


 
KME   (2002-10-31 14:39) [21]

Зайдите на www.delphixfiles.narod.ru. Там все написано!



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.11.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.009 c
1-34014
DelphiDummy
2002-11-02 13:59
2002.11.11
Constant expression violates subrange bound


1-33959
DN
2002-11-01 11:29
2002.11.11
---|Ветка была без названия|---


14-34242
Андрей Прокофьев
2002-10-23 16:40
2002.11.11
ABAB/4 APAP/4


14-34179
dimonf
2002-10-21 17:46
2002.11.11
Можно ли экзешник перекомпилить в дельфи исходник?


3-33897
Utyg
2002-10-22 19:20
2002.11.11
ПОМОГИТЕ ЛАМЕРУ!!!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский