|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла |
|
|
PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла
|
Старожил Сообщения: 286 |
Профиль | Отправить PM | Цитировать
Добрый.
Сейчас делаю так: Есть файл, скажем 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-редактора. Или с помощью любой другой консольной утилиты. (если можно с примерами) Спасибо. |
|
Отправлено: 15:36, 02-08-2021 |
Старожил Сообщения: 286
|
Профиль | Отправить PM | Цитировать Разобрался:
Так запускаю скрипт: $list = Get-content C:\Users\Administrator\Desktop\list.txt $number = 0 $my_data = ($list)[$number] While ($my_data -ne $null) { $file = Get-ChildItem -Path "C:\Windows\Temp" -recurse -include *.tmp | Sort-Object LastAccessTime -Descending | Sort-Object -Descending -Property length | Select-Object -First 1 |%{$_.FullName} $my_data_byte = $([byte[]]($my_data -split ',')) .\find_replace.ps1 -fin (0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01) -rep ($my_data_byte) $current_stroke = $number + 1 echo "Строка с данными в документе - $current_stroke" echo "Данные - $my_data" echo "Временный файл - $file" pause $list = Get-content C:\Users\Administrator\Desktop\list.txt $number = $number + 1 $my_data = ($list)[$number] if ($my_data -eq $null){ Write-Host "Список данных пустой!" break } } param( [byte[]]$fin = (0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01), [byte[]]$rep = (0x08,0x8A,0x34,0x31,0x87,0x64,0x58,0x17,0x00) ) $file = Get-ChildItem -Path "C:\Windows\Temp" -recurse -include *.tmp | Sort-Object LastAccessTime -Descending | Sort-Object -Descending -Property length | Select-Object -First 1 |%{$_.FullName} $fout = Get-ChildItem -Path "C:\Windows\Temp" -recurse -include *.tmp | Sort-Object LastAccessTime -Descending | Sort-Object -Descending -Property length | Select-Object -First 1 |%{$_.FullName} $bytes = [io.file]::readallbytes($file) $i = -1 $a = -join $fin do { $i = [byte[]]::indexof($bytes,$fin[0],($i+1)) [byte[]]$tmp = @() for ($k = $i; $k -lt ($i+$fin.count);$k++){ $tmp += $bytes[$k] } $b = -join $tmp } while ($a -ne $b) for ($j,$n=0,$i;$j -lt $rep.count;$n++,$j++){ $bytes[$n] = $rep[$j] } [io.file]::writeallbytes($fout, $bytes) |
Отправлено: 14:26, 03-08-2021 | #21 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2183
|
Профиль | Отправить PM | Цитировать |
Отправлено: 17:57, 03-08-2021 | #22 |
Старожил Сообщения: 286
|
Профиль | Отправить PM | Цитировать Цитата sov44:
|
|
Отправлено: 19:17, 03-08-2021 | #23 |
Новый участник Сообщения: 5
|
Профиль | Отправить PM | Цитировать 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' $filePatched = 'patched.exe' $patternFind = '0F 85 1F 03 00 00' -replace ' ', '-' $patternReplace = 'E9 20 03 00 00 00' -replace ' ', '-' $byteArray = [IO.File]::ReadAllBytes($fileOriginal) $byteString = [BitConverter]::ToString($byteArray) $byteString = $byteString -replace $patternFind, $patternReplace [byte[]] $newByteArray = $byteString -split '-' -replace '^', '0x' [IO.File]::WriteAllBytes($filePatched, $newByteArray) |
Последний раз редактировалось Kraeved, 29-01-2024 в 01:07. Отправлено: 17:14, 28-01-2024 | #24 |
Crazy Сообщения: 1171
|
Профиль | Отправить PM | Цитировать Цитата Kraeved:
Цитата Kraeved:
смотрите: скрипт с этим дополнением Строка на которую меняем байты, из файла test.csv: F0D1.tmp,"0x08,0x5A,0x54,0x51,0x57,0x54,0x78,0x77,0x10" из скрипта, строка поиска с байтами для замены: Цитата:
fc.exe /b f0d1.tmp fout1.tmp Сравнение файлов F0D1.tmp и FOUT1.TMP 00F17059: 3A 5A 00F1705A: 35 54 00F1705B: 32 51 00F1705C: 88 57 00F1705D: 65 54 00F1705E: 59 78 00F1705F: 18 77 00F17060: 01 10 Необходимо уточнить, как Вы запускали скрипт. Ну, а пока, для вашей задачи скрипт: function Replace-Bytes { param( $file = '.\F0D7.tmp', $fout = '.\F0D7_1.tmp', [byte[]]$fin = (0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01), [byte[]]$rep = (0x08,0x8A,0x34,0x31,0x87,0x64,0x58,0x17,0x00) ) $bytes = [io.file]::readallbytes($file) $i = -1 $a = -join $fin do { $i = [byte[]]::indexof($bytes,$fin[0],($i+1)) [byte[]]$tmp = @() for ($k = $i; $k -lt ($i+$fin.count);$k++){ $tmp += $bytes[$k] } $b = -join $tmp } while ($a -ne $b) for ($j,$n=0,$i;$j -lt $rep.count;$n++,$j++){ $bytes[$n] = $rep[$j] } [io.file]::writeallbytes($fout, $bytes) } #значение для поиска: [byte[]]$findb = 0x0F,0x85,0x1F,0x03,0x00,0x00 #Исходный файл: $filein = '.\original.exe' #Целевой файл: $fileout = '.\patched.exe' #значение для замены: [byte[]]$foutdb = 0xE9,0x20,0x03,0x00,0x00,0x00 replace-bytes -file $filein -fout $fileout -fin $findb -rep $foutdb |
|||
------- Отправлено: 21:23, 28-01-2024 | #25 |
|
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
VBA - Редактировать hex значения в файле | blackeangel | Программирование и базы данных | 14 | 21-05-2019 16:33 | |
CMD/BAT - [решено] замена значения в xml-файле | firstarey | Скриптовые языки администрирования Windows | 20 | 13-11-2017 11:24 | |
VBS/WSH/JS - поиск значения в текстовом файле и выбор данной строки | God-of-Chaos | Скриптовые языки администрирования Windows | 10 | 07-06-2015 19:06 | |
работа с файлами в HEX формате, поиск и замена по 16ричному адресу значения в файле. | andr_mozg | AutoIt | 3 | 10-03-2012 10:20 | |
CMD/BAT - [решено] Поиск файла, значения в файле и создания для них переменных | popoves | Скриптовые языки администрирования Windows | 4 | 29-02-2012 20:59 |
|