1
0
mirror of https://github.com/hashcat/hashcat.git synced 2025-08-01 19:38:26 +00:00
hashcat/tools/benchmark_deep.pl
Jens Steube 07395626fa Introduce hashes_init_stage5() and call module_extra_tmp_size() there. At this stage, the self-test hash is initialized and its values can be used.
Remove hard-coded SCRYPT N, R, and P values in modules, except where they are intentionally hardcoded.
Fix a bug that always caused a TMTO value of 1, even when it was not needed.
Respect device_available_mem and device_maxmem_alloc values even if a reliable low-level free memory API is present, and always select the lowest of all available limits.
Fix benchmark_deep.pl mask to avoid UTF-8 rejects.
Improve error messages when the check verifying that all SCRYPT configuration settings across all hashes are identical is triggered.
Also improve the error message shown when the SCRYPT configuration of the self-test hash does not match that of the target hash.
Fix a bug where a low-tuned SCRYPT hash combined with a TMTO could result in fewer than 1024 iterations, which breaks the hard-coded minimum of 1024 iterations in the SCRYPT kernel.
2025-06-15 14:13:48 +02:00

587 lines
7.8 KiB
Perl
Executable File

#!/usr/bin/env perl
##
## Author......: See docs/credits.txt
## License.....: MIT
##
use strict;
use warnings;
my $nvidia_cache = "~/.nv";
my $amd_cache = "~/.AMD";
my $hashcat_path = ".";
my $kernels_cache = "$hashcat_path/kernels";
my $hashcat_bin = "$hashcat_path/hashcat";
my $device = 1;
my $workload_profile = 3;
my $runtime = 24;
my $sleep_sec = 12;
my $default_mask = "?a?a?a?a?a?a?a";
my $result = "result.txt";
my $old_hashcat = 0; # requires to have ran with new hashcat before to create the hashfiles
my $repeats = 0;
my $cpu_benchmark = 0;
print "\nHardware preparations... You may need to adjust some settings and probably can ignore some of the error\n\n";
system ("echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor");
if ($cpu_benchmark == 1)
{
system ("echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo"); ## for CPU benchmark Intel
system ("echo 0 > /sys/devices/system/cpu/cpufreq/boost"); ## for CPU benchmark AMD
}
else
{
system ("rocm-smi --resetprofile --resetclocks --resetfans");
system ("rocm-smi --setfan 100% --setperflevel high");
system ("nvidia-smi -rac");
system ("nvidia-smi -pm ENABLED");
system ("nvidia-smi -acp UNRESTRICTED");
system ("nvidia-smi -pl 225"); ## needs per-gpu adjust
system ("nvidia-settings -a GPUPowerMizerMode=1 -a GPUFanControlState=1 -a GPUTargetFanSpeed=100");
}
print "\n\nStarting...\n\n";
system ("rm -rf $nvidia_cache");
system ("rm -rf $amd_cache");
system ("rm -rf $kernels_cache");
my @hash_types_selection =
(
0,
100,
1400,
1700,
22000,
1000,
3000,
5500,
5600,
1500,
500,
3200,
1800,
7500,
13100,
15300,
15900,
7100,
11600,
12500,
13000,
6241,
13400,
6800,
11300,
);
my @hash_types =
(
0,
20,
50,
60,
100,
120,
150,
160,
200,
300,
400,
500,
600,
900,
1000,
1100,
1300,
1400,
1420,
1450,
1460,
1600,
1600,
1700,
1720,
1750,
1760,
1800,
2100,
2400,
2410,
2611,
2711,
2811,
3000,
3100,
3200,
3710,
3800,
3910,
4010,
4110,
4300,
4400,
4500,
4520,
4700,
4800,
4900,
5100,
5200,
5300,
5400,
5500,
5600,
5800,
6000,
6100,
6211,
6221,
6231,
6241,
6300,
6400,
6500,
6600,
6700,
6800,
6900,
7000,
7100,
7300,
7400,
7500,
7700,
7701,
7800,
7801,
7900,
8000,
8100,
8200,
8300,
8400,
8500,
8600,
8700,
8800,
8900,
9000,
9100,
9400,
9500,
9600,
9700,
9710,
9720,
9800,
9810,
9820,
9900,
10100,
10300,
10400,
10410,
10420,
10500,
10700,
10800,
10900,
11000,
11100,
11200,
11300,
11400,
11500,
11600,
11700,
11750,
11760,
11800,
11850,
11860,
11900,
12000,
12200,
12300,
12400,
12500,
12600,
12700,
12800,
12900,
13000,
13100,
13200,
13300,
13400,
13500,
13600,
13711,
13721,
13731,
13741,
13751,
13761,
13771,
13781,
13800,
13900,
14000,
14100,
14400,
14500,
14700,
14800,
14900,
15000,
15100,
15200,
15300,
15400,
15500,
15600,
15900,
16000,
16100,
16200,
16300,
16400,
16500,
16600,
16700,
16900,
17210,
17300,
17400,
17500,
17600,
17700,
17800,
17900,
18000,
18100,
18200,
18300,
18400,
18500,
18600,
18700,
18800,
18900,
19000,
19100,
19200,
19300,
19500,
19600,
19700,
19800,
19900,
20011,
20012,
20013,
20500,
20510,
20600,
20710,
20800,
20900,
21000,
21100,
21200,
21300,
21400,
21500,
21600,
21700,
21800,
22000,
22100,
22200,
22300,
22400,
22500,
22600,
22700,
22911,
22921,
22931,
22941,
22951,
23001,
23002,
23003,
23100,
23200,
23300,
23400,
23500,
23600,
23700,
23800,
23900,
24100,
24200,
24300,
24410,
24420,
24500,
24600,
24700,
24800,
24900,
25000,
25100,
25200,
25300,
25400,
25500,
25700,
25900,
26000,
26100,
26200,
26300,
26401,
26402,
26403,
26500,
26600,
26700,
26800,
26900,
27000,
27100,
27200,
27300,
27400,
27500,
27600,
27700,
27800,
27900,
28000,
);
if (scalar @ARGV)
{
@hash_types = @ARGV;
}
unlink ($result);
chdir ($hashcat_path);
for my $hash_type (@hash_types)
{
# benchmark always in optimized mode with single hash and mask!
my $mask = $default_mask;
if ($old_hashcat == 0)
{
my $module = get_module ($hash_type);
my $st_hash = $module->{"st_hash"};
my $is_binary = $module->{"is_binary"};
open (OUT, ">", "tmp.hash.$hash_type") or die;
if ($is_binary)
{
print OUT pack ("H*", $st_hash), "\n";
}
else
{
print OUT "$st_hash\n";
}
close (OUT);
$mask = $module->{"mask"};
}
my @command =
(
$hashcat_bin, "-D2",
"--quiet",
"tmp.hash.$hash_type",
"--keep-guessing",
"--self-test-disable",
"--markov-disable",
"--restore-disable",
"--outfile-autohex-disable",
"--wordlist-autohex-disable",
"--potfile-disable",
"--logfile-disable",
"--status",
"--status-timer", 1,
"--runtime", $runtime,
"--machine-readable",
"--optimized-kernel-enable",
"--workload-profile", $workload_profile,
"--hash-type", $hash_type,
"--attack-mode", 3,
$mask
);
if ($cpu_benchmark == 1)
{
push (@command, "--opencl-device-types", 1);
}
else
{
push (@command, "--backend-devices", $device);
}
print "Executing command: ", join (" ", @command), "\n";
my $final_speed = 0;
for (my $i = 0; $i <= $repeats; $i++)
{
printf ("Run #%d\n", $i);
open (IN, "-|", @command, "--runtime", 1);
close (IN);
my $was_slower = 0;
my $speed = 0;
my $sample = 0;
open (IN, "-|", @command);
while (my $line = <IN>)
{
chomp $line;
print "$line\n";
my @data = split "\t", $line;
next unless defined $data[1];
next if ($data[1] != '3');
$sample++;
if ($sample > 5)
{
if ($data[3] > $speed)
{
$speed = $data[3];
}
else
{
$was_slower++;
last if ($was_slower == 3);
}
}
}
close (IN);
sleep ($sleep_sec);
$final_speed = $speed if ($speed > $final_speed);
}
open (OUT, ">>", $result) or die;
print OUT $final_speed, "\n";
close (OUT);
}
sub get_module
{
my $hash_type = shift;
my $st_hash = undef;
my $is_binary = 0;
my $pw_min = -1;
my $pw_max = -1;
my $benchmark_mask = undef;
my $path = sprintf ("src/modules/module_%05d.c", $hash_type);
open (IN, $path) or die;
while (my $line = <IN>)
{
chomp $line;
if ($line =~ /OPTS_TYPE_BINARY_HASHFILE/)
{
if (($hash_type == 22000) || ($hash_type == 22001))
{
## problem while in -m 2500 backward compatibility mode
}
else
{
$is_binary = 1;
}
}
if ($line =~ /ST_HASH *= \"(.*)\"/)
{
$st_hash = $1;
}
if ($line =~ /const u32 pw_min = (\d+);/)
{
$pw_min = $1;
}
if ($line =~ /const u32 pw_max = (\d+);/)
{
$pw_max = $1;
}
if ($line =~ /BENCHMARK_MASK *= \"(.*)\"/)
{
$benchmark_mask = $1;
}
}
close (IN);
my $mask = (defined $benchmark_mask) ? $benchmark_mask : $default_mask;
if ($pw_min != -1)
{
if ($pw_min < 7)
{
$mask = substr ($mask, 0, $pw_min * 2);
}
else
{
my $left = $pw_min - 7;
$mask .= "x" x $left;
}
}
elsif ($pw_max != -1)
{
if ($pw_max < 7)
{
$mask = substr ($mask, 0, $pw_min * 2);
}
}
my $module =
{
"is_binary" => $is_binary,
"st_hash" => $st_hash,
"mask" => $mask,
};
return $module;
}