Una pregunta interesante. Tengo un problema similar en Linux. Los sistemas de detección de intrusos como OSSEC o tripwire pueden generar falsos positivos si el hash de un ejecutable cambia repentinamente. Esto puede no ser nada peor que el programa de "prelink" de Linux parcheando el archivo ejecutable para arranques más rápidos.
Para comparar dos binarios (en el ELF format), se puede usar el ejecutable "readelf" y luego "diff" para comparar las salidas. Estoy seguro de que hay soluciones refinados, pero sin más preámbulos, comparador de un hombre pobre en 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;
}
Ahora se puede ejecutar, por ejemplo, en la máquina 1:
./checkexe.pl /usr/bin/curl > curl_machine1
Y en la máquina 2 :
./checkexe.pl /usr/bin/curl > curl_machine2
Después de haber copypasted, SFTP-ed o NSF-ed (? no utiliza FTP, ¿verdad) los archivos en la misma FileTree, comparar los archivos:
diff --side-by-side --width=200 curl_machine1 curl_machine2 | less
En mi caso, existen diferencias en la sección ".gnu.conflict", ".gnu.liblist", ".got.plt" y ".dynbss", que podría estar bien para una intervención de "prelink", pero en la sección de código, ".text", que sería un Bad Sign.
Probablemente depende de la plataforma .... – skaffman
Ok, es Linux compilado con GCC. – Luciano