2013-04-05 48 views
5

Czy w systemie Windows istnieje sposób edytowania pliku binarnego z wiersza poleceń? tj. sposób, który można zapisać w pliku wsadowym?Czy można edytować plik binarny za pomocą wiersza poleceń systemu Windows?

Chcę móc edytować pojedynczy bajt, w znanej pozycji, w istniejącym pliku.

To istniejące pytanie [1] zostało rozwiązane, ale jest to rozwiązanie dla systemu Linux. Szukam czegoś podobnego w systemie Windows.

Tło

Istnieje bug w GTA 1, gdy pobrać ze Steama przy czym dane zapisać plik-gra zostanie uszkodzona na wyjściu. W wyniku tego gra może być odtwarzana dobrze za pierwszym razem, ale później ulega awarii. Okazuje się, że można to naprawić, zmieniając 5. bajt w pliku (tj. Bajt pod adresem 0x04) z x00 na x06 [2].

mogę to zrobić w Pythonie łatwo, na przykład:

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) 

Idealnie chociaż wolałbym zrobić to w trybie wsadowym, który wykonuje następujące czynności:

  • poprawek plik danych
  • uruchamia GTA

Mogę zrobić coś, co działa dla mnie (używając Pythona), ale to by nie pomagaj losowym innym osobom, które nie mają Pythona (tak, wiem, że łatwo jest zainstalować, ale nadal). Podobnie jest dostępny freeware, który twierdzi, że robi to właśnie, ale nie chcę uruchamiać losowego .exe na moim komputerze, i nie sądzę, żeby ktokolwiek inny też. Z tego powodu chciałbym przedstawić plik wsadowy, który ludzie mogą sprawdzić i - jeśli są zadowoleni z tego, co robi - uruchomić dla siebie.

Dzięki za pomoc!

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

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

[Edycja] Stała się skrypt Pythona, jak okazało się, że nie działa jak jest (file.read() zwraca niezmienny przedmiotu , więc nie możesz po prostu zaktualizować jednej z wartości).

Odpowiedz

1

Co powiesz na podzielenie oryginalnego pliku na trzy części, a następnie połączenie z bajtem zastępczym w środku? Podziel plik binarny na trzy części (start -> target-1/target/target + 1 -> end), a następnie użyj opcji COPY, aby scalić początkowe i końcowe kawałki z nowym bajtem w środku.

Nigdy nie udało mi się uzyskać DOS (lub dowolnego wiersza poleceń systemu Windows), aby podzielić plik natywnie, ale darmowe narzędzie SPLITS.EXE jest bardzo dobre i może zostać włączone do twojego rozwiązania. COPY to oczywiście natywne polecenie.

nie mogę znaleźć linku do tego narzędzia już teraz, ale googlowania dla wolny dos narzędzie File split przynosi wiele hitów ...

+0

Ale kto sprawdza, * SPLITS.EXE * nie jest modyfikowany? Może to być losowy .exe. – ComFreek

+0

Jak mówi ComFreek, gdybym był szczęśliwy z uruchamianiem losowego exe, po prostu użyłbym GTALauncher.exe, który naprawia plik i uruchamia GTA :-) – sam

+0

No cóż, biorąc pod uwagę, że nie ma sposobu, aby to zrobić w DOS (przynajmniej nie sposób jaki kiedykolwiek odkryłem) będziesz musiał wysłać narzędzie pomocnicze ze skryptem - lub po prostu spakować rozwiązanie jako .exe i wysłać to. Przypuszczam, że różnica polega na tym, że jeśli wysyłasz dowolnie dostępne narzędzie innej firmy wraz ze skryptem, można go porównać z tym samym narzędziem z innych źródeł (na przykład z renomowanymi), podczas gdy niestandardowy pakiet .exe nie może tego zrobić. –

9

myślę PowerShell jest idealnym narzędziem do tego zadania.Jest ona dostępna dla XP lub wyższym i jest automatycznie wysyłane do systemu Windows 7:

Wystarczy utworzyć plik *.ps z tej treści:

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

Należy pamiętać, że trzeba włączyć niepodpisanych skryptów PowerShell:

  1. Uruchom PowerShell jako administrator

  2. Uruchom polecenie: Set-ExecutionPolicy RemoteSigned


Można również użyć VBScript ale skrypt będzie nieco dłużej, ponieważ nie został zaprojektowany do odczytu plików binarnych (trzeba użyć ADODB.Stream obiektów).

Oto kompilacja funkcji pomocniczych: http://www.motobit.com/tips/detpg_read-write-binary-files/

+0

Dzięki, nie próbowałem wcześniej używać PowerShell. Po prostu spróbowałem uruchomić ten przykład i nie zadziałało - dostałem okno PowerShell (i kradnąc fokus), a następnie znikające, wielokrotnie - przez kilka minut. Nie spowodowało to zmiany pliku. Kiedy uruchomiłem PowerShell bezpośrednio i wpisałem polecenia, które zasugerowałeś, to działało dobrze. Masz pojęcie, co się dzieje? Nie próbowałem jeszcze włączać niepodpisanych skryptów - ale jeszcze nie próbuję tego do tej pory, dopóki nie będę wiedział, na czym polega problem, ponieważ mój komputer nie nadawał się do użytku, dopóki skrypt nie zdecydował się przestać działać. – sam

+0

[aktualizacja] Mam ten sam problem nawet po ustawieniu zasad wykonywania. Widzę to, jeśli uruchamiam z cmd lub z powershell. – sam

+0

@sam Którą wersję systemu Windows używasz? Czy korzystasz z najnowszych aktualizacji? Przykro mi z powodu tego dziwnego zachowania. Oto nowa wersja, która czeka na naciśnięcia klawiszy przed wykonaniem każdego polecenia: http://pastebin.com/5hjHbkBt. Spróbuj również wykonać skrypt za pomocą * prawego kliknięcia -> Uruchom z PowerShell * w Eksploratorze. – ComFreek