Сравните двоичные файлы с разными метаданными

358
Alexander

В Windows я хочу сравнить старые двоичные файлы с недавно созданными, чтобы определить, какие файлы были обновлены. Однако, когда я собираю файлы, я даю им новые метаданные (например, версию и т. Д.). Щелкнув правой кнопкой мыши по файлу и перейдя на вкладку «Детали», вы можете увидеть версию файла и другую информацию. Это вызывает сравнения дифференциации. Можно ли обойти это, чтобы проверить, какие файлы равны или нет?

0
Двоичный файл - это упорядоченный поток байтов без какой-либо структуры. Если вы различаете некоторые структурные конструкции (такие как метаданные), вы предполагаете, что есть какая-то структура, тогда как стандартные утилиты, которые сравнивают двоичные файлы, не знают об этом. Таким образом, вы можете создать свой собственный инструмент сравнения, который будет учитывать эту структуру и сравнивать только данные, или, если блок метаданных является статическим (как по положению, так и по размеру), вы можете сравнивать файлы с использованием стандартных утилит и игнорировать разницу в метаданных. адреса. Akina 6 лет назад 0
Единственное отличие действительно в атрибуте версии файла. Таким образом, вместо «3.0.3» это может быть «3.0.3.1». Что касается стандартных утилит, есть ли какие-то конкретные, которые вы подумали и / или порекомендуете? Alexander 6 лет назад 0
* Единственное отличие действительно в атрибуте версии файла. * В двоичных файлах нет никаких атрибутов. В двоичных файлах вообще нет структуры. Как я понимаю, вы используете термин «двоичный» вместо «скомпилированный исполняемый файл» или что-то подобное. Akina 6 лет назад 0
Я говорю о .exe- и .dll-файлах. Alexander 6 лет назад 0
Google для "сравнения двоичных файлов". Это дает вам множество инструментов, которые позволяют вам сделать это. Просто просмотрите различия и игнорируйте изменения метаданных (так как ** вы ** «строите файлы», я полагаю, вы знаете, где расположены метаданные). Jan Doggen 6 лет назад 0

2 ответа на вопрос

0
Alex

Обновление:
я перечитал ваши комментарии, и мне кажется, что вы хотите сравнить информацию о версии из исполняемых файлов и библиотек вместо проверки целостности файлов.

Ну, во-первых, вам нужно понять, что нет таких терминов, как «заголовок метаданных». Исполняемые файлы и библиотеки в Windows имеют концепцию так называемых «ресурсов», которые связаны с окончательным файлом при компиляции / компоновке. Это не требование, поэтому программист может использовать ресурсы или просто пропустить его. В ресурсах файла можно собрать практически все, что угодно: значки, звуки, изображения, вредоносные зашифрованные данные и так далее. В этом же файле ресурсов программист может указать дополнительную текстовую информацию, например, версию файла. Вы должны понимать, что версия файла не продвигается автоматически на некоторых языках, это ручная работа программиста, чтобы изменить версию файла.
Хорошо, давайте вернемся к теме, я думаю, вы хотите сравнить версии файлов между исполняемыми файлами / библиотеками, поэтому вы можете использовать инструмент командной строки для извлечения версии файла из ресурсов с помощью официальной утилиты от Microsoft, sigcheck.exeкоторая является частью очень полезных утилит от Sysinternals Suite . Если вы будете работать sigcheck.exeс исполняемыми файлами, имеющими ресурсы, то эта программа извлечет «метаданные», которые вы упомянули:

Publisher: Company: Description: Product: Prod version: File version: 

Вы можете проанализировать другие поля, которые нужно сравнить с предпочитаемым вами инструментом.

Если вы можете использовать Windows API, вы можете извлекать «метаданные» из ресурсов программным способом, используя FileVersionInfo WinAPI.

Предыдущая догадка:

Поскольку вы упомянули compare old binary files with newly built ones, то лучшим вариантом для вас будет использование систем контроля версий, таких как git или fossil, которые могут отслеживать изменения в двоичных файлах, помимо удобного отслеживания исходных файлов.

Вы также можете сравнить двоичные файлы несколькими способами:

Стандартная diffутилита Unix, которая может сравнивать двоичные файлы, она просто скажет, отличаются они или нет.
( Если у вас Windows 10, вы можете использовать WSL для запуска нативной утилиты Unix )

Существует также, visual binary diffчто работает на обоих, - Windows и Unix.

