Kann ich dieses Skript verwenden, um eine ausführbare Datei richtig zu patchen?

411
Mr. Mendelli

Ich hatte vor kurzem Hilfe bei einem Textersetzungsskript und fragte mich, ob es für Patches verwendet werden könnte. Normalerweise verwende ich HxD und dachte, wenn es sich im Wesentlichen um einen verherrlichten Notizblock handelt, welchen Unterschied gibt es zwischen der Bearbeitung einer ausführbaren Datei in einem Texteditor und einem Hex-Editor? Ich habe mich entschieden, meine Theorie zu testen und das Skript zu testen, während es die angegebenen Zeichenfolgen ersetzen kann und der ausführbaren Datei Informationen hinzufügt.

Was mich hier abschreckt, ist, dass es, wenn es zum Ersetzen von Text in einem Textdokument verwendet wird, nur Zeichenfolgen ersetzt und dem Dokument keine Bytes hinzufügt, es sei denn, die neue Zeichenfolge ist länger als die vorherige. Ich glaube, das liegt daran, dass das Skript für die Bearbeitung von Textdokumenten konzipiert ist und aus diesem Grund den Header ändert. Ich habe HxD verwendet, um das Vorher und Nachher zu vergleichen, und der Header wird geändert. Hier ist das Skript, das ich momentan habe:

@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 

(Die Zeichenfolgen, die ich ersetzen werde, haben dieselbe Größe, daher wird die Größe der ausführbaren Datei nicht geändert und es wird keine Zeichenfolgenbeschädigung verwendet.)

Ich möchte anmerken, dass ich neu bei PowerShell bin. Daher lerne ich immer noch, wie es funktioniert. Ich habe die %~dp0%textFile%Variable bemerkt . Wenn ich diese Variable richtig interpretiere, wird das PowerShell-Skript angewiesen, die definierte Datei als Textdokument zu bearbeiten . Möchten Sie dieser Logik (wenn es richtig ist), gibt es eine ähnliche Variable, die entweder das Format ignorieren oder die Eingabedatei als ausführbares umgehen? Mein Skript kann das, was ich definiere, ändern, bricht jedoch die ausführbare Datei. Ist das Patchen mit meinem Skript möglich?

2
Im Allgemeinen können Sie eine ausführbare Datei nicht mit einem Texteditor "patchen". Ausführbare Dateien kümmern sich darum, wo die meisten Bytes positioniert sind und sie verschoben werden, ohne dass die Zeiger angepasst werden, was zu ungewollten Effekten führt. Wenn Sie * glücklich * sind, stürzt es gerade hoch; Wenn nicht, kann es einfach alles tun. Sie können nicht einmal etwas über das Format von Text, der in einer unbekannten ausführbaren Datei gespeichert ist, annehmen und auch nicht, was zum Ändern erforderlich ist. Bob vor 6 Jahren 0
Mir ist bekannt, dass Bytes in einer ausführbaren Datei überschrieben und nicht verschoben werden müssen. In meinem Fall haben die Saiten, die ich ersetze, die gleiche Größe wie ihre Vorgänger. Mein Beispiel spiegelt dies nicht wider, daher werde ich es überarbeiten. Trotzdem verstehe ich nicht, wie ich die Zeichenfolge in Notepad ++ ersetzen kann, ohne die Binärdatei zu beschädigen. Wenn Notepad ++ "formatbewusst" ist, sehe ich nicht, wie das Ersetzen von Zeichenfolgen unmöglich ist. Gibt es noch etwas, was ich vermisse? Mr. Mendelli vor 6 Jahren 0
Zum Schutz vor Beschädigungen befindet sich im Header einer EXE-Datei eine Prüfsumme: Diese muss aktualisiert werden, wenn Sie etwas in der Datei ändern. Außerdem kann bei einer textbasierten Zeichenfolgenersetzung eine Binärdatei beschädigt werden, da Null-Bytes als Trennzeichen für Zeichenfolgen verwendet werden. Daher müssen Sie einen binären Editor verwenden. Ich kenne jedoch keine, die Batch-Operationen zulassen. AFH vor 6 Jahren 1
Gut zu wissen, @AFH, ich hatte die Nullbytes nicht berücksichtigt. Mr. Mendelli vor 6 Jahren 0
Eine bessere Antwort könnte sein, das Ausgabeverzeichnis in einen symbolischen Link zu ändern, der auf das gewünschte Verzeichnis zeigt, und die Binärdateien in Ruhe lassen. AFH vor 6 Jahren 0
Ich bin nicht sicher, was Sie damit meinen ... Könnten Sie das bitte klarstellen? Mr. Mendelli vor 6 Jahren 0
@ Mr. Mendelli Ich glaube, er hat vielleicht gedacht, Sie hätten versucht, die Logik der ausführbaren Datei zu ändern, um vielleicht ein anderes Ausgabeverzeichnis zu verwenden, und der Vorschlag war, einen symbolischen Link zu verwenden, der stattdessen auf den neuen Ausgabepfad verweist Machen Sie das Aussehen des aktuellen ausführbaren Ausgabeverzeichnisses oder eines beliebigen anderen Elements, und ein symbolischer Link erstellt einen Link, der als Pfad erscheint, und Sie können dies auf den neuen Speicherort verweisen, anstatt den Exe-Code zu ändern, um dies ansonsten zu tun. Vielleicht dachte ich das ... Pimp Juice IT vor 6 Jahren 0

1 Antwort auf die Frage

1
isaac willard

Aus einem Beispiel, das ich kürzlich gesehen habe:

# 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" 
Einige Erklärungen sind willkommen. Toto vor 6 Jahren 0
Vielen Dank [@isaac willard] (https://superuser.com/users/886922/isaac-willard). Das ist sehr interessant, ich werde sehen, was ich damit machen kann. Könnten Sie vielleicht die ursprüngliche Quelle angeben, aus der diese entnommen wurde? Mr. Mendelli vor 6 Jahren 0