我拿了一个小 Perl 程序,这个程序是我前一段时间遇到类似问题时写的,并将其更改为与您的数据相匹配。这应该生成“test:admin”的所有排列,以任何字符作为分隔符,并包括所有缩写(以处理仅从用户名中提取几个字节的情况)。
从 3785a9 开始,我得到了大约 50 个结果,但在 3785a9c6 中没有。因此,这似乎排除了将用户名(的一部分)连接到密码(可能带有分隔符)并计算结果的 MD5 的情况。但当然,他们可能会使用 MD4 或其他产生 16 字节的东西。他们可能首先使用密码对用户进行异或。他们可能会逆向读取 MD5。有很多可能性使找出算法变得更加困难。
如果您可以首先找出哪个二进制文件创建了密码,请尝试对其运行signrch,这可能有助于找到它使用的算法。
如果你想用我的 perl 程序尝试更多的东西,这里是。在 Xeon E5 上的 1 个核心上花费了大约 1 小时。有一些事情可以优化,但我认为花 30 分钟使程序运行速度快 5 分钟没有多大意义。
#!/usr/bin/perl
use Digest::MD5 qw(md5_hex);
use List::Util qw(shuffle);
use strict;
use warnings;
$|=1;
my @admintest=(split("", "admintest"), ":", chr(127));
# my @admintest=(split("", "abc"), ":", chr(127));
my $n=0;
permute("", @admintest);
sub permute {
my $str=shift;
my @letters=@_;
my $str2;
for (my $i=0; $i<=$#letters; $i++) {
if ($letters[$i] eq chr(127)) {
tryseparatorsonstring($str);
return;
}
$str2=$str.$letters[$i];
permute($str2, @letters[0..$i-1], @letters[$i+1..$#letters]);
}
}
print "\n";
sub tryseparatorsonstring {
my $str=shift;
if ($str =~ /:/) {
for (my $sep=0; $sep<128; $sep++) {
my $str2=$str;
$str2=~s/:/chr($sep)/ge;
trystring($str2, $sep);
}
} else {
trystring($str, "");
}
}
sub trystring {
my $str=shift;
my $sep=shift;
my $pass=md5_hex($str);
print "$n\t$str\t$sep\t$pass\n" if $pass =~ /^3785a9/;
if (++$n%1_000_000==0) {
printf "%dM\r", $n/1_000_000;
}
# print "$str\n";
}
exit 0;