Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Массовое редактирование бинарных фаилов

Ответить
Настройки темы
Массовое редактирование бинарных фаилов

Новый участник


Сообщения: 34
Благодарности: 0

Профиль | Отправить PM | Цитировать


Имеется около 50 ти фаилов, во всех по одному и тому же адресу нужно нужно исправить предположим 1C на 1E т.е. по адресу 0x00000820 1C на 1E.
По подсказке пользователя "Iska" (копать FileOpen(), FileSetPos(), FileWrite(), FileClose()) почитал в справке (встроенной AutoIT) и разобрался, вроде, только со строкой FileOpen, т.е. FileOpen("1.img", 16) , далее я так понимаю что должно быть далее должно быть что то типа FileSetPos ("1.img", 0x00000820, ***); ***- это я не совсем понял, но предполагаю что тут должно быть значение на которое я хочу заменить? и тогда FileWrite мне не нужно (этой командой я смог только добавить в конец фаила свои значения, а не там где мне это нужно =( ).
Извиняюсь если непонятно выразился, недавно узнал про AutoIT, а MS-dos знаю не супер отлично, но хочу поправить положение дел. Если кто сможет помочь буду благодарен.

Отправлено: 15:47, 25-11-2013

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата maxd2007:
***- это я не совсем понял, но предполагаю что тут должно быть значение на которое я хочу заменить? »
Там должно быть «0».

Функция FileSetPos
Функция FileWrite

Отправлено: 18:34, 25-11-2013 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


maxd2007,
Попробуйте примерно так.
Код: Выделить весь код
Local $hFile, $tData, $sFile = @ScriptDir & '\test.bin'

;Создаем бинарный файл
$tData = DllStructCreate('byte[256]')
For $i = 0 To 255
    DllStructSetData($tData, 1, $i, $i + 1)
Next
$hFile = FileOpen($sFile, 18)
FileWrite($hFile, DllStructGetData($tData, 1))
FileClose($hFile)
$tData = 0
FileCopy($sFile, $sFile & '.old', 1)

;Меняем со смещением от начала 223 (0x000000DF) значение на -madmasles-
$hFile = FileOpen($sFile, 1)
FileSetPos($hFile, 0x000000DF, 0)
FileWrite($hFile, Chr(0x2D) & Chr(0x6D) & Chr(0x61) & Chr(0x64) & Chr(0x6D) & Chr(0x61) & Chr(0x73) & Chr(0x6C) & Chr(0x65) & Chr(0x73) & Chr(0x2D))
FileClose($hFile)

ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile & '.old'), 223, 13) & @LF)
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile), 223, 13) & @LF)
И смотрите в хекс-редакторе, что получили.

Последний раз редактировалось madmasles, 25-11-2013 в 21:42. Причина: немного поправил

Это сообщение посчитали полезным следующие участники:

Отправлено: 18:49, 25-11-2013 | #3


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


madmasles, Вы его этим «;Create bin file» скорее запутаете .
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:37, 25-11-2013 | #4


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


Iska, поправил.
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:36, 25-11-2013 | #5


Новый участник


Сообщения: 34
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ваш скрипт работает ))), но можно я задам Вам вопросы:
1) $sFile - что это такое? когда я читал документацию то там было написано что это хендл фаилы, но судя по Вашему скрипту похоже что Вы используете его как переменную и вот эта строчка $hFile = FileOpen($sFile, 18) задает ее параметр, так что же такое $hFile? Почему цифра 18? (в документации указана: "16 = Force binary mode (See Remarks)" ).
2) Local $hFile, $tData, $sFile = @ScriptDir & '\test.bin' - эта строчка от части понятна что она создает фаил test.bin в директории рядом со скриптом, но что означаетl $hFile, $tData, $sFile?
3) Я не понял окончания:
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile & '.old'), 223, 13) & @LF)
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile), 223, 13) & @LF)
Я понимаю что напрягаю нубскими вопросами, но если будет время и возможность буду признателен за пояснения.

Отправлено: 17:42, 26-11-2013 | #6


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата maxd2007:
1) $sFile - что это такое? »
Переменная типа Variant (String), представляет собой путь к файлу.

Цитата maxd2007:
когда я читал документацию то там было написано что это хендл фаилы, »
Не было написано. Вы путаете.

Цитата maxd2007:
и вот эта строчка $hFile = FileOpen($sFile, 18) задает ее параметр, так что же такое $hFile? »
А вот $hFile — это уже переменная типа Variant (Handle). Фактически — ссылка на открытый файл.

