PDA

Показать полную графическую версию : [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла


Страниц : 1 [2]

9119
03-08-2021, 14:26
Разобрался:

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

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

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

sov44
03-08-2021, 17:57
Или с помощью любой другой консольной утилиты. »
как вариант, мгновенная замена.
sfk.exe rep F0D7.tmp -bin /083a35328865591801/088A34318764581700/ -yes

скачать sfk (https://sourceforge.net/projects/swissfileknife/)

9119
03-08-2021, 19:17
мгновенная замена. »
отличный вариант.

Kraeved
28-01-2024, 17:14
YuS_2
Сравнил результаты работы вашего скрипта (http://forum.oszone.net/post-2963515.html#post2963515) и утилиты sfk (http://forum.oszone.net/post-2963563.html#post2963563).

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

YuS_2
28-01-2024, 21:23
Меняю в вашем скрипте верхушку, указывая последовательность для поиска и замены »
это не верхушка, это параметры функции со значением по умолчанию. При запуске функции, в скрипте необходимо указать параметры... в общем:

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

смотрите:
скрипт (http://forum.oszone.net/post-2963531.html#post2963531) с этим дополнением (http://forum.oszone.net/post-2963536.html#post2963536)
Строка на которую меняем байты, из файла test.csv:
F0D1.tmp,"0x08,0x5A,0x54,0x51,0x57,0x54,0x78,0x77,0x10"

из скрипта, строка поиска с байтами для замены:
]$findb = 0x08,[B]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
- проверяйте.




© OSzone.net 2001-2012