Работа с файлами (Вставка в файл.)

Модератор: Модераторы разделов

Аватара пользователя
biolim
Сообщения: 142

Работа с файлами

Сообщение biolim »

Возможно ли добавить цепочку байт в середину файла.
[.........байты открытого файла......][......вставленные байты....][.....байты открытого файла......]
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: Работа с файлами

Сообщение powerfox »

Не хочу флудить, но обычно это импользуется вирусописателями, я прав?
Спасибо сказали:
Аватара пользователя
biolim
Сообщения: 142

Re: Работа с файлами

Сообщение biolim »

powerfox писал(а):
11.06.2006 16:30
Не хочу флудить, но обычно это импользуется вирусописателями, я прав?


Обычно да, но мне не для тех целей.

Метод читать из файла и записывать в другой, а затем заменять конечным файлом исходный конечно прост в реализации, но слишком медлителен при больших размерах файла.
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: Работа с файлами

Сообщение powerfox »

Как я понял вы хотите копировать файлы, только открыть при этом несколько потоков? В принципе можно запустить параллельно несколько dd с различными параметрами пропуска n байт, Для запуска используйте int system(const char* s) из stdlib.h + man dd + доки по thread.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Работа с файлами

Сообщение v04bvs »

biolim: другого метода нет и быть не может. Можно по одному и тому же файлу seek-ом бегать и двигать куски, может быть даже немного быстрее будет.
Спасибо сказали:
Аватара пользователя
biolim
Сообщения: 142

Re: Работа с файлами

Сообщение biolim »

v04bvs писал(а):
11.06.2006 17:22
biolim: другого метода нет и быть не может. Можно по одному и тому же файлу seek-ом бегать и двигать куски, может быть даже немного быстрее будет.


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

Ну неужели все так непрактично. А если файл на пару сотен мегабайт.
Спасибо сказали:
Аватара пользователя
fatboy
Сообщения: 156
ОС: Zenwalk Linux, Windows XP

Re: Работа с файлами

Сообщение fatboy »

biolim писал(а):
11.06.2006 17:55
v04bvs писал(а):
11.06.2006 17:22

biolim: другого метода нет и быть не может. Можно по одному и тому же файлу seek-ом бегать и двигать куски, может быть даже немного быстрее будет.


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

Ну неужели все так непрактично. А если файл на пару сотен мегабайт.


В базах данных доступ осуществляется по индексу. Отсюда высокая скорость доступа. Размер записи в таблице фиксированный. Отсюда простота удаления.
Zenwalk 4.0
TOSHIBA Satellite A100
Спасибо сказали:
Аватара пользователя
biolim
Сообщения: 142

Re: Работа с файлами

Сообщение biolim »

fatboy писал(а):
11.06.2006 19:19
biolim писал(а):
11.06.2006 17:55

v04bvs писал(а):
11.06.2006 17:22

biolim: другого метода нет и быть не может. Можно по одному и тому же файлу seek-ом бегать и двигать куски, может быть даже немного быстрее будет.


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

Ну неужели все так непрактично. А если файл на пару сотен мегабайт.


В базах данных доступ осуществляется по индексу. Отсюда высокая скорость доступа. Размер записи в таблице фиксированный. Отсюда простота удаления.


Ну если я захочу удалить из файла запись фиксированного размера. Мне же придется перечитывать весь файл.
Спасибо сказали:
Аватара пользователя
powerfox
Сообщения: 458

Re: Работа с файлами

Сообщение powerfox »

(biolim @ Jun 11 2006, в 23:15) писал(а):Ну если я захочу удалить из файла запись фиксированного размера. Мне же придется перечитывать весь файл.

Не весь, а часть файла, стоящую за удаляемым блоком. man dd ;)
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Работа с файлами

Сообщение v04bvs »

Не знаком с внутренностями баз данных, но могу представить такой алгоритм, удаляемая запись помечается где-либо и всё. Вставка идёт (физически) в конец (ну или ищется "свободное место", т.е. то, которое помечено как удалённое). Время от времени можно запускать некий дефрагментатор, который будет перетряхивать всю базу, удаляя неиспользуемые участки, упорядочивая чего-нибудь.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Работа с файлами