Утилита Native Window fcтакже может выполнять двоичное сравнение какfc /b file1 file2

Вы можете использовать расширение проводника, которое может вычислять хэш бинарных файлов, например, HashCheck, DirHash или даже использовать Microsoftfciv

Если вы используете Microsoft Visual Studio, вы также можете использовать WinDiff

Для сравнения огромных файлов (в терабайтах) вы можете использовать старый добрый HxD

Однако, хорошо составленный пост, к сожалению, я попробовал некоторые из этих предложений, и все они также сравнивали заголовок, что заставляет его жаловаться на различия. Alexander 6 лет назад 0
Я думаю, что мы говорим о яблоках и апельсинах :) Я обновил свой ответ, это то, что вы хотите? Alex 6 лет назад 0
Уточнение: если я соберу dll с файловой версией 1.0.0.1 и соберу ее как file.dll. Затем измените версию файла на 1.0.0.2, соберите ее и поместите в другую папку. Я хочу знать, равны ли данные (которые они в этом случае). Я обнаружил, что могу изменить версию файла, изменив его буфер с помощью программы StampVer, чтобы получить одинаковые версии файлов для обоих файлов, а затем приступить к проверке, равны ли они. Тем не менее, StampVer не может обрабатывать небольшие версии, такие как «2.4», так как он ожидает только четыре ввода типа: «2.4.0.0». Это перезапишет буфер. Alexander 6 лет назад 0
«Я хочу знать, равны ли данные» - о каких данных вы говорите ??? Что такое "буфер"? Если вы создаете себе dll-файл, это все в вашем исходном коде или вы пытаетесь взломать некоторые dll-файлы с помощью таких инструментов, как StampVer? Пожалуйста, уточните, что именно делаете. Вы используете общее слово, такое как «build», которое обычно называется - build file из исходного кода, но я думаю, у вас есть свое особое значение в этом отношении. Alex 6 лет назад 0
Я хочу знать, есть ли какие-либо изменения в моем исходном коде или они остаются неизменными после итераций версий. Данные (это «программа», которую я написал). Буфер, на который я ссылаюсь, - это просто «объем данных, выделяемых для ресурсов». Если бы строка имела 3 символа ранее, очевидно, что все сломалось бы, если было установлено 8 символов. В любом случае, StampVer - это объезд, но я хочу сказать, что если версия файла одинакова. Тогда файлы будут равны и, следовательно, будут пригодны для сравнения с байтовыми или хеш-сравнениями. Alexander 6 лет назад 0
@ Александр Не поймите меня неправильно, но у вас действительно необычный рабочий процесс. Исходный код только использует ресурсы, но фактические ресурсы отделены от исходного кода. Если вы изменили данные в ресурсах, это не повлияет на ваш исходный код. Я не знаю, на каком языке мы говорим, но нет таких терминов, как буфер для ресурсов. На классических языках ресурсы указываются в файлах `* .rc` без каких-либо буферов. Чтобы компоновщик знал только, как он будет комбинировать ваш скомпилированный код с ресурсами вместе. Вы не должны ничего менять вручную в скомпилированном коде, особенно с такими инструментами, как StampVer. Alex 6 лет назад 0
@Alexander Когда вы используете `StampVer`, вы буквально исправляете двоичное содержимое файла в том месте, где находится информация о версии, это никак не влияет на ваш реальный код. Такие инструменты обычно используются в средах, где IDE не имеет функции автоматического увеличения версии при каждой компиляции. Я до сих пор не могу понять, почему ты это делаешь. Используйте соответствующие инструменты, такие как `git`,` fossil`, чтобы отслеживать все ваши изменения, которые могут отслеживать все, исходный код, ресурсы и даже скомпилированные файлы. Alex 6 лет назад 0
0
Mr. Mendelli

Дайте Ангусу Джонсону Ресурсный Хакер попробовать. Этот бесплатный инструмент позволит вам просматривать (и даже редактировать) таблицы ресурсов в данном исполняемом файле, если PE или библиотека были скомпилированы с Version Infoресурсом. Помните, что вы не сможете просматривать или редактировать файлы ресурсов в запутанном двоичном файле.

Это приложение, вероятно, подходит для того, что я спросил, когда я пролистал его. Хотя, как указала Алекс, это действительно неправильный путь в качестве рабочего процесса. Я закрою этот вопрос и перефразирую его во что-то лучшее, поскольку это неправильно решает проблему ядра. Alexander 6 лет назад 1