Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Поиск hex значения в файле, замена значения на заданное, сохранение файла (http://forum.oszone.net/showthread.php?t=349315)

9119 02-08-2021 15:36 2963448

Поиск hex значения в файле, замена значения на заданное, сохранение файла
 
Добрый.

Сейчас делаю так:
Есть файл, скажем 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 02-08-2021 15:56 2963454

Цитата:

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

Можно.

Цитата:

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

Можно.

Цитата:

Цитата 9119
Есть файл, скажем B2DD.tmp. около 20МБ. »

Цитата:

Цитата 9119
Важно! сама искомая комбинация выглядит так: 08 3А 35 32 88 65 59 18 01, но почему то по полному запросу не находит. »

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

9119 02-08-2021 16:23 2963466

Цитата:

Цитата Iska
Упакуйте файл в архив »

https://drive.google.com/file/d/12yO...ew?usp=sharing

alpap 03-08-2021 02:44 2963506

у меня вышло пока так:
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

но выполнение на приведенном файле ой как не быстро.

9119 03-08-2021 10:15 2963511

Цитата:

Цитата 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 в следующем цикле).

YuS_2 03-08-2021 10:29 2963513

Цитата:

Цитата 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" :)

9119 03-08-2021 10:44 2963515

Код:

$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 03-08-2021 11:03 2963519

Цитата:

Цитата 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)

9119 03-08-2021 11:23 2963521

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 в вашем коде попадала сначала первая строка, потом вторую и т.д?

DJ Mogarych 03-08-2021 11:23 2963522

Чуть более лаконичный вариант коллеги 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.

9119 03-08-2021 11:31 2963525

DJ Mogarych, я наверное криво объясняю...простите.


Значение которое находится в файле - всегда одно (08 3a 35 32 88 65 59 18)
ЗначениЙ которыми искомое заменяется - НЕ ОДНО! Их список. Скажем 10 шт.
Файлов TMP тоже НЕ ОДИН.
Т.е сначала находим в первом файле 1.tmp значение 08 3a 35 32 88 65 59 18 и меняем на 08 8a XX XX XX XX XX XX 01
Потом берется следующий 2.TMP файл. В нем опять находится все тоже 08 3a 35 32 88 65 59 18, но меняется уже на следлующее значение из списка
08 8a XX XX XX XX XX XX 02.... и так далее пока не закончатся строки в списке.

YuS_2 03-08-2021 11:32 2963526

Цитата:

Цитата 9119
Что значение не одно. »

Пост выше дополнил, это должно помочь

DJ Mogarych 03-08-2021 11:40 2963527

9119, надо всегда описывать задачу целиком, это избавит от двойной работы.
Как определять соответствие файлов списку, т. е., как понять, в каком файле какое значение в списке применять?

YuS_2 03-08-2021 11:43 2963528

Цитата:

Цитата 9119
* строки в txt подогнаны под формат 0xXX,0xXX,0xXX,0xXX,0xXX,0xXX,0xXX
как сделать, чтобы в [byte[]]$rep в вашем коде попадала сначала первая строка, потом вторую и т.д? »

Чтобы считывать из текстового файла строковые значения и преобразовывать их в массив байтов, можно сделать, что-то типа:
Код:

gc test.txt|%{
    [byte[]]$a = $_ -split ','
    # здесь организовать вызов функции с передачей параметра $a
}


9119 03-08-2021 11:47 2963529

Цитата:

Цитата YuS_2
Пост выше дополнил, это должно помочь »

да действительно, так мне проще. Один нюанс.
Стартую ваш скрипт так:
Код:

$list = Get-content C:\Users\Administrator\Desktop\list.txt
$number = 0
$my_data = ($list)[$number]
.\find_replace.ps1 -fin (0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01) -rep ($my_data)
$number = $number + 1
$my_data
pause

при запуске получаю следующее:
Код:

PS C:\Users\Administrator\Desktop\script_PS> ./start.ps1
find_replace.ps1: C:\Users\Administrator\Desktop\script_PS> ./start.ps1:4
Line |
  4 |  : 1 -fin (0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01) -rep ($my_data)
    |                                                              ~~~~~~~~~~
    | Cannot process argument transformation on parameter 'rep'. Cannot
    | convert value "0x08,0x8a,0x26,0x41,0x07,0x04,0x38,0x40,0x21" to type
    | "System.Byte[]". Error: "Cannot convert value
    | "0x08,0x8a,0x26,0x41,0x07,0x04,0x38,0x40,0x21" to type "System.Byte".
    | Error: "Additional non-parsable characters are at the end of the
    | string.""
0x08,0x8a,0x26,0x41,0x07,0x04,0x38,0x40,0x21
Press Enter to continue...:

list.txt:
Код:

0x08,0x8a,0x26,0x41,0x07,0x04,0x38,0x40,0x21
0x08,0x8a,0x26,0x41,0x07,0x04,0x38,0x40,0x97
0x08,0x8a,0x26,0x41,0x07,0x04,0x38,0x30,0x12
0x08,0x8a,0x26,0x41,0x07,0x04,0x38,0x40,0x83
0x08,0x8a,0x26,0x41,0x07,0x04,0x38,0x40,0x40
0x08,0x8a,0x26,0x41,0x07,0x04,0x38,0x70,0x10


DJ Mogarych,
пример списка привел, файлы всегда одинаковые по размеру, имеют просто разные имена, но все всегда содержат одну и туже искомую строку:
0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01, которую нужно находить и менять на значение из списка.
Пример файла выкладывал на 1ой странице

