интересный вопрос.У меня похожая проблема на Linux.Системы обнаружения вторжений, такие как OSSEC или tripwire, могут генерировать ложные срабатывания, если хэш-сумма исполняемого файла внезапно изменяется.Это может быть ничем не хуже, чем программа Linux «prelink», исправляющая исполняемый файл для более быстрого запуска.
Чтобы сравнить два двоичных файла (в формате ELF ), можно использовать "readelf "исполняемый файл" и затем "diff" для сравнения результатов.Я уверен, что есть изысканные решения, но без лишних слов, компаратор бедняков в Perl:
#!/usr/bin/perl -w
$exe = $ARGV[0];
if (!$exe) {
die "Please give name of executable\n"
}
if (! -f $exe) {
die "Executable $exe not found or not a file\n";
}
if (! (`file '$exe'` =~ /\bELF\b.*?\bexecutable\b/)) {
die "file command says '$exe' is not an ELF executable\n";
}
# Identify sections in ELF
@lines = pipeIt("readelf --wide --section-headers '$exe'");
@sections = ();
for my $line (@lines) {
if ($line =~ /^\s*\[\s*(\d+)\s*\]\s+(\S+)/) {
my $secnum = $1;
my $secnam = $2;
print "Found section $1 named $2\n";
push @sections, $secnam;
}
}
# Dump file header
@lines = pipeIt("readelf --file-header --wide '$exe'");
print @lines;
# Dump all interesting section headers
@lines = pipeIt("readelf --all --wide '$exe'");
print @lines;
# Dump individual sections as hexdump
for my $section (@sections) {
@lines = pipeIt("readelf --hex-dump='$section' --wide '$exe'");
print @lines;
}
sub pipeIt {
my($cmd) = @_;
my $fh;
open ($fh,"$cmd |") or die "Could not open pipe from command '$cmd': $!\n";
my @lines = <$fh>;
close $fh or die "Could not close pipe to command '$cmd': $!\n";
return @lines;
}
Теперь вы можете запустить, например, на машине 1:
./checkexe.pl /usr/bin/curl > curl_machine1
И на компьютере 2:
./checkexe.pl /usr/bin/curl > curl_machine2
После копирования, SFTP-или NSF-файлов (вы не используете FTP, не так ли?) Файлы в одном файловом дереве, сравните файлы:
diff --side-by-side --width=200 curl_machine1 curl_machine2 | less
В моем случае различия существуют в разделе ".gnu.conflict", ".gnu.liblist", ".got.plt" и ".dynbss", что может быть хорошо для "предварительной ссылки"вмешательство, но в разделе кода, ".text", который будет плохим знаком.