2013-04-05 49 views
5

Có cách nào trong Windows để chỉnh sửa tệp nhị phân, từ dòng lệnh không? tức là một cách có thể được viết thành một tập tin thực thi?Có thể chỉnh sửa tệp nhị phân bằng dòng lệnh của Windows không?

Tôi muốn có thể chỉnh sửa một byte đơn, tại vị trí đã biết, trong tệp hiện có.

Câu hỏi hiện có [1] này đã được giải quyết, nhưng đó là giải pháp Linux. Tôi đang tìm một cái gì đó tương tự cho Windows.

nền

Có một lỗi trong GTA 1 khi tải về từ Steam, theo đó các tập tin dữ liệu lưu trò chơi bị hỏng trên lối ra. Kết quả là, trò chơi có thể chơi tốt lần đầu tiên nhưng sau đó bị treo. Nó chỉ ra điều này có thể được cố định bằng cách thay đổi byte thứ 5 trong tập tin (tức là byte tại địa chỉ 0x04) từ x00 đến x06 [2].

tôi có thể làm điều này bằng Python dễ dàng, ví dụ:

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) 

Lý tưởng nhất dù tôi thà làm điều này trong một công việc hàng loạt nào sau đây:

  • sửa các tập tin dữ liệu
  • ra mắt GTA

Tôi có thể tạo ra điều gì đó phù hợp với mình (sử dụng Python), nhưng điều đó sẽ không giúp người khác ngẫu nhiên không có Python (vâng tôi biết thật dễ dàng để cài đặt &, nhưng vẫn còn). Tương tự như vậy, có một phần mềm miễn phí có sẵn mà tuyên bố để làm điều này, nhưng tôi không muốn chạy một ngẫu nhiên .exe trên máy tính của tôi, và tôi không nghĩ rằng bất cứ ai khác nên hoặc. Vì lý do đó, tôi muốn trình bày một tập tin thực thi, mà mọi người có thể kiểm tra, và - nếu họ hài lòng với những gì nó làm - chạy cho chính họ.

Cảm ơn sự giúp đỡ của bạn!

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

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

[sửa] Cố định lên kịch bản Python, như tôi thấy nó đã không làm việc như nó vốn có (file.read() trả về một đối tượng bất biến , vì vậy bạn không thể chỉ cập nhật một trong các giá trị).

Trả lời

1

Điều gì về việc tách tệp gốc thành ba, sau đó hợp nhất với byte thay thế của bạn ở giữa? Tách nhị phân thành ba phần (bắt đầu -> target-1/target/target + 1 -> end) sau đó sử dụng COPY để hợp nhất các khối đầu và cuối với byte mới của bạn ở giữa.

Tôi chưa bao giờ có thể nhận được DOS (hoặc bất kỳ dấu nhắc lệnh Windows) nào để tách tệp một cách tự nhiên, nhưng tiện ích SPLITS.EXE miễn phí rất tốt và có thể được đưa vào giải pháp của bạn. COPY dĩ nhiên là một lệnh gốc.

tôi không thể tìm thấy một liên kết đến tiện ích ngay bây giờ, nhưng googling cho 'dos ​​miễn phí file được chia nhỏ tiện ích' sản lượng nhiều hits ...

+0

Nhưng ai xác minh rằng * SPLITS.EXE * không bị sửa đổi? Nó cũng có thể là một .exe ngẫu nhiên. – ComFreek

+0

Như ComFreek nói, nếu tôi hạnh phúc để chạy một exe ngẫu nhiên tôi chỉ cần sử dụng GTALauncher.exe mà sửa chữa các tập tin và khởi động GTA :-) – sam

+0

Vâng, cho rằng không có cách nào để làm điều đó trong DOS (ít nhất, không có cách tôi đã từng khám phá ra) bạn sẽ phải gửi một tiện ích trợ giúp với tập lệnh - hoặc chỉ đóng gói giải pháp dưới dạng tệp .exe và gửi đi. Tôi cho rằng sự khác biệt là nếu bạn gửi một tiện ích bên thứ ba có sẵn miễn phí cùng với tập lệnh, nó có thể được so sánh với cùng một tiện ích từ các nguồn khác (hy vọng là có uy tín) trong khi gói .exe tùy chỉnh không thể. –

9

Tôi nghĩ rằng PowerShell là một công cụ hoàn hảo cho nhiệm vụ này.Nó có sẵn cho XP trở lên và được tự động chuyển từ Windows 7:

Chỉ cần tạo một file *.ps với nội dung này:

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

Lưu ý rằng người ta phải cho phép các kịch bản PowerShell unsigned:

  1. Khởi động PowerShell với tư cách quản trị viên

  2. Chạy lệnh này: Set-ExecutionPolicy RemoteSigned


Bạn cũng có thể sử dụng VBScript nhưng kịch bản sẽ hơi lâu hơn vì nó không được thiết kế cho việc đọc tập tin nhị phân (bạn phải sử dụng ADODB.Stream đối tượng).

Dưới đây là tổng hợp các chức năng trợ giúp: http://www.motobit.com/tips/detpg_read-write-binary-files/

+0

Cảm ơn, tôi chưa thử sử dụng PowerShell trước đây. Tôi chỉ thử chạy ví dụ này mặc dù nó không hoạt động - tôi nhận được một cửa sổ PowerShell bật lên (và lấy cắp lấy nét) và sau đó biến mất, liên tục - trong vài phút. Nó không dẫn đến việc thay đổi tập tin. Khi tôi chạy PowerShell trực tiếp và gõ vào các lệnh bạn đề nghị điều này làm việc tốt. Có ai biết cái gì đang xảy ra không? Tôi vẫn chưa thử bật các script chưa ký - nhưng tôi không quá cố gắng cho đến khi tôi biết vấn đề là gì, vì PC của tôi không sử dụng được cho đến khi kịch bản quyết định ngừng chạy. – sam

+0

[cập nhật] Tôi có cùng một vấn đề ngay cả sau khi thiết lập chính sách thực hiện. Tôi thấy điều này nếu tôi chạy từ cmd hoặc từ powershell. – sam

+0

@sam Bạn đang sử dụng phiên bản Windows nào? Bạn có sử dụng các bản cập nhật mới nhất không? Tôi xin lỗi vì hành vi kỳ lạ đó. Đây là một phiên bản mới mà chờ đợi cho các phím bấm trước khi thực hiện mỗi lệnh: http://pastebin.com/5hjHbkBt. Ngoài ra, hãy thử thực thi tập lệnh thông qua * nhấp chuột phải -> Chạy bằng PowerShell * trong Explorer. – ComFreek