Сообщение Zeus »

v04bvs писал(а):
11.06.2006 23:50
Не знаком с внутренностями баз данных, но могу представить такой алгоритм, удаляемая запись помечается где-либо и всё. Вставка идёт (физически) в конец (ну или ищется "свободное место", т.е. то, которое помечено как удалённое). Время от времени можно запускать некий дефрагментатор, который будет перетряхивать всю базу, удаляя неиспользуемые участки, упорядочивая чего-нибудь.

Ну насколько я знаком с базами данных, с внешним проявлением их внутренней работы :) - всё примерно так и происходит.
Спасибо сказали:
Аватара пользователя
Alxn1
Сообщения: 402
Статус: Красноглазик со стажем
ОС: Mavericks

Re: Работа с файлами

Сообщение Alxn1 »

Насколько я знаю, по-другому никак и не получится. Так уж организованны современные ОС-и :) и их фаловые системы :).
Спасибо сказали:
Аватара пользователя
fatboy
Сообщения: 156
ОС: Zenwalk Linux, Windows XP

Re: Работа с файлами

Сообщение fatboy »

v04bvs писал(а):
11.06.2006 23:50
Не знаком с внутренностями баз данных, но могу представить такой алгоритм, удаляемая запись помечается где-либо и всё. Вставка идёт (физически) в конец (ну или ищется "свободное место", т.е. то, которое помечено как удалённое). Время от времени можно запускать некий дефрагментатор, который будет перетряхивать всю базу, удаляя неиспользуемые участки, упорядочивая чего-нибудь.


Именно.

При внесении новой записи можно искать в файле ранее "удаленные" и писать поверх них, а можно писать в конец файла. Естественно, имеют право на существование и составные варианты.
Zenwalk 4.0
TOSHIBA Satellite A100
Спасибо сказали:
Аватара пользователя
fatboy
Сообщения: 156
ОС: Zenwalk Linux, Windows XP

Re: Работа с файлами

Сообщение fatboy »

powerfox писал(а):
11.06.2006 16:30
Не хочу флудить, но обычно это импользуется вирусописателями, я прав?


Кстати, хорошая идея. У меня когда-то была книжеца по защите от копирования. Так, по-моему, и называлась - "Защита от копирования" :) . Так в той книжице был пример внедрения в исполняемый файл защитного модуля. Прога была на Асме но нужна ведь концепция!
СОВЕТ вопрошающему: Сходите на какой-то ресурс по Асму, типа wasm.ru (ничего что про винду) и там поищите инфу на тему. Она там точно есть. Там целый раздел по вирусописательству и я как-то видел в нем пример кода вируса, внедряющегося в файл (хотя почти все они туда влазят).
Zenwalk 4.0
TOSHIBA Satellite A100
Спасибо сказали:
Sleeping Daemon
Сообщения: 1450

Re: Работа с файлами

Сообщение Sleeping Daemon »

fatboy писал(а):
12.06.2006 04:44
powerfox писал(а):
11.06.2006 16:30

Не хочу флудить, но обычно это импользуется вирусописателями, я прав?


Кстати, хорошая идея. У меня когда-то была книжеца по защите от копирования. Так, по-моему, и называлась - "Защита от копирования" :) . Так в той книжице был пример внедрения в исполняемый файл защитного модуля. Прога была на Асме но нужна ведь концепция!
СОВЕТ вопрошающему: Сходите на какой-то ресурс по Асму, типа wasm.ru (ничего что про винду) и там поищите инфу на тему. Она там точно есть. Там целый раздел по вирусописательству и я как-то видел в нем пример кода вируса, внедряющегося в файл (хотя почти все они туда влазят).

Как правило внедряется в тело программы только код перехода, а сам код вируса дописывается в конец.
Спасибо сказали:
Аватара пользователя
biolim
Сообщения: 142

Re: Работа с файлами

Сообщение biolim »

Ладно оставим флуд в стороне. О вирусах можно запаганить всю топку.

(v04bvs) писал(а):Не знаком с внутренностями баз данных, но могу представить такой алгоритм, удаляемая запись помечается где-либо и всё. Вставка идёт (физически) в конец (ну или ищется "свободное место", т.е. то, которое помечено как удалённое). Время от времени можно запускать некий дефрагментатор, который будет перетряхивать всю базу, удаляя неиспользуемые участки, упорядочивая чего-нибудь.


