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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла

Ответить
Настройки темы
PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла

Старожил


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

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


Изменения
Автор: 9119
Дата: 02-08-2021
Добрый.

Сейчас делаю так:
Есть файл, скажем 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
Благодарности: 10

Профиль | Отправить 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
Благодарности: 721

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


Цитата 9119:
Или с помощью любой другой консольной утилиты. »
как вариант, мгновенная замена.
Код: Выделить весь код
sfk.exe rep F0D7.tmp -bin /083a35328865591801/088A34318764581700/ -yes
скачать sfk
Это сообщение посчитали полезным следующие участники:

Отправлено: 17:57, 03-08-2021 | #22


Старожил


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

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


Цитата sov44:
мгновенная замена. »
отличный вариант.

Отправлено: 19:17, 03-08-2021 | #23


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


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

Профиль | Отправить 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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Kraeved:
Меняю в вашем скрипте верхушку, указывая последовательность для поиска и замены »
это не верхушка, это параметры функции со значением по умолчанию. При запуске функции, в скрипте необходимо указать параметры... в общем:

Цитата Kraeved:
Как видите, расхождение в результатах. А почему? »
Как видите, но что-то вы делаете некорректно...

смотрите:
скрипт с этим дополнением
Строка на которую меняем байты, из файла test.csv:
F0D1.tmp,"0x08,0x5A,0x54,0x51,0x57,0x54,0x78,0x77,0x10"

из скрипта, строка поиска с байтами для замены:
Цитата:
[byte[]]$findb = 0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01
результат работы скрипта:
Код: Выделить весь код
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
- проверяйте.

-------
scio me nihil scire. Ѫ


Отправлено: 21:23, 28-01-2024 | #25



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
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




 
Переход