Могу ли я использовать этот скрипт для правильного исправления исполняемого файла?

278
Mr. Mendelli

Недавно я получил некоторую помощь со скриптом замены текста и подумал, можно ли его использовать для исправления. Я обычно использую HxD и думал, что если это по сути прославленный блокнот, то какая разница между редактированием исполняемого файла в текстовом и шестнадцатеричном редакторе? Я решил проверить свою теорию и протестировать скрипт, который может заменить указанные строки и добавить информацию в исполняемый файл.

Что меня здесь отталкивает, так это то, что если он используется для замены текста в текстовом документе, он заменяет только строки и не добавляет байты в документ, если только новая строка не длиннее предыдущей. Я считаю, что это потому, что скрипт предназначен для редактирования текстовых документов и изменяет заголовок из-за этого. Я использовал HxD для сравнения до и после, и, конечно же, заголовок был изменен. Вот сценарий, который я сейчас имею:

@echo off setlocal enableextensions disabledelayedexpansion  set search=OutDir=Old String set replace=OutDir=New String set textFile=Document.txt  :PowerShell SET PSScript=%temp%\~tmpStrRplc.ps1 ECHO (Get-Content "%~dp0%textFile%").replace("%search%", "%replace%") ^| Set-Content "%~dp0%textFile%">"%PSScript%"  SET PowerShellDir=C:\Windows\System32\WindowsPowerShell\v1.0 CD /D "%PowerShellDir%" Powershell -ExecutionPolicy Bypass -Command "& '%PSScript%'" EXIT 

(Строки, которые я буду заменять, имеют одинаковый размер, поэтому размер исполняемого файла не изменится, и повреждение строк не будет использоваться.)

Я хотел бы отметить, что я новичок в PowerShell, поэтому я все еще изучаю, как он работает. Я заметил %~dp0%textFile%переменную. Если я правильно интерпретирую эту переменную, она говорит скрипту PowerShell обработать определенный файл, который нужно изменить, как текстовый документ. Если следовать этой логике (если она верна), существует ли подобная переменная, которая либо игнорирует формат, либо обрабатывает входной файл как исполняемый файл? Мой сценарий способен изменить то, что я определяю, но нарушает исполняемый файл. Возможно ли исправление с помощью моего сценария?

2
Нет. В общем случае вы не можете «исправить» исполняемый файл с помощью текстового редактора. Исполняемые файлы заботятся о том, где расположено большинство байтов, и перемещение их без регулировки указателей приводит к непредвиденным эффектам. Если вам повезет, он рухнет прямо вверх; если нет, то он может сделать что угодно. Вы даже не можете ничего предположить о формате текста, хранящегося в неизвестном исполняемом файле, и о том, что необходимо для его изменения. Bob 6 лет назад 0
Я знаю, что байты должны быть перезаписаны, а не сдвинуты в исполняемом файле. В моем случае строки, которые я заменяю, имеют тот же размер, что и их предшественники. Мой пример не отражает этого, поэтому я буду его пересматривать. Несмотря на это, я не понимаю, как я могу заменить строку в Notepad ++ без повреждения двоичного файла. Если Notepad ++ не поддерживает формат, я не вижу, как заменить строки невозможно. Есть ли что-то еще, что я здесь скучаю? Mr. Mendelli 6 лет назад 0
Чтобы защититься от повреждений, в заголовке файла EXE есть контрольная сумма: ее нужно будет обновить, если вы что-то измените в файле. Кроме того, любая замена текстовой строки может повредить двоичный файл, поскольку нулевые байты используются в качестве разделителей строк, поэтому вам нужно использовать двоичный редактор, но я не знаю ни одного, который бы разрешал пакетную операцию. AFH 6 лет назад 1
Хорошо знать @AFH, я не принял во внимание нулевые байты. Mr. Mendelli 6 лет назад 0
Лучшим ответом может быть изменение выходного каталога в символическую ссылку, указывающую на нужный каталог, и оставление двоичных файлов в покое. AFH 6 лет назад 0
Я не уверен, что вы подразумеваете под этим ... Не могли бы вы уточнить? Mr. Mendelli 6 лет назад 0
@ Mr.Mendelli Я думаю, он, возможно, подумал, что вы пытаетесь изменить логику исполняемого файла, возможно, для использования другого выходного каталога, и было предложено использовать символическую ссылку, чтобы вместо этого указать новый путь вывода, чтобы ссылка была сделать так, чтобы он выглядел как текущий исполняемый каталог вывода или что-то еще, и символическая ссылка создаст ссылку, которая будет выглядеть как этот путь, и вы можете указать это на новое местоположение, а не изменять код exe, чтобы сделать это иначе. Может быть, это то, что я думал .... Pimp Juice IT 6 лет назад 0

1 ответ на вопрос

1
isaac willard

Взятый из примера, который я видел недавно:

# Description: set your.exe resolution 0 to any x/y specified # By knowning the offset for these values hard coded in your  # executable # - None of this is real world... example only   Set-Location(Split-Path $MyInvocation.MyCommand.Path)  # Prompt resolution  $resolutionX = Read-Host -Prompt "Width" $resolutionY = Read-Host -Prompt "Height" # Resolution Z is just hard coded as 32  # Patch bytes  $bytes = [System.IO.File]::ReadAllBytes("your.exe")  # Arbitrary locations and values for example  $offsetX = 0x0039CA70 $offsetY = $offsetX + 4 $offsetZ = $offsetY + 4  $resolutionX = [BitConverter]::GetBytes([Int16]$resolutionX) $resolutionY = [BitConverter]::GetBytes([Int16]$resolutionY) $resolutionZ = [BitConverter]::GetBytes([Int16]32)  # SMASH your new values into the exe  $bytes[$offsetX] = $resolutionX[0] $bytes[$offsetX+1] = $resolutionX[1] $bytes[$offsetY] = $resolutionY[0] $bytes[$offsetY+1] = $resolutionY[1] $bytes[$offsetZ] = $resolutionZ[0]  # And save the result  [System.IO.File]::WriteAllBytes("your.exe", $bytes)    Read-Host -Prompt "Press Enter to exit" 
Некоторое объяснение приветствуется. Toto 6 лет назад 0
Спасибо [@isaac Уиллард] (https://superuser.com/users/886922/isaac-willard). Это очень интересно, я посмотрю, что я могу с этим сделать. Не могли бы вы предоставить первоисточник, из которого оно было взято? Mr. Mendelli 6 лет назад 0