Вообще может ты не заметил, но это принцип файловой системы. А я думаю организовывать свою ф.с. на чужой ни есть гут. Я то же рассматривал этот вариант... но мне не дает покоя и спокойного сна книга Фаронова по программированию на паскаль ПРАКТИКА. Что интересно ее можно читать как справочник по асму. Там все регистры и прерывания. Так там был описан принцип файловой системы файловой системы. Раздел "Работа с диском на физическом уровне" стр 64.
MYFILE-------txt|a|----------|tim|dat|08|длина|
-------------------------------------------|
--------------------------------------------
-----------------------------------|
-----00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
00 ID FF 03 04 05 FF 00 00 09-0A-0B-15 00 00 00 00
----------------------------------------------|
-----------------------------------------------
------------------------|
10 00 00 00 00 00 16-17-19 F7 1A 1B FF 00 00 00 00
-------------------------------| |
---------------------------------------

По сути дела просто пишем в конец и в требуемом месте (обозначим Х) отправляем на нужный адрес, а в конце добавленных байтов отправляем на следующий байт после Х, т.е. Х+1

Примерно так

01-02-03-04-05-06-07-08-09-0А

01-02-13 04-05-06-07-08
---------| |
---------| ---------
---------| |
---------14-15-16-17

Т.е. получается примерно то, что описывал v04bvs.

Опасно?! Возможно! Но не об этом разговор.
Я про то что базы данных и архиваторы используют этот способ. Ведь он куда быстрее работает.

У кого какие соображения.
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Работа с файлами

Сообщение elide »

Я про то что базы данных и архиваторы используют этот способ.
примеры давай....
просто так ляпнуть любой может. а вот покажи-ка нам архиватор, который так работает..... желательно из таких, которым пользуется хотябы 1000 человек....
слава роботам!
Спасибо сказали:
Аватара пользователя
biolim
Сообщения: 142

Re: Работа с файлами

Сообщение biolim »

elide писал(а):
12.06.2006 13:43
Я про то что базы данных и архиваторы используют этот способ.
примеры давай....
просто так ляпнуть любой может. а вот покажи-ка нам архиватор, который так работает..... желательно из таких, которым пользуется хотябы 1000 человек....


По твоему архиватор WinRAR при добавлении в архив в 1000Мб или удалении будет лопатить весь архив(ну или последнюю часть).

Я не хочу сказать что он использует именно этот метод, но уж точно куда более эффективный чем переписывать файл.
Спасибо сказали:
sdk
Бывший модератор
Сообщения: 210

Re: Работа с файлами

Сообщение sdk »

biolim, ткну пальцем в небо, но ВинРар может например просто дописывать добавляемый файл в конец архива, а в начало файла (где выделено место для инфы об архиве) записать указатель на относительный адрес этого добавленного файла в архиве :).

А вообще, если ты уж так проводишь аналогии с архивами, найди описание rar/zip сжатия и посмотри сам ;).
Серьезность - это способ сделать простые вещи сложными.
Если много знать - устанут глаза. Если много спать - то нет.
Нас никому не сбить с пути - нам пофигу куда идти.
:-)
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Работа с файлами

Сообщение t.t »

(sdk @ Jun 12 2006, в 14:38) писал(а):А вообще, если ты уж так проводишь аналогии с архивами, найди описание rar/zip сжатия и посмотри сам
Или исходники tar'а можно посмотреть на предмет чего он там делает с -A и -u.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
fatboy
Сообщения: 156
ОС: Zenwalk Linux, Windows XP

Re: Работа с файлами

Сообщение fatboy »

biolim писал(а):
12.06.2006 11:50
По сути дела просто пишем в конец и в требуемом месте (обозначим Х) отправляем на нужный адрес, а в конце добавленных байтов отправляем на следующий байт после Х, т.е. Х+1


Так о том и речь.
Sleeping Daemon же писал:
Как правило внедряется в тело программы только код перехода, а сам код вируса дописывается в конец.


