2

Недавно я получил некоторую помощь со скриптом замены текста и подумал, можно ли его использовать для исправления. Я обычно использую 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 обработать определенный файл, который нужно изменить, как текстовый документ. Если следовать этой логике (если она верна), существует ли подобная переменная, которая либо игнорирует формат, либо обрабатывает входной файл как исполняемый файл? Мой сценарий способен изменить то, что я определяю, но нарушает исполняемый файл. Возможно ли исправление с помощью моего сценария?

1 ответ1

1

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

# 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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .