2013-04-05 43 views
5

C'è un modo in Windows per modificare un file binario, dalla riga di comando? cioè un modo che potrebbe essere scritto in un file batch?È possibile modificare un file binario utilizzando la riga di comando di Windows?

Desidero essere in grado di modificare un singolo byte, in una posizione nota, in un file esistente.

Questa domanda esistente [1] è stata risolta, ma questa è una soluzione Linux. Sto cercando qualcosa di simile per Windows.

Sfondo

C'è un bug in GTA 1 quando scaricato da Steam per cui il file di dati save-game viene danneggiato in uscita. Di conseguenza, il gioco può essere giocato bene la prima volta ma successivamente si blocca. Risulta che questo può essere risolto cambiando il quinto byte nel file (cioè il byte all'indirizzo 0x04) da x00 a x06 [2].

posso fare questo in Python facilmente, per esempio:

with open("PLAYER_A.DAT", "rb") as f: 
    bytes = f.read() 
bytes = bytes[:4] + '\x06' + bytes[5:] 
with open("PLAYER_A.DAT", "wb") as g: 
    for b in bytes: g.write(b) 

Idealmente se io preferirei fare questo in un processo batch che esegue le seguenti operazioni:

  • correzioni di file di dati
  • avvia GTA

Potrei creare qualcosa che funzioni per me (usando Python), ma ciò non aiutare casualmente altre persone che non hanno Python (sì, so che è facile installare &, ma ancora). Allo stesso modo, c'è un freeware disponibile che afferma di fare proprio questo, ma non voglio eseguire un .exe casuale sul mio PC, e non penso che nessun altro dovrebbe neanche. Per questo motivo, mi piacerebbe presentare un file batch, che le persone possano ispezionare e, se sono contenti di ciò che fa, gestiscono autonomamente.

Grazie per il vostro aiuto!

[1] CLI: Write byte at address (hexedit/modify binary from the command line)

[2] http://forums.steampowered.com/forums/showthread.php?t=1597746

[modifica] Corretto lo script Python, come ho scoperto che non ha funzionato così com'è (file.read() restituisce un oggetto immutabile , quindi non puoi semplicemente aggiornare uno dei valori).

risposta

1

Che dire dividere il file originale in tre, quindi fondersi con il byte sostitutivo nel mezzo? Dividi il file binario in tre parti (start -> target-1/target/target + 1 -> end) quindi usa COPY per unire i blocchi di inizio e fine con il tuo nuovo byte nel mezzo.

Non sono mai stato in grado di ottenere DOS (o qualsiasi prompt dei comandi di Windows) per dividere un file in modo nativo, ma l'utilità SPLITS.EXE gratuita è molto buona e potrebbe essere inclusa nella soluzione. La COPIA è ovviamente un comando nativo.

non riesco a trovare un collegamento a tale utilità in questo momento, ma googling per 'dos ​​gratuito file di utilità split' produce molti successi ...

+0

Ma chi verifica che * * SPLITS.EXE non viene modificata? Potrebbe anche essere un exe casuale. – ComFreek

+0

Come dice ComFreek, se fossi felice di eseguire un exe casuale, userei semplicemente GTALauncher.exe che corregge il file e avvia GTA :-) – sam

+0

Beh, dato che non c'è modo di farlo in DOS (almeno, no modo che ho mai scoperto) dovrai spedire un programma di utilità helper con lo script, o semplicemente impacchettare la soluzione come .exe e spedirla. Suppongo che la differenza sia che se si spedisce un programma di utilità di terze parti liberamente disponibile insieme a uno script, esso può essere confrontato con la stessa utility da altre fonti (si spera che siano affidabili) mentre un pacchetto .exe personalizzato non può. –

9

Penso PowerShell è uno strumento perfetto per questo compito.E 'disponibile per XP o superiore e viene fornito automaticamente dal momento che Windows 7:

Basta creare un file *.ps con questo contenuto:

$bytes = [System.IO.File]::ReadAllBytes("PLAYER_A.DAT"); 
$bytes[4] = 0x06; 

[System.IO.File]::WriteAllBytes("PLAYER_A.DAT", $bytes); 
& "C:\Path-To-GTA1-Exe-File.exe" 

Nota che si deve attivare gli script PowerShell non firmati:

  1. Avviare PowerShell come amministratore

  2. Eseguire questo comando: Set-ExecutionPolicy RemoteSigned


Si potrebbe anche utilizzare VBScript ma lo script sarà un po 'più a lungo perché non è stato progettato per la lettura di file binari (è necessario utilizzare ADODB.Stream oggetti).

Ecco una raccolta di funzioni di supporto: http://www.motobit.com/tips/detpg_read-write-binary-files/

+0

Grazie, non ho ancora provato a utilizzare PowerShell. Ho solo provato a lanciare questo esempio e non ha funzionato: ho ottenuto una finestra di PowerShell che si apre (e ruba lo stato attivo) e poi scompare, ripetutamente, per diversi minuti. Non ha comportato la modifica del file. Quando ho eseguito direttamente PowerShell e ho digitato i comandi che hai suggerito, questo ha funzionato correttamente. Qualche idea su cosa sta succedendo? Non ho ancora provato ad abilitare script non firmati, ma non sono così entusiasta di provarlo fino a quando non so qual è il problema, dato che il mio PC era inutilizzabile fino a quando lo script ha deciso di smettere di funzionare. – sam

+0

[aggiornamento] Ho lo stesso problema anche dopo aver impostato il criterio di esecuzione. Lo vedo se corro da cmd o da PowerShell. – sam

+0

@sam Quale versione di Windows stai usando? Usi gli ultimi aggiornamenti? Mi dispiace per quello strano comportamento. Ecco una nuova versione che attende la pressione dei tasti prima di eseguire ogni comando: http://pastebin.com/5hjHbkBt. Prova anche a eseguire lo script tramite * tasto destro del mouse -> Esegui con PowerShell * in Explorer. – ComFreek