Но работать это будет только в исполняемых файлах а не в plain text или таблице базы данных - им адреса и переходы просто до /dev/null. Это просто порядок байт, которые интерпретируются в соответствии с форматом и правилами программы-редактора или просмотрщика. Пример: Открой .jpg c помощью display и с помощью cat. Если сразу имел ввиду исполняемый то так и надо было писать в вопросе. Хочешь наилучшего способа - читай вирмэйкерскую документацию или по защите данных.
Zenwalk 4.0
TOSHIBA Satellite A100
Спасибо сказали:
Аватара пользователя
biolim
Сообщения: 142

Re: Работа с файлами

Сообщение biolim »

fatboy писал(а):
13.06.2006 02:20
biolim писал(а):
12.06.2006 11:50

По сути дела просто пишем в конец и в требуемом месте (обозначим Х) отправляем на нужный адрес, а в конце добавленных байтов отправляем на следующий байт после Х, т.е. Х+1


Так о том и речь.
Sleeping Daemon же писал:
Как правило внедряется в тело программы только код перехода, а сам код вируса дописывается в конец.


Но работать это будет только в исполняемых файлах а не в plain text или таблице базы данных - им адреса и переходы просто до /dev/null. Это просто порядок байт, которые интерпретируются в соответствии с форматом и правилами программы-редактора или просмотрщика. Пример: Открой .jpg c помощью display и с помощью cat. Если сразу имел ввиду исполняемый то так и надо было писать в вопросе. Хочешь наилучшего способа - читай вирмэйкерскую документацию или по защите данных.

Это ты не понял сути вопроса. Читай выше. Дело не в том чтобы добавить в исполняемый файл еще кусок исп. Дело в том чтобы в любой файл вставить данные в середину файла.
Спасибо сказали:
Аватара пользователя
fatboy
Сообщения: 156
ОС: Zenwalk Linux, Windows XP

Re: Работа с файлами

Сообщение fatboy »

biolim писал(а):
13.06.2006 11:11
fatboy писал(а):
13.06.2006 02:20

biolim писал(а):
12.06.2006 11:50

По сути дела просто пишем в конец и в требуемом месте (обозначим Х) отправляем на нужный адрес, а в конце добавленных байтов отправляем на следующий байт после Х, т.е. Х+1


Так о том и речь.
Sleeping Daemon же писал:
Как правило внедряется в тело программы только код перехода, а сам код вируса дописывается в конец.


Но работать это будет только в исполняемых файлах а не в plain text или таблице базы данных - им адреса и переходы просто до /dev/null. Это просто порядок байт, которые интерпретируются в соответствии с форматом и правилами программы-редактора или просмотрщика. Пример: Открой .jpg c помощью display и с помощью cat. Если сразу имел ввиду исполняемый то так и надо было писать в вопросе. Хочешь наилучшего способа - читай вирмэйкерскую документацию или по защите данных.

Это ты не понял сути вопроса. Читай выше. Дело не в том чтобы добавить в исполняемый файл еще кусок исп. Дело в том чтобы в любой файл вставить данные в середину файла.


Ок. Постараюсь коротко и по сути.
Если исходить из задачи (вставить порядок байт в файл), то к разным файлам нужно применять разный подход.
Исполняемые файлы так просто изменить нельзя т.к. - это определенная программа (исполняемый файл - программа) и программа работает в соответствии с, заложенной в не программистом, логикой. Вы не можете просто взять и вставить туда цепочку байт. Они могут вообще не выполнится. Процесс выполнения, в соответствии с заложенной логикой, может просто обойти их стороной. А еще вероятнее - программа перестанет работать. Наиболее простой, часто используемый и верный способ - вставить эту цепочку в конец файла а в его (файла) заголовке изменить точку входа в программу (адрес с которого начинается все то, что написал программист) на адрес начала Вашего куска (бывший конец файла) а в конец Вашего куска вставить переход на старую точку входа в программу. Т.о. сначала выполняется Ваш кусок а потом вся остальная программа. У Фаронова об этом. Это возможно потому-что программа выполняется, следуя по определенным адресам.

