Я пытаюсь подписать первые 32 байта моего скомпилированного исполняемого файла подписью версии, скажем «1.2.0», и мне нужно изменить эту подпись в runtime , помня, что :
- это будет сделано самим исполняемым файлом
- исполняемый файл находится на стороне клиента, что означает, что перекомпиляция невозможна
- использование внешнего файла для отслеживания версии вместо кодирования его в самом двоичном файле также не вариант
- решение должно быть независимым от платформы; Мне известно, что Windows / VC позволяет вам создавать версии исполняемого файла с использованием ресурса .rc, но я не знаю эквивалента для Mac (может быть, Info.plist?) И Linux
Решение в моей голове состояло в том, чтобы написать сигнатуру версии в первых или последних 32 байтах двоичного файла (что я пока не выяснил , как это сделать ), а затем я изменю эти байты, когда мне нужно. К сожалению, это не так просто, поскольку я пытаюсь изменить тот же двоичный файл, который я выполняю.
Если вы знаете, как я могу это сделать, или о более чистом / общепринятом решении этой проблемы, я был бы очень признателен. FWIW, приложение представляет собой патчер / лаунчер для игры; Я решил закодировать версию в самом патчере вместо исполняемого файла игры, поскольку хотел бы, чтобы он был автономным и не зависел от цели.
Обновление : из ваших полезных ответов и комментариев я вижу, что возиться с верхним / нижним колонтитулом двоичного файла не так. Но что касается разрешения на запись для работающих пользователей, то игру нужно исправлять тем или иным способом, а файлы игры нужно модифицировать, обойти это невозможно: для обновления игры вам потребуются права администратора.
Я бы предпочел использовать внешний файл для хранения подписи и изменять его при каждом обновлении, но я не понимаю, как я могу защититься от подделки пользователем этого файла: если они испортят номера версий, как я могу определить, какую версию я использую?
Update2 : Спасибо за все ваши ответы и комментарии, по правде говоря, есть два способа сделать это: либо использовать внешний ресурс для отслеживания версии, либо встроить его в двоичный файл основного приложения. Я мог выбрать только 1 ответ на SO, поэтому я сделал тот, с которым я иду, хотя это не единственный. : -)