gpt4 book ai didi

comparison - 比较生成可执行文件是否等效

转载 作者:行者123 更新时间:2023-12-04 08:38:36 27 4
gpt4 key购买 nike

我需要比较使用相同的编译器/标志进行编译的2个可执行文件和/或共享对象,并确认它们没有更改。我们在一个受监管的环境中工作,因此对于准确地确定可执行文件的哪些部分已发生更改,对于进行测试非常有用。

由于 header 包含有关文件的信息,因此无法使用MD5Sums/Hashes。

有谁知道一个程序或方法来验证两个文件在执行上是否相同,即使它们是在不同的时间生成的也是如此?

最佳答案

一个有趣的问题。我在linux上也有类似的问题。如果可执行文件的哈希值突然改变,则OSSEC或Tripwire等入侵检测系统可能会产生误报。这可能没有比Linux“预链接”程序修补可执行文件以加快启动速度更糟糕的了。

为了比较两个二进制文件(在ELF format中),可以使用“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”,这将是一个错误的标志。

关于comparison - 比较生成可执行文件是否等效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3231641/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com