Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.11;
Скачать: CL | DM;

Вниз

Как можно что то запихать в 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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.019 c
6-34155
Silenser
2002-09-10 12:18
2002.11.11
Чат в локалке


14-34174
Ruteniy
2002-10-17 09:38
2002.11.11
---|Ветка была без названия|---


6-34136
SB
2002-09-06 21:09
2002.11.11
Как затолкать html-код в TWebBrowser?


1-33962
Tea_pot
2002-11-01 12:28
2002.11.11
Пишу games mahgong, и пытаюсь загрузить много Bitmap-ов в память


1-34066
Кен
2002-10-29 06:51
2002.11.11
А нет ли таких функций, чтобы все параметры шрифта из TFont можно