YuS_2 03-08-2021 12:04 2963531

Цитата:

Цитата 9119
при запуске получаю следующее: »

Там должна быть не строка, а массив байтов...
В общем, сделайте лучше так:
Пример для трех файлов и трех шаблонов замены:
Код:

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 = 0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01
# количество шаблонов должно соответствовать количеству файлов
$files = '.\F0D1.tmp','.\F0D2.tmp','.\F0D3.tmp' # 3 файла
$frep = gc test.txt # здесь в файле содержится 3 строки шаблонов замены

0..2|%{
        replace-bytes -file $files[$_] -fout "fout$($_+1).tmp" -fin $findb -rep $([byte[]]($frep[$_] -split ','))
}


YuS_2 03-08-2021 12:27 2963536

Цитата:

Цитата DJ Mogarych
Как определять соответствие файлов списку, т. е., как понять, в каком файле какое значение в списке применять? »

9119, Кстати, да... это важное замечание.
Чтобы не путаться в шаблонах и файлах, проще создавать файл в формате CSV, с содержимым типа:
Цитата:

File,Pattern
F0D1.tmp,"0x08,0x5A,0x54,0x51,0x57,0x54,0x78,0x77,0x10"
F0D2.tmp,"0x08,0x8A,0x34,0x31,0x87,0x64,0x58,0x17,0x00"
F0D3.tmp,"0x08,0x9A,0x24,0x21,0x27,0x24,0x28,0x27,0x20"
Функция не меняется, а вот запуск действий, будет выглядеть так:
Код:

...
[byte[]]$findb = 0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01
$list = import-csv test.csv

for ($i=0;$i -lt $list.count;$i++){
        replace-bytes -file $list.file[$i] -fout "fout$($i+1).tmp" -fin $findb -rep $([byte[]]($list.pattern[$i] -split ','))
}

- в этом случае, не придется вручную указывать количество файлов/шаблонов, скрипт сам посчитает количество и сделает замену, по списку из файла test.csv

9119 03-08-2021 12:36 2963537

YuS_2, с задачей немного не идет это просто.

Суть в том, что изначально есть только список значений для замены в файлах, а списка файлов нет. Файл tmp на момент выполнения скрипта - только один.

Запускается exe, который кладет файл.tmp во временную папку (каждый запуск exe имя файла меняется и это имя каждый раз рандомное я его не знаю!)
Далее я получаю имя этого файла (получаю все файлы tmp и сортирую по дате изменения, беру первый в списке) и кладу в переменную.
нахожу в нем искомое и меняю на строку из txt файла.
Далее запускаю опять этот же exe. Опять появляется новый tmp файл. опять получаю его в переменную. и делаю замены, но беру уже следующую строку из txt файла.... и так далее... пока не закончатся строки в txt файле.

DJ Mogarych 03-08-2021 12:51 2963538

Тогда надо запускать не .exe, а скрипт, который будет запускать .exe, а потом обрабатывать его выхлоп, и писать в отдельный файл номер последней использованной строки.

Что будет, когда строки в файле закончатся?

9119 03-08-2021 13:02 2963539

DJ Mogarych, когда строки закончатся - должно об этом сообщить и стать на паузу.

Для себя все таки максимально удобным считаю вариант запуска основного скрипта с параметрами от ув. YuS_2. http://forum.oszone.net/post-2963519-8.html


Стартовать пытаюсь его скрипт так:
Код:

$file = Get-ChildItem -Path "C:\Windows\Temp" -recurse -include *.tmp | Sort-Object LastAccessTime -Descending | Sort-Object -Descending -Property length | Select-Object -First 1 |%{$_.FullName}
$list = Get-content C:\Users\Administrator\Desktop\list.txt
$number = 0
$my_data = ($list)[$number]
pause
.\find_replace.ps1 -file ($file) -fin (0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01) -rep ($my_data)
$number = $number + 1
$my_data
$file
pause

Пожалуйста, помогите правильно передать $my_data в -rep.
чтобы строка передалась как набор байтов, и дальнейший скрипт её "схавал")
Пока получаю это:
Код:

find_replace.ps1: C:\Users\Administrator\Desktop\script_PS\start.ps1:6
Line |
  6 |  : ) -fin (0x08,0x3A,0x35,0x32,0x88,0x65,0x59,0x18,0x01) -rep ($my_data)
    |                                                              ~~~~~~~~~~
    | Cannot process argument transformation on parameter 'rep'. Cannot
    | convert value "0x08,0x8a,0x26,0x41,0x07,0x04,0x38,0x40,0x21" to type
    | "System.Byte[]". Error: "Cannot convert value
    | "0x08,0x8a,0x26,0x41,0x07,0x04,0x38,0x40,0x21" to type "System.Byte".
    | Error: "Additional non-parsable characters are at the end of the
    | string.""

* может нужно к какому-то виду привести сам список..

9119 03-08-2021 14:26 2963543

Разобрался:

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

Код:

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

Цитата:

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

как вариант, мгновенная замена.
Код:

sfk.exe rep F0D7.tmp -bin /083a35328865591801/088A34318764581700/ -yes
скачать sfk

9119 03-08-2021 19:17 2963573

Цитата:

Цитата sov44
мгновенная замена. »

отличный вариант.

Kraeved 28-01-2024 17:14 3023353

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)


YuS_2 28-01-2024 21:23 3023364

Цитата:

Цитата 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

- проверяйте.


Время: 05:06.

Время: 05:06.
© OSzone.net 2001-