Цитата maxd2007:
Почему цифра 18? (в документации указана: "16 = Force binary mode (See Remarks)" ). »
Точнее:
Цитата:
2 = Write mode (erase previous contents)

16 = Force binary mode (See Remarks).
18 = 2 + 16.

Цитата maxd2007:
Local $hFile, $tData, $sFile = @ScriptDir & '\test.bin' - эта строчка от части понятна что она создает фаил test.bin в директории рядом со скриптом, »
Не создаёт файл. Только описывает три локальные переменные и задаёт последней из них строковое значение, представляющее собой путь к файлу.

Цитата maxd2007:
3) Я не понял окончания:
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile & '.old'), 223, 13) & @LF)
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile), 223, 13) & @LF) »
Что именно не поняли здесь?
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:40, 26-11-2013 | #7


Новый участник


Сообщения: 34
Благодарности: 0

Профиль | Отправить PM | Цитировать


Еще раз спасибо, можно уточнить некоторые моменты:
1) Local $hFile, $tData, $sFile = @ScriptDir & '\test.bin' т.е. это получается что если в скрипте где то указано $hFile или $tData или $sFile то это будет значить обращение в фаилу test.bin в директории рядом со скриптом?

2) В этой строчке:
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile & '.old'), 223, 13) & @LF)
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile), 223, 13) & @LF)
я не понял зачем она и что она делает, ведь работа с фаилом заканчивается здесь:
$hFile = FileOpen($sFile, 1)
FileSetPos($hFile, 0x000000DF, 0)
FileWrite($hFile, Chr(0x2D) & Chr(0x6D) & Chr(0x61) & Chr(0x64) & Chr(0x6D) & Chr(0x61) & Chr(0x73) & Chr(0x6C) & Chr(0x65) & Chr(0x73) & Chr(0x2D))
FileClose($hFile)

Отправлено: 17:31, 27-11-2013 | #8


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата maxd2007:
1) Local $hFile, $tData, $sFile = @ScriptDir & '\test.bin' т.е. это получается что если в скрипте где то указано $hFile или $tData или $sFile то это будет значить обращение в фаилу test.bin в директории рядом со скриптом? »
Только «$sFile». Переменные «$hFile» и «$tData» этой строкой только описываются, но значения им не присваиваются.

Эту строку можно было бы записать и так:
Код: Выделить весь код
Local $hFile
Local $tData
Local $sFile

$sFile = @ScriptDir & '\test.bin'
Инструкция Local описывает, объявляет переменные. Какое значение конкретная переменная примет — определяется только в момент присвоения ей конкретного значения, будь то одновременно с её объявлением:
Код: Выделить весь код
Local $hFile, $tData, $sFile = @ScriptDir & '\test.bin'
либо позже по тексту скрипта, как во втором примере:
Код: Выделить весь код
Local $hFile
Local $tData
Local $sFile

$sFile = @ScriptDir & '\test.bin'
Цитата maxd2007:
2) В этой строчке:
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile & '.old'), 223, 13) & @LF)
ConsoleWrite(FileGetSize($sFile) & @TAB & StringMid(FileRead($sFile), 223, 13) & @LF)
я не понял зачем она и что она делает, »
Выводит на консоль (можно увидеть в редакторе SciTE или перенаправив поток stdout скрипта в файл) размер файла, указанного переменной $sFile, и значения 13 символов, начиная с 223 символа, из старого и нового файлов соответственно. Как правило — сугубо в отладочных целях.
Это сообщение посчитали полезным следующие участники:

Отправлено: 18:16, 27-11-2013 | #9


Аватара для AZJIO

Старожил


Сообщения: 254
Благодарности: 126

Профиль | Отправить PM | Цитировать


maxd2007, вы приводите тексты описаний из англ. справки. Если вы новичок, хочу чтобы не прошло мимо наличие русской справки
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:02, 28-11-2013 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » Массовое редактирование бинарных фаилов

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] батник для перемещения фаилов erufa Скриптовые языки администрирования Windows 2 24-01-2012 14:59
Редактирование бинарных файлов varaksino Программирование и базы данных 8 11-08-2011 23:01
CMD/BAT - Резервное копирование фаилов вопрос deadiwe Скриптовые языки администрирования Windows 3 18-05-2011 13:42
Редактирование бинарных файлов (NTLDR) Dr.Dark Автоматическая установка Windows 2000/XP/2003 4 27-01-2010 21:25
Алгоритм сравнения бинарных файлов Savant Программирование и базы данных 2 04-05-2005 09:57




 
Переход