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

Компьютерный форум 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

 

Ветеран


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

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


Цитата 9119:
Можно ли это проделать в powershell? »
Можно.

Цитата 9119:
Или с помощью любой другой консольной утилиты. »
Можно.

Цитата 9119:
Есть файл, скажем B2DD.tmp. около 20МБ. »
Цитата 9119:
Важно! сама искомая комбинация выглядит так: 08 3А 35 32 88 65 59 18 01, но почему то по полному запросу не находит. »
Упакуйте файл в архив и выложите на вменяемый обменник или облако.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:56, 02-08-2021 | #2



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

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


Старожил


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

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


Цитата Iska:
Упакуйте файл в архив »
https://drive.google.com/file/d/12yO...ew?usp=sharing

Отправлено: 16:23, 02-08-2021 | #3


Ветеран


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

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


у меня вышло пока так:
PowerShell
Код: Выделить весь код
$file     = 'F0D7.tmp'
$tmp      = 'tmp.txt'
$slineHex = '35 32 88 65 59 18'

certutil -f -encodeHex $file $tmp|Out-Null

$cont = Switch -Regex -File $tmp {
  "  08 3a $slineHex" {$_ -Replace '  08 3a', '  08 8A'}
  Default             {$_}
}
$cont|Set-Content $tmp

certutil -f -decodeHex $tmp $file|Out-Null
но выполнение на приведенном файле ой как не быстро.
Это сообщение посчитали полезным следующие участники:

Отправлено: 02:44, 03-08-2021 | #4


Старожил


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

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


Цитата alpap:
у меня вышло пока так »
не до конца разобрался в коде...
вижу часть замены 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 в следующем цикле).

Последний раз редактировалось 9119, 03-08-2021 в 10:34.


Отправлено: 10:15, 03-08-2021 | #5


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата 9119:
Есть ли более быстрая возможность замены? »
Код: Выделить весь код
$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:
но почему то по полному запросу не находит. »
Патамушта "А" - это совсем не "A"

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

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

Отправлено: 10:29, 03-08-2021 | #6


Старожил


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

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


Код: Выделить весь код
$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; когда переменная пустая (т.е строки закончились) - выдать уведомление что строк нет и стать на паузу.
Спасибо.

Отправлено: 10:44, 03-08-2021 | #7


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата 9119:
чтобы после каждого выполнения становился на паузу и увеличивал $number на +1. »
Это лишнее... я так понимаю, что просто надо получить, вот это:
Код: Выделить весь код
$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)

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


Последний раз редактировалось YuS_2, 03-08-2021 в 11:28. Причина: Дополнение

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

Отправлено: 11:03, 03-08-2021 | #8


Старожил


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

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


YuS_2,
не могу получить желаемое.
Я этого не уточнял в шапке. Что значение не одно.

Делаю так:
Код: Выделить весь код
$list = Get-content C:\Users\Administrator\Desktop\list.txt
*в файле 10 строк. кроме как ($list)["номер строки"] - не знаю как еще получить нужную строку.
Но если подставляю полученное в [byte[]]$rep - получаю что не может перекодировать полученное в system byte
* строки в txt подогнаны под формат 0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX


как сделать, чтобы в [byte[]]$rep в вашем коде попадала сначала первая строка, потом вторую и т.д?

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


Аватара для DJ Mogarych

fascinating rhythm


Moderator


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

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


Чуть более лаконичный вариант коллеги alpap
Код: Выделить весь код
$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:
Что значение не одно. »
Вообще, одно:
Код: Выделить весь код
f17050	00 00 35 35 30 6e ff 01  08 3a 35 32 88 65 59 18   ..550n...:52.eY.

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)

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

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



Компьютерный форум 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




 
Переход