![]() |
Поиск hex значения в файле, замена значения на заданное, сохранение файла
Добрый.
Сейчас делаю так: Есть файл, скажем B2DD.tmp. около 20МБ. Открываю его в hex редакторе, нахожу нужное а именно (35 32 88 65 59 18 01). Важно! сама искомая комбинация выглядит так: 08 3А 35 32 88 65 59 18 01, но почему то по полному запросу не находит. Меняю полную найденную строку на 08 8A XX XX XX XX XX XX XX. Сохраняю файл. Можно ли это проделать в powershell? без использования hex-редактора. Или с помощью любой другой консольной утилиты. (если можно с примерами) Спасибо. |
Цитата:
Цитата:
Цитата:
Цитата:
|
Цитата:
|
у меня вышло пока так:
PowerShell Код:
$file = 'F0D7.tmp' |
Цитата:
вижу часть замены 08 3a на 08 8A, а где остальная замена 35 32 88 65 59 18 на нужное мне XX XX XX XX XX XX ? как-то так?: Код:
$my_data = 'XX XX XX XX XX XX Есть ли более быстрая возможность замены?(как это делают hex редакторы.. скорость в данном случае для меня имеет значение). Возможно сторонние консольные утилиты . p.s.s как привел выше... комбинаций для замены будет несколько (скажем 20). и после выполнения, скрипт должен становится на паузу, а переменная $stroke должна увеличиваться после каждого выполнения на +1 (тем самым получая следующую строку $my_data в следующем цикле). |
Цитата:
Код:
$file = 'F0D7.tmp' Цитата:
|
Код:
$file = 'F0D7.tmp' Чтобы выполнялся Пока ($list)[$number] не равно null; когда переменная пустая (т.е строки закончились) - выдать уведомление что строк нет и стать на паузу. Спасибо. |
Цитата:
Код:
$file = 'F0D7.tmp' Либо, чтобы была возможность для простой замены нескольких строк по шаблону, то уравнять шаблон поиска и замены по количеству символов, и подавать эти шаблоны извне: Код:
param( Код:
.\script.ps1 -fin (0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01) -rep (0x08,0x5A,0x54,0x51,0x57,0x54,0x78,0x77,0x10) |
YuS_2,
не могу получить желаемое. Я этого не уточнял в шапке. Что значение не одно. Делаю так: Код:
$list = Get-content C:\Users\Administrator\Desktop\list.txt Но если подставляю полученное в [byte[]]$rep - получаю что не может перекодировать полученное в system byte * строки в txt подогнаны под формат 0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX как сделать, чтобы в [byte[]]$rep в вашем коде попадала сначала первая строка, потом вторую и т.д? |
Чуть более лаконичный вариант коллеги alpap
Код:
$file = 'D:\temp\F0D7.tmp' Цитата:
Код:
f17050 00 00 35 35 30 6e ff 01 08 3a 35 32 88 65 59 18 ..550n...:52.eY. |
DJ Mogarych, я наверное криво объясняю...простите.
Значение которое находится в файле - всегда одно (08 3a 35 32 88 65 59 18) ЗначениЙ которыми искомое заменяется - НЕ ОДНО! Их список. Скажем 10 шт. Файлов TMP тоже НЕ ОДИН. Т.е сначала находим в первом файле 1.tmp значение 08 3a 35 32 88 65 59 18 и меняем на 08 8a XX XX XX XX XX XX 01 Потом берется следующий 2.TMP файл. В нем опять находится все тоже 08 3a 35 32 88 65 59 18, но меняется уже на следлующее значение из списка 08 8a XX XX XX XX XX XX 02.... и так далее пока не закончатся строки в списке. |
Цитата:
|
9119, надо всегда описывать задачу целиком, это избавит от двойной работы.
Как определять соответствие файлов списку, т. е., как понять, в каком файле какое значение в списке применять? |
Цитата:
Код:
gc test.txt|%{ |
Цитата:
Стартую ваш скрипт так: Код:
$list = Get-content C:\Users\Administrator\Desktop\list.txt Код:
PS C:\Users\Administrator\Desktop\script_PS> ./start.ps1 Код:
0x08,0x8a,0x26,0x41,0x07,0x04,0x38,0x40,0x21 DJ Mogarych, пример списка привел, файлы всегда одинаковые по размеру, имеют просто разные имена, но все всегда содержат одну и туже искомую строку: 0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01, которую нужно находить и менять на значение из списка. Пример файла выкладывал на 1ой странице |
Цитата:
В общем, сделайте лучше так: Пример для трех файлов и трех шаблонов замены: Код:
function Replace-Bytes { |
Цитата:
Чтобы не путаться в шаблонах и файлах, проще создавать файл в формате CSV, с содержимым типа: Цитата:
Код:
... |
YuS_2, с задачей немного не идет это просто.
Суть в том, что изначально есть только список значений для замены в файлах, а списка файлов нет. Файл tmp на момент выполнения скрипта - только один. Запускается exe, который кладет файл.tmp во временную папку (каждый запуск exe имя файла меняется и это имя каждый раз рандомное я его не знаю!) Далее я получаю имя этого файла (получаю все файлы tmp и сортирую по дате изменения, беру первый в списке) и кладу в переменную. нахожу в нем искомое и меняю на строку из txt файла. Далее запускаю опять этот же exe. Опять появляется новый tmp файл. опять получаю его в переменную. и делаю замены, но беру уже следующую строку из txt файла.... и так далее... пока не закончатся строки в txt файле. |
Тогда надо запускать не .exe, а скрипт, который будет запускать .exe, а потом обрабатывать его выхлоп, и писать в отдельный файл номер последней использованной строки.
Что будет, когда строки в файле закончатся? |
DJ Mogarych, когда строки закончатся - должно об этом сообщить и стать на паузу.
Для себя все таки максимально удобным считаю вариант запуска основного скрипта с параметрами от ув. YuS_2. http://forum.oszone.net/post-2963519-8.html Стартовать пытаюсь его скрипт так: Код:
$file = Get-ChildItem -Path "C:\Windows\Temp" -recurse -include *.tmp | Sort-Object LastAccessTime -Descending | Sort-Object -Descending -Property length | Select-Object -First 1 |%{$_.FullName} чтобы строка передалась как набор байтов, и дальнейший скрипт её "схавал") Пока получаю это: Код:
find_replace.ps1: C:\Users\Administrator\Desktop\script_PS\start.ps1:6 |
Разобрался:
Так запускаю скрипт: Код:
$list = Get-content C:\Users\Administrator\Desktop\list.txt Код:
param( |
|
Цитата:
|
YuS_2
Сравнил результаты работы вашего скрипта и утилиты sfk. $ copy original.exe patched.exe $ sfk.exe replace patched.exe -binary /0F851F030000/E92003000000/ -yes $ fc.exe /b original.exe patched.exe 00000B02: 0F E9 00000B03: 85 20 00000B04: 1F 03 00000B05: 03 00 Меняю в вашем скрипте верхушку, указывая последовательность для поиска и замены: [byte[]]$fin = 0x0F,0x85,0x1F,0x03,0x00,0x00 [byte[]]$rep = 0xE9,0x20,0x03,0x00,0x00,0x00 $ pwsh.exe -f patch.ps1 $ fc.exe /b original.exe patched.exe 00000B03: 85 E9 00000B04: 1F 20 00000B08: 4C 00 Как видите, результаты расходятся. А почему? Добавлю своё решение для небольших файлов, которое повторяет результат sfk. Для запуска нужен PowerShell 5 или старше. Код:
$fileOriginal = 'original.exe' |
Цитата:
Цитата:
смотрите: скрипт с этим дополнением Строка на которую меняем байты, из файла test.csv: F0D1.tmp,"0x08,0x5A,0x54,0x51,0x57,0x54,0x78,0x77,0x10" из скрипта, строка поиска с байтами для замены: Цитата:
Код:
fc.exe /b f0d1.tmp fout1.tmp Необходимо уточнить, как Вы запускали скрипт. Ну, а пока, для вашей задачи скрипт: Код:
function Replace-Bytes { |
Время: 05:06. |
Время: 05:06.
© OSzone.net 2001-