Почти все остальные файлы - порядок байт, несущий в себе определенную информацию. Они не выполняются, следуя по адресам и в соответствии с какой-либо логикой. Там можно вставить все что угодно и куда угодно, причем повлияет это только на то как файл будет отображен сопоставленным ему редактором или просмотрщиком (тоже программы). Единственное что нужно учитывать - формат файла.

Исполняемый файл вполне можно сравнить, скажем, с двигателем автомобиля - там все на своих местах и взаимосвязанно - Вы не можете докинуть пару поршней и надеятся что он будет продолжать работать; почти любой другой (особенно plain text) - с большим складом - там что-либо хранится - Вы можете заехать туда, выгрузить свой груз в уголочке и он никому мешать не будет.

А если именно по сути вопроса:
Возможно ли добавить цепочку байт в середину файла.
[.........байты открытого файла......][......вставленные байты....][.....байты открытого файла......]

Ответ - возможно.

Код: Выделить всё

fprintf (opened_File, "Insert anything you want");

или

Код: Выделить всё

write(descriptor, buf, cnt);

вообще кайф!
Только-таки придется все остальное двигать.
Zenwalk 4.0
TOSHIBA Satellite A100
Спасибо сказали:
Аватара пользователя
biolim
Сообщения: 142

Re: Работа с файлами

Сообщение biolim »

Отстаньте от меня со своими бинарниками. Мне нужно вставлять в файл. Причем ищу возможность вставить без передвигания остальной части. На с++ думаю наврядли это возможно. А асм программисты вымерли как динозавры.
Ни кто не знает асм. Значит будем двигать хвост. Ничего не поделаешь.
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Работа с файлами

Сообщение v04bvs »

biolim: почему вы так уповаете на ассемблер? Вставить данные в середину файла, не сдвигая его конец, невозможно ни на одной известной мне ФС, просто потому что они так устроены. И ассемблер вам не поможет. Если для вас это проблема, возможно стоит пересмотреть исходную задачу.
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Работа с файлами

Сообщение madskull »

biolim писал(а):
14.06.2006 09:37
Отстаньте от меня со своими бинарниками. Мне нужно вставлять в файл. Причем ищу возможность вставить без передвигания остальной части.

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

biolim писал(а):
14.06.2006 09:37
На с++ думаю наврядли это возможно. А асм программисты вымерли как динозавры.
Ни кто не знает асм. Значит будем двигать хвост. Ничего не поделаешь.

Все двигают, а тебе чем такой способ не угодил? Тем более, что с учетом буферов и кешей, это будет не так уж и долго, имхо.


А касательно rar'a - не думаю, что для работы с файлами он использует что-то экзотическое, учитывая его кроссплатформенность. Те же open, lseek, read...
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
biolim
Сообщения: 142

Re: Работа с файлами

Сообщение biolim »

Вы че все думаете что байты файлов на диске расположены друг за другом по порядку?
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга

Re: Работа с файлами

Сообщение madskull »

biolim писал(а):
14.06.2006 14:44
Вы че все думаете что байты файлов на диске расположены друг за другом по порядку?

Конечно, байты файлов расположены по порядку. Только к чему это?
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
biolim
Сообщения: 142

Re: Работа с файлами

Сообщение biolim »

madskull писал(а):
14.06.2006 17:13
biolim писал(а):
14.06.2006 14:44

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

Конечно, байты файлов расположены по порядку. Только к чему это?


К тому что они расположены черти как а в таблице распределения файлов записано в каком порядке читать сектора для получения файла.

Используя прерывание $13 можно читать сектор, а также записывать в него. Помниться лет 5-6 назад я писал прогу на асм. Записывались на дискету файлы, а винд показывала что диск пуст, само собой если записать что либо на диск данные удалялись. И прога клиент которая считывала данные с дискеты. Если бы я продолжить изучать устр ф.с. я бы записал нужные адреса в таблицу и файлы бы читались из ос.

В общем кто знает асм, тот меня поймет.

У кого может есть инфа об устройстве и работе ф.с. ext2 на низком уровне????
Спасибо сказали:
Аватара пользователя
elide
Бывший модератор
Сообщения: 2421
Статус: Übermensch
ОС: лялих

Re: Работа с файлами

Сообщение elide »

ага. только где окажется твоя прога, если на разделе, скажем, reiserfs?
слава роботам!
Спасибо сказали: