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

Аватара пользователя
9119

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

Сообщение 9119 »

Добрый.



Сейчас делаю так:

Есть файл, скажем 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-редактора.

Или с помощью любой другой консольной утилиты. (если можно с примерами)

Спасибо.
Аватара пользователя
Iska

Re: PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла

Сообщение Iska »

Цитата 9119:



Можно ли это проделать в powershell?
PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла




Можно.




Цитата 9119:



Или с помощью любой другой консольной утилиты.
PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла




Можно.




Цитата 9119:



Есть файл, скажем B2DD.tmp. около 20МБ.
PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла





Цитата 9119:



Важно! сама искомая комбинация выглядит так: 08 3А 35 32 88 65 59 18 01, но почему то по полному запросу не находит.
PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла




Упакуйте файл в архив и выложите на вменяемый обменник или облако.
Аватара пользователя
9119

Re: PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла

Сообщение 9119 »

Разобрался:



Так запускаю скрипт:





Код:

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

$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)

Спасибо огромное всем кто откликнулся!
Аватара пользователя
9119

Re: PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла

Сообщение 9119 »

Цитата alpap:



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




не до конца разобрался в коде...

вижу часть замены 08 3a на 08 8A, а где остальная замена 35 32 88 65 59 18 на нужное мне XX XX XX XX XX XX ?

как-то так?:



Код:

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

$my_data = 'XX XX XX XX XX XX
                   XX XX XX XX XX XX
                   XX XX XX XX XX XX'
$stroke = '0'
$cont = Switch -Regex -File $tmp {
  "  08 3a $slineHex" {$_ -Replace '  08 3a', '  08 8A' -Replace '  $slineHex', '  ($my_data)[$stroke]'}
  Default             {$_}
}

p.s. как я понял файл декодируется в txt (метров 100 наверное будет).. потом правится и сохраняется.

Есть ли более быстрая возможность замены?(как это делают hex редакторы.. скорость в данном случае для меня имеет значение). Возможно сторонние консольные утилиты .





p.s.s как привел выше... комбинаций для замены будет несколько (скажем 20). и после выполнения, скрипт должен становится на паузу, а переменная $stroke должна увеличиваться после каждого выполнения на +1 (тем самым получая следующую строку $my_data в следующем цикле).
Аватара пользователя
alpap

Re: PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла

Сообщение alpap »

Цитата 9119:



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






Код:

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

$file = 'F0D7.tmp'
$fout = 'F0D7_1.tmp'
[byte[]]$fin = 0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01
[byte]$rep = 0x8A
$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)
$bytes[($i+1)] = $rep
[io.file]::writeallbytes($fout, $bytes)


Цитата 9119:



но почему то по полному запросу не находит.
PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла




Патамушта "А" - это совсем не "A" Изображение
Аватара пользователя
9119

Re: PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла

Сообщение 9119 »

Код:

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

$file = 'F0D7.tmp'
$fout = 'F0D7_1.tmp'
$list = '0x08 0x8a 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0x21
           0x08 0x8a 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0x22'
$number = '0'
[byte[]]$fin = 0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01
[byte]$rep = ($list)[$number]
$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)
$bytes[($i+1)] = $rep
[io.file]::writeallbytes($fout, $bytes)

Помогите это положить в цикл, чтобы после каждого выполнения становился на паузу и увеличивал $number на +1.

Чтобы выполнялся Пока ($list)[$number] не равно null; когда переменная пустая (т.е строки закончились) - выдать уведомление что строк нет и стать на паузу.

Спасибо.
Аватара пользователя
YuS_2

Re: PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла

Сообщение YuS_2 »

Цитата 9119:



чтобы после каждого выполнения становился на паузу и увеличивал $number на +1.
PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла




Это лишнее... я так понимаю, что просто надо получить, вот это:



Код:

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

$file = 'F0D7.tmp'
$fout = 'F0D7_1.tmp'
[byte[]]$fin = 0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01
[byte[]]$rep = 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+1);$j -lt $rep.count;$n++,$j++){
	$bytes[$n] = $rep[$j]
}
[io.file]::writeallbytes($fout, $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)

и запускать можно так:



Код:

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

.\script.ps1 -fin (0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01) -rep (0x08,0x5A,0x54,0x51,0x57,0x54,0x78,0x77,0x10)
Аватара пользователя
9119

Re: PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла

Сообщение 9119 »

Код:

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

$file = 'F0D7.tmp'
$fout = 'F0D7_1.tmp'
$list = '0x08 0x8a 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0x21
           0x08 0x8a 0xXX 0xXX 0xXX 0xXX 0xXX 0xXX 0x22'
$number = '0'
[byte[]]$fin = 0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01
[byte]$rep = ($list)[$number]
$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)
$bytes[($i+1)] = $rep
[io.file]::writeallbytes($fout, $bytes)

Помогите это положить в цикл, чтобы после каждого выполнения становился на паузу и увеличивал $number на +1.

Чтобы выполнялся Пока ($list)[$number] не равно null; когда переменная пустая (т.е строки закончились) - выдать уведомление что строк нет и стать на паузу.

Спасибо.
Аватара пользователя
YuS_2

Re: PowerShell - [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла

Сообщение YuS_2 »

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




Код:

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

$file     = 'D:\temp\F0D7.tmp'
$tmp      = 'D:\temp\tmp.tmp'
$pattern = '08 3a 35 32 88 65 59 18'
$replacement = '08 8a 35 32 88 65 59 18'
certutil -f -encodeHex "$file" "$tmp" > $null
(gc "$tmp") -replace "$pattern","$replacement" |set-content "$tmp"
certutil -f -decodeHex "$tmp" "$file" > $null


Цитата 9119:



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




Вообще, одно:



Код:

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

f17050	00 00 35 35 30 6e ff 01  08 3a 35 32 88 65 59 18   ..550n...:52.eY.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»