X-Git-Url: https://www.flypig.org.uk/git/?a=blobdiff_plain;f=src%2Fhashcat.c;h=b147aee33528f9a7204676113c449fbef247c853;hb=79d02466afff08a335708f97e9509cc332ebd820;hp=8e661497842eb31c8656b9f6ca45f089d51d0373;hpb=fd3813f279f3f73d8fcea99ad4c059ff4c5e96b7;p=hashcat.git diff --git a/src/hashcat.c b/src/hashcat.c index 8e66149..b147aee 100644 --- a/src/hashcat.c +++ b/src/hashcat.c @@ -75,9 +75,10 @@ double TARGET_MS_PROFILE[4] = { 2, 12, 96, 480 }; #define SEPARATOR ':' #define BITMAP_MIN 16 #define BITMAP_MAX 24 +#define NVIDIA_SPIN_DAMP 100 #define GPU_TEMP_DISABLE 0 #define GPU_TEMP_ABORT 90 -#define GPU_TEMP_RETAIN 0 +#define GPU_TEMP_RETAIN 65 #define WORKLOAD_PROFILE 2 #define KERNEL_ACCEL 0 #define KERNEL_LOOPS 0 @@ -417,6 +418,7 @@ const char *USAGE_BIG[] = " -w, --workload-profile | Num | Enable a specific workload profile, see pool below | -w 3", " -n, --kernel-accel | Num | Manual workload tuning, set outerloop step size to X | -n 64", " -u, --kernel-loops | Num | Manual workload tuning, set innerloop step size to X | -u 256", + " --nvidia-spin-damp | Num | Workaround NVidias CPU burning loop bug, in percent | --nvidia-spin-damp=50", " --gpu-temp-disable | | Disable temperature and fanspeed reads and triggers |", #ifdef HAVE_HWMON " --gpu-temp-abort | Num | Abort if GPU temperature reaches X degrees celsius | --gpu-temp-abort=100", @@ -1751,7 +1753,14 @@ static void status_benchmark () format_speed_display (hashes_dev_ms[device_id] * 1000, display_dev_cur, sizeof (display_dev_cur)); - log_info ("Speed.Dev.#%d.: %9sH/s (%0.2fms)", device_id + 1, display_dev_cur, exec_all_ms[device_id]); + if (data.devices_active >= 10) + { + log_info ("Speed.Dev.#%d: %9sH/s (%0.2fms)", device_id + 1, display_dev_cur, exec_all_ms[device_id]); + } + else + { + log_info ("Speed.Dev.#%d.: %9sH/s (%0.2fms)", device_id + 1, display_dev_cur, exec_all_ms[device_id]); + } } char display_all_cur[16] = { 0 }; @@ -1833,6 +1842,26 @@ static void generate_cached_kernel_amp_filename (const uint attack_kern, char *p snprintf (cached_file, 255, "%s/kernels/amp_a%d.%s.kernel", profile_dir, attack_kern, device_name_chksum); } +static char *filename_from_filepath (char *filepath) +{ + char *ptr = NULL; + + if ((ptr = strrchr (filepath, '/')) != NULL) + { + ptr++; + } + else if ((ptr = strrchr (filepath, '\\')) != NULL) + { + ptr++; + } + else + { + ptr = filepath; + } + + return ptr; +} + static uint convert_from_hex (char *line_buf, const uint line_len) { if (line_len & 1) return (line_len); // not in hex @@ -2247,14 +2276,14 @@ static void check_cracked (hc_device_param_t *device_param, const uint salt_pos) uint cpt_cracked = 0; + hc_thread_mutex_lock (mux_display); + for (uint i = 0; i < num_cracked; i++) { const uint hash_pos = cracked[i].hash_pos; if (data.digests_shown[hash_pos] == 1) continue; - hc_thread_mutex_lock (mux_display); - if ((data.opts_type & OPTS_TYPE_PT_NEVERCRACK) == 0) { data.digests_shown[hash_pos] = 1; @@ -2275,11 +2304,11 @@ static void check_cracked (hc_device_param_t *device_param, const uint salt_pos) if (data.salts_done == data.salts_cnt) data.devices_status = STATUS_CRACKED; - hc_thread_mutex_unlock (mux_display); - check_hash (device_param, &cracked[i]); } + hc_thread_mutex_unlock (mux_display); + myfree (cracked); if (cpt_cracked > 0) @@ -2315,9 +2344,46 @@ static void check_cracked (hc_device_param_t *device_param, const uint salt_pos) } } +// stolen from princeprocessor ;) + +typedef struct +{ + FILE *fp; + + char buf[BUFSIZ]; + int len; + +} out_t; + +static void out_flush (out_t *out) +{ + fwrite (out->buf, 1, out->len, out->fp); + + out->len = 0; +} + +static void out_push (out_t *out, const u8 *pw_buf, const int pw_len) +{ + char *ptr = out->buf + out->len; + + memcpy (ptr, pw_buf, pw_len); + + ptr[pw_len] = '\n'; + + out->len += pw_len + 1; + + if (out->len >= BUFSIZ - 100) + { + out_flush (out); + } +} + static void process_stdout (hc_device_param_t *device_param, const uint pws_cnt) { - char out_buf[HCBUFSIZ] = { 0 }; + out_t out; + + out.fp = stdout; + out.len = 0; uint plain_buf[16] = { 0 }; @@ -2350,7 +2416,7 @@ static void process_stdout (hc_device_param_t *device_param, const uint pws_cnt) if (plain_len > data.pw_max) plain_len = data.pw_max; - format_output (stdout, out_buf, plain_ptr, plain_len, 0, NULL, 0); + out_push (&out, plain_ptr, plain_len); } } } @@ -2392,7 +2458,7 @@ static void process_stdout (hc_device_param_t *device_param, const uint pws_cnt) if (plain_len > data.pw_max) plain_len = data.pw_max; } - format_output (stdout, out_buf, plain_ptr, plain_len, 0, NULL, 0); + out_push (&out, plain_ptr, plain_len); } } } @@ -2416,7 +2482,7 @@ static void process_stdout (hc_device_param_t *device_param, const uint pws_cnt) plain_len = data.css_cnt; - format_output (stdout, out_buf, plain_ptr, plain_len, 0, NULL, 0); + out_push (&out, plain_ptr, plain_len); } } } @@ -2446,7 +2512,7 @@ static void process_stdout (hc_device_param_t *device_param, const uint pws_cnt) plain_len += start + stop; - format_output (stdout, out_buf, plain_ptr, plain_len, 0, NULL, 0); + out_push (&out, plain_ptr, plain_len); } } } @@ -2478,10 +2544,12 @@ static void process_stdout (hc_device_param_t *device_param, const uint pws_cnt) plain_len += start + stop; - format_output (stdout, out_buf, plain_ptr, plain_len, 0, NULL, 0); + out_push (&out, plain_ptr, plain_len); } } } + + out_flush (&out); } static void save_hash () @@ -2641,15 +2709,18 @@ static void run_kernel (const uint kern_run, hc_device_param_t *device_param, co hc_clFlush (data.ocl, device_param->command_queue); - if (data.devices_status == STATUS_RUNNING) + if (device_param->nvidia_spin_damp) { - if (iteration < EXPECTED_ITERATIONS) + if (data.devices_status == STATUS_RUNNING) { - switch (kern_run) + if (iteration < EXPECTED_ITERATIONS) { - case KERN_RUN_1: if (device_param->exec_us_prev1[iteration]) usleep (device_param->exec_us_prev1[iteration]); break; - case KERN_RUN_2: if (device_param->exec_us_prev2[iteration]) usleep (device_param->exec_us_prev2[iteration]); break; - case KERN_RUN_3: if (device_param->exec_us_prev3[iteration]) usleep (device_param->exec_us_prev3[iteration]); break; + switch (kern_run) + { + case KERN_RUN_1: if (device_param->exec_us_prev1[iteration]) usleep (device_param->exec_us_prev1[iteration] * device_param->nvidia_spin_damp); break; + case KERN_RUN_2: if (device_param->exec_us_prev2[iteration]) usleep (device_param->exec_us_prev2[iteration] * device_param->nvidia_spin_damp); break; + case KERN_RUN_3: if (device_param->exec_us_prev3[iteration]) usleep (device_param->exec_us_prev3[iteration] * device_param->nvidia_spin_damp); break; + } } } } @@ -3347,8 +3418,8 @@ static void autotune (hc_device_param_t *device_param) { clear_prompt (); - log_info ("Device #%u: autotuned kernel-accel to %u\n" - "Device #%u: autotuned kernel-loops to %u\n", + log_info ("- Device #%u: autotuned kernel-accel to %u\n" + "- Device #%u: autotuned kernel-loops to %u\n", device_param->device_id + 1, kernel_accel, device_param->device_id + 1, kernel_loops); @@ -4230,7 +4301,13 @@ static void *thread_monitor (void *p) } else if (device_param->device_vendor_id == VENDOR_ID_NV) { + #ifdef WIN + hm_set_fanspeed_with_device_id_nvapi (device_id, fan_speed_new, 1); + #endif + #ifdef LINUX + hm_set_fanspeed_with_device_id_xnvctrl (device_id, fan_speed_new); + #endif } fan_speed_chgd[device_id] = 1; @@ -5808,6 +5885,7 @@ int main (int argc, char **argv) uint workload_profile = WORKLOAD_PROFILE; uint kernel_accel = KERNEL_ACCEL; uint kernel_loops = KERNEL_LOOPS; + uint nvidia_spin_damp = NVIDIA_SPIN_DAMP; uint gpu_temp_disable = GPU_TEMP_DISABLE; #ifdef HAVE_HWMON uint gpu_temp_abort = GPU_TEMP_ABORT; @@ -5886,6 +5964,7 @@ int main (int argc, char **argv) #define IDX_WORKLOAD_PROFILE 'w' #define IDX_KERNEL_ACCEL 'n' #define IDX_KERNEL_LOOPS 'u' + #define IDX_NVIDIA_SPIN_DAMP 0xff79 #define IDX_GPU_TEMP_DISABLE 0xff29 #define IDX_GPU_TEMP_ABORT 0xff30 #define IDX_GPU_TEMP_RETAIN 0xff31 @@ -5965,6 +6044,7 @@ int main (int argc, char **argv) {"workload-profile", required_argument, 0, IDX_WORKLOAD_PROFILE}, {"kernel-accel", required_argument, 0, IDX_KERNEL_ACCEL}, {"kernel-loops", required_argument, 0, IDX_KERNEL_LOOPS}, + {"nvidia-spin-damp", required_argument, 0, IDX_NVIDIA_SPIN_DAMP}, {"gpu-temp-disable", no_argument, 0, IDX_GPU_TEMP_DISABLE}, #ifdef HAVE_HWMON {"gpu-temp-abort", required_argument, 0, IDX_GPU_TEMP_ABORT}, @@ -6184,6 +6264,7 @@ int main (int argc, char **argv) uint runtime_chgd = 0; uint kernel_loops_chgd = 0; uint kernel_accel_chgd = 0; + uint nvidia_spin_damp_chgd = 0; uint attack_mode_chgd = 0; uint outfile_format_chgd = 0; uint rp_gen_seed_chgd = 0; @@ -6272,6 +6353,8 @@ int main (int argc, char **argv) kernel_accel_chgd = 1; break; case IDX_KERNEL_LOOPS: kernel_loops = atoi (optarg); kernel_loops_chgd = 1; break; + case IDX_NVIDIA_SPIN_DAMP: nvidia_spin_damp = atoi (optarg); + nvidia_spin_damp_chgd = 1; break; case IDX_GPU_TEMP_DISABLE: gpu_temp_disable = 1; break; #ifdef HAVE_HWMON case IDX_GPU_TEMP_ABORT: gpu_temp_abort = atoi (optarg); break; @@ -6324,9 +6407,6 @@ int main (int argc, char **argv) { log_info ("%s (%s) starting in benchmark-mode...", PROGNAME, VERSION_TAG); log_info (""); - log_info ("Note: Reported benchmark cracking speed = real cracking speed"); - log_info ("To verify, run hashcat like this: only_one_hash.txt -a 3 -w 3 ?b?b?b?b?b?b?b"); - log_info (""); } else { @@ -6417,7 +6497,7 @@ int main (int argc, char **argv) { if (outfile_format > 1) { - log_error ("ERROR: Mixing outfile-format > 1 is not allowed together with left parameter"); + log_error ("ERROR: Mixing outfile-format > 1 with left parameter is not allowed"); return (-1); } @@ -6434,7 +6514,7 @@ int main (int argc, char **argv) { if ((outfile_format > 7) && (outfile_format < 16)) { - log_error ("ERROR: Mixing outfile-format > 7 is not allowed together with show parameter"); + log_error ("ERROR: Mixing outfile-format > 7 with show parameter is not allowed"); return (-1); } @@ -6464,21 +6544,21 @@ int main (int argc, char **argv) if ((increment == 1) && (attack_mode == ATTACK_MODE_STRAIGHT)) { - log_error ("ERROR: increment is not allowed in attack-mode 0"); + log_error ("ERROR: Increment is not allowed in attack-mode 0"); return (-1); } if ((increment == 0) && (increment_min_chgd == 1)) { - log_error ("ERROR: increment-min is only supported together with increment switch"); + log_error ("ERROR: Increment-min is only supported combined with increment switch"); return (-1); } if ((increment == 0) && (increment_max_chgd == 1)) { - log_error ("ERROR: increment-max is only supported together with increment switch"); + log_error ("ERROR: Increment-max is only supported combined with increment switch"); return (-1); } @@ -6511,8 +6591,8 @@ int main (int argc, char **argv) { if (force == 0) { - log_info ("The manual use of the option -n (or --kernel-accel) is outdated"); - log_info ("Please consider using the option -w instead"); + log_info ("The manual use of the -n option (or --kernel-accel) is outdated"); + log_info ("Please consider using the -w option instead"); log_info ("You can use --force to override this but do not post error reports if you do so"); log_info (""); @@ -6538,8 +6618,8 @@ int main (int argc, char **argv) { if (force == 0) { - log_info ("The manual use of the option -u (or --kernel-loops) is outdated"); - log_info ("Please consider using the option -w instead"); + log_info ("The manual use of the -u option (or --kernel-loops) is outdated"); + log_info ("Please consider using the -w option instead"); log_info ("You can use --force to override this but do not post error reports if you do so"); log_info (""); @@ -6698,13 +6778,13 @@ int main (int argc, char **argv) { if (show == 1) { - log_error ("ERROR: Mixing show parameter not supported with keyspace parameter"); + log_error ("ERROR: Combining show parameter with keyspace parameter is not allowed"); return (-1); } else if (left == 1) { - log_error ("ERROR: Mixing left parameter not supported wiht keyspace parameter"); + log_error ("ERROR: Combining left parameter with keyspace parameter is not allowed"); return (-1); } @@ -6736,6 +6816,8 @@ int main (int argc, char **argv) kernel_loops = 1024; force = 1; outfile_check_timer = 0; + session = "stdout"; + opencl_vector_width = 1; } if (remove_timer_chgd == 1) @@ -6830,6 +6912,14 @@ int main (int argc, char **argv) weak_hash_threshold = 0; } + if (nvidia_spin_damp > 100) + { + log_error ("ERROR: setting --nvidia-spin-damp must be between 0 and 100 (inclusive)"); + + return (-1); + } + + /** * induction directory */ @@ -7091,6 +7181,7 @@ int main (int argc, char **argv) logfile_top_uint (force); logfile_top_uint (kernel_accel); logfile_top_uint (kernel_loops); + logfile_top_uint (nvidia_spin_damp); logfile_top_uint (gpu_temp_disable); #ifdef HAVE_HWMON logfile_top_uint (gpu_temp_abort); @@ -7210,6 +7301,7 @@ int main (int argc, char **argv) restore_disable = 1; potfile_disable = 1; weak_hash_threshold = 0; + nvidia_spin_damp = 0; gpu_temp_disable = 1; outfile_check_timer = 0; @@ -7994,27 +8086,6 @@ int main (int argc, char **argv) dgst_pos3 = 1; break; - case 190: hash_type = HASH_TYPE_SHA1; - salt_type = SALT_TYPE_NONE; - attack_exec = ATTACK_EXEC_INSIDE_KERNEL; - opts_type = OPTS_TYPE_PT_GENERATE_BE - | OPTS_TYPE_PT_ADD80 - | OPTS_TYPE_PT_ADDBITS15; - kern_type = KERN_TYPE_SHA1_LINKEDIN; - dgst_size = DGST_SIZE_4_5; - parse_func = sha1linkedin_parse_hash; - sort_by_digest = sort_by_digest_4_5; - opti_type = OPTI_TYPE_ZERO_BYTE - | OPTI_TYPE_PRECOMPUTE_INIT - | OPTI_TYPE_EARLY_SKIP - | OPTI_TYPE_NOT_ITERATED - | OPTI_TYPE_NOT_SALTED; - dgst_pos0 = 0; - dgst_pos1 = 4; - dgst_pos2 = 3; - dgst_pos3 = 2; - break; - case 200: hash_type = HASH_TYPE_MYSQL; salt_type = SALT_TYPE_NONE; attack_exec = ATTACK_EXEC_INSIDE_KERNEL; @@ -8659,7 +8730,7 @@ int main (int argc, char **argv) salt_type = SALT_TYPE_NONE; attack_exec = ATTACK_EXEC_INSIDE_KERNEL; opts_type = OPTS_TYPE_PT_GENERATE_LE; - kern_type = 0; + kern_type = KERN_TYPE_STDOUT; dgst_size = DGST_SIZE_4_4; parse_func = NULL; sort_by_digest = NULL; @@ -11841,7 +11912,7 @@ int main (int argc, char **argv) if (hash_fmt_error) { - log_info ("WARNING: failed to parse hashes using the '%s' format", strhlfmt (hashlist_format)); + log_info ("WARNING: Failed to parse hashes using the '%s' format", strhlfmt (hashlist_format)); } else { @@ -12138,7 +12209,7 @@ int main (int argc, char **argv) if (parser_status < PARSER_GLOBAL_ZERO) { - log_info ("WARNING: Hashfile '%s' in line %u (%s): %s", data.hashfile, line_num, line_buf, strparser (parser_status)); + log_info ("WARNING: Hashfile '%s' on line %u (%s): %s", data.hashfile, line_num, line_buf, strparser (parser_status)); continue; } @@ -12151,7 +12222,7 @@ int main (int argc, char **argv) if (parser_status < PARSER_GLOBAL_ZERO) { - log_info ("WARNING: Hashfile '%s' in line %u (%s): %s", data.hashfile, line_num, line_buf, strparser (parser_status)); + log_info ("WARNING: Hashfile '%s' on line %u (%s): %s", data.hashfile, line_num, line_buf, strparser (parser_status)); continue; } @@ -12173,7 +12244,7 @@ int main (int argc, char **argv) if (parser_status < PARSER_GLOBAL_ZERO) { - log_info ("WARNING: Hashfile '%s' in line %u (%s): %s", data.hashfile, line_num, line_buf, strparser (parser_status)); + log_info ("WARNING: Hashfile '%s' on line %u (%s): %s", data.hashfile, line_num, line_buf, strparser (parser_status)); continue; } @@ -12192,7 +12263,7 @@ int main (int argc, char **argv) if (parser_status < PARSER_GLOBAL_ZERO) { - log_info ("WARNING: Hashfile '%s' in line %u (%s): %s", data.hashfile, line_num, line_buf, strparser (parser_status)); + log_info ("WARNING: Hashfile '%s' on line %u (%s): %s", data.hashfile, line_num, line_buf, strparser (parser_status)); continue; } @@ -13416,14 +13487,14 @@ int main (int argc, char **argv) if (result == -1) { - log_info ("WARNING: Skipping invalid or unsupported rule in file %s in line %u: %s", rp_file, rule_line, rule_buf); + log_info ("WARNING: Skipping invalid or unsupported rule in file %s on line %u: %s", rp_file, rule_line, rule_buf); continue; } if (cpu_rule_to_kernel_rule (rule_buf, rule_len, &kernel_rules_buf[kernel_rules_cnt]) == -1) { - log_info ("WARNING: Cannot convert rule for use on device in file %s in line %u: %s", rp_file, rule_line, rule_buf); + log_info ("WARNING: Cannot convert rule for use on device in file %s on line %u: %s", rp_file, rule_line, rule_buf); memset (&kernel_rules_buf[kernel_rules_cnt], 0, sizeof (kernel_rule_t)); // needs to be cleared otherwise we could have some remaining data @@ -13590,14 +13661,13 @@ int main (int argc, char **argv) } } - /** - * OpenCL device types: - * In case the user did not specify --opencl-device-types and the user runs hashcat in a system with only a CPU only he probably want to use that CPU. - * In such a case, automatically enable CPU device type support, since it's disabled by default. - */ - if (opencl_device_types == NULL) { + /** + * OpenCL device types: + * In case the user did not specify --opencl-device-types and the user runs hashcat in a system with only a CPU only he probably want to use that CPU. + */ + cl_device_type device_types_all = 0; for (uint platform_id = 0; platform_id < platforms_cnt; platform_id++) @@ -13620,19 +13690,33 @@ int main (int argc, char **argv) } } + // In such a case, automatically enable CPU device type support, since it's disabled by default. + if ((device_types_all & (CL_DEVICE_TYPE_GPU | CL_DEVICE_TYPE_ACCELERATOR)) == 0) { device_types_filter |= CL_DEVICE_TYPE_CPU; } + + // In another case, when the user uses --stdout, using CPU devices is much faster to setup + // If we have a CPU device, force it to be used + + if (stdout_flag == 1) + { + if (device_types_all & CL_DEVICE_TYPE_CPU) + { + device_types_filter = CL_DEVICE_TYPE_CPU; + } + } } /** * OpenCL devices: simply push all devices from all platforms into the same device array */ - int need_adl = 0; - int need_nvapi = 0; - int need_nvml = 0; + int need_adl = 0; + int need_nvapi = 0; + int need_nvml = 0; + int need_xnvctrl = 0; hc_device_param_t *devices_param = (hc_device_param_t *) mycalloc (DEVICES_MAX, sizeof (hc_device_param_t)); @@ -13644,8 +13728,6 @@ int main (int argc, char **argv) for (uint platform_id = 0; platform_id < platforms_cnt; platform_id++) { - if ((opencl_platforms_filter & (1 << platform_id)) == 0) continue; - cl_platform_id platform = platforms[platform_id]; hc_clGetDeviceIDs (data.ocl, platform, CL_DEVICE_TYPE_ALL, DEVICES_MAX, platform_devices, &platform_devices_cnt); @@ -13697,6 +13779,32 @@ int main (int argc, char **argv) platform_vendor_id = VENDOR_ID_GENERIC; } + const uint platform_skipped = ((opencl_platforms_filter & (1 << platform_id)) == 0); + + if ((benchmark == 1 || quiet == 0) && (algorithm_pos == 0)) + { + if (machine_readable == 0) + { + if (platform_skipped == 0) + { + const int len = log_info ("OpenCL Platform #%u: %s", platform_id + 1, platform_vendor); + + char line[256] = { 0 }; + + for (int i = 0; i < len; i++) line[i] = '='; + + log_info (line); + } + else + { + log_info ("OpenCL Platform #%u: %s, skipped", platform_id + 1, platform_vendor); + log_info (""); + } + } + } + + if (platform_skipped == 1) continue; + for (uint platform_devices_id = 0; platform_devices_id < platform_devices_cnt; platform_devices_id++) { size_t param_value_size = 0; @@ -13890,7 +13998,7 @@ int main (int argc, char **argv) if (device_endian_little == CL_FALSE) { - log_info ("Device #%u: WARNING: not little endian device", device_id + 1); + log_info ("- Device #%u: WARNING: Not a little endian device", device_id + 1); device_param->skipped = 1; } @@ -13903,7 +14011,7 @@ int main (int argc, char **argv) if (device_available == CL_FALSE) { - log_info ("Device #%u: WARNING: device not available", device_id + 1); + log_info ("- Device #%u: WARNING: Device not available", device_id + 1); device_param->skipped = 1; } @@ -13916,7 +14024,7 @@ int main (int argc, char **argv) if (device_compiler_available == CL_FALSE) { - log_info ("Device #%u: WARNING: device no compiler available", device_id + 1); + log_info ("- Device #%u: WARNING: No compiler available for device", device_id + 1); device_param->skipped = 1; } @@ -13929,7 +14037,7 @@ int main (int argc, char **argv) if ((device_execution_capabilities & CL_EXEC_KERNEL) == 0) { - log_info ("Device #%u: WARNING: device does not support executing kernels", device_id + 1); + log_info ("- Device #%u: WARNING: Device does not support executing kernels", device_id + 1); device_param->skipped = 1; } @@ -13946,14 +14054,14 @@ int main (int argc, char **argv) if (strstr (device_extensions, "base_atomics") == 0) { - log_info ("Device #%u: WARNING: device does not support base atomics", device_id + 1); + log_info ("- Device #%u: WARNING: Device does not support base atomics", device_id + 1); device_param->skipped = 1; } if (strstr (device_extensions, "byte_addressable_store") == 0) { - log_info ("Device #%u: WARNING: device does not support byte addressable store", device_id + 1); + log_info ("- Device #%u: WARNING: Device does not support byte addressable store", device_id + 1); device_param->skipped = 1; } @@ -13968,7 +14076,7 @@ int main (int argc, char **argv) if (device_local_mem_size < 32768) { - log_info ("Device #%u: WARNING: device local mem size is too small", device_id + 1); + log_info ("- Device #%u: WARNING: Device local mem size is too small", device_id + 1); device_param->skipped = 1; } @@ -13987,8 +14095,8 @@ int main (int argc, char **argv) { if (algorithm_pos == 0) { - log_info ("Device #%u: WARNING: not native intel opencl runtime, expect massive speed loss", device_id + 1); - log_info (" You can use --force to override this but do not post error reports if you do so"); + log_info ("- Device #%u: WARNING: Not a native Intel OpenCL runtime, expect massive speed loss", device_id + 1); + log_info (" You can use --force to override this but do not post error reports if you do so"); } device_param->skipped = 1; @@ -14042,7 +14150,11 @@ int main (int argc, char **argv) { need_nvml = 1; - #ifdef _WIN + #ifdef LINUX + need_xnvctrl = 1; + #endif + + #ifdef WIN need_nvapi = 1; #endif } @@ -14098,6 +14210,29 @@ int main (int argc, char **argv) device_param->sm_minor = sm_minor; device_param->sm_major = sm_major; + + // CPU burning loop damper + // Value is given as number between 0-100 + // By default 100% + + device_param->nvidia_spin_damp = (double) nvidia_spin_damp; + + if (nvidia_spin_damp_chgd == 0) + { + if (data.attack_mode == ATTACK_MODE_STRAIGHT) + { + /** + * the workaround is not a friend of rule based attacks + * the words from the wordlist combined with fast and slow rules cause + * fluctuations which cause inaccurate wait time estimations + * using a reduced damping percentage almost compensates this + */ + + device_param->nvidia_spin_damp = 64; + } + } + + device_param->nvidia_spin_damp /= 100; } else { @@ -14115,7 +14250,7 @@ int main (int argc, char **argv) { if (device_param->skipped == 0) { - log_info ("Device #%u: %s, %lu/%lu MB allocatable, %uMCU", + log_info ("- Device #%u: %s, %lu/%lu MB allocatable, %uMCU", device_id + 1, device_name, (unsigned int) (device_maxmem_alloc / 1024 / 1024), @@ -14124,7 +14259,7 @@ int main (int argc, char **argv) } else { - log_info ("Device #%u: %s, skipped", + log_info ("- Device #%u: %s, skipped", device_id + 1, device_name); } @@ -14161,8 +14296,8 @@ int main (int argc, char **argv) if (catalyst_broken == 1) { log_info (""); - log_info ("ATTENTION! The installed catalyst driver in your system is known to be broken!"); - log_info ("It will pass over cracked hashes and does not report them as cracked"); + log_info ("ATTENTION! The Catalyst driver installed on your system is known to be broken!"); + log_info ("It passes over cracked hashes and will not report them as cracked"); log_info ("You are STRONGLY encouraged not to use it"); log_info ("You can use --force to override this but do not post error reports if you do so"); log_info (""); @@ -14173,8 +14308,8 @@ int main (int argc, char **argv) if (catalyst_warn == 1) { log_info (""); - log_info ("ATTENTION! Unsupported or incorrect installed catalyst driver detected!"); - log_info ("You are STRONGLY encouraged to use the official supported catalyst driver for good reasons"); + log_info ("ATTENTION! Unsupported or incorrectly installed Catalyst driver detected!"); + log_info ("You are STRONGLY encouraged to use the official supported catalyst driver"); log_info ("See hashcat's homepage for official supported catalyst drivers"); #ifdef _WIN log_info ("Also see: http://hashcat.net/wiki/doku.php?id=upgrading_amd_drivers_how_to"); @@ -14189,8 +14324,8 @@ int main (int argc, char **argv) { if (device_param->kernel_exec_timeout != 0) { - if (data.quiet == 0) log_info ("Device #%u: WARNING! Kernel exec timeout is not disabled, it might cause you errors of code 702", device_id + 1); - if (data.quiet == 0) log_info (" See the wiki on how to disable it: https://hashcat.net/wiki/doku.php?id=timeout_patch"); + if (data.quiet == 0) log_info ("- Device #%u: WARNING! Kernel exec timeout is not disabled, it might cause you errors of code 702", device_id + 1); + if (data.quiet == 0) log_info (" See the wiki on how to disable it: https://hashcat.net/wiki/doku.php?id=timeout_patch"); } } } @@ -14279,6 +14414,14 @@ int main (int argc, char **argv) devices_cnt++; } + + if ((benchmark == 1 || quiet == 0) && (algorithm_pos == 0)) + { + if (machine_readable == 0) + { + log_info (""); + } + } } if (keyspace == 0 && devices_active == 0) @@ -14306,32 +14449,27 @@ int main (int argc, char **argv) data.devices_active = devices_active; - if ((benchmark == 1 || quiet == 0) && (algorithm_pos == 0)) - { - if (machine_readable == 0) - { - log_info (""); - } - } - /** * HM devices: init */ #ifdef HAVE_HWMON - hm_attrs_t hm_adapters_adl[DEVICES_MAX] = { { 0 } }; - hm_attrs_t hm_adapters_nvapi[DEVICES_MAX] = { { 0 } }; - hm_attrs_t hm_adapters_nvml[DEVICES_MAX] = { { 0 } }; + hm_attrs_t hm_adapters_adl[DEVICES_MAX] = { { 0 } }; + hm_attrs_t hm_adapters_nvapi[DEVICES_MAX] = { { 0 } }; + hm_attrs_t hm_adapters_nvml[DEVICES_MAX] = { { 0 } }; + hm_attrs_t hm_adapters_xnvctrl[DEVICES_MAX] = { { 0 } }; if (gpu_temp_disable == 0) { - ADL_PTR *adl = (ADL_PTR *) mymalloc (sizeof (ADL_PTR)); - NVAPI_PTR *nvapi = (NVAPI_PTR *) mymalloc (sizeof (NVAPI_PTR)); - NVML_PTR *nvml = (NVML_PTR *) mymalloc (sizeof (NVML_PTR)); + ADL_PTR *adl = (ADL_PTR *) mymalloc (sizeof (ADL_PTR)); + NVAPI_PTR *nvapi = (NVAPI_PTR *) mymalloc (sizeof (NVAPI_PTR)); + NVML_PTR *nvml = (NVML_PTR *) mymalloc (sizeof (NVML_PTR)); + XNVCTRL_PTR *xnvctrl = (XNVCTRL_PTR *) mymalloc (sizeof (XNVCTRL_PTR)); - data.hm_adl = NULL; - data.hm_nvapi = NULL; - data.hm_nvml = NULL; + data.hm_adl = NULL; + data.hm_nvapi = NULL; + data.hm_nvml = NULL; + data.hm_xnvctrl = NULL; if ((need_nvml == 1) && (nvml_init (nvml) == 0)) { @@ -14388,6 +14526,30 @@ int main (int argc, char **argv) } } + if ((need_xnvctrl == 1) && (xnvctrl_init (xnvctrl) == 0)) + { + data.hm_xnvctrl = xnvctrl; + } + + if (data.hm_xnvctrl) + { + if (hm_XNVCTRL_XOpenDisplay (data.hm_xnvctrl) == 0) + { + for (uint device_id = 0; device_id < data.devices_cnt; device_id++) + { + hc_device_param_t *device_param = &data.devices_param[device_id]; + + if ((device_param->device_type & CL_DEVICE_TYPE_GPU) == 0) continue; + + hm_adapters_xnvctrl[device_id].xnvctrl = device_id; + + int speed = 0; + + if (get_fan_speed_current (data.hm_xnvctrl, device_id, &speed) == 0) hm_adapters_xnvctrl[device_id].fan_get_supported = 1; + } + } + } + if ((need_adl == 1) && (adl_init (adl) == 0)) { data.hm_adl = adl; @@ -14434,7 +14596,7 @@ int main (int argc, char **argv) } } - if (data.hm_adl == NULL && data.hm_nvml == NULL) + if (data.hm_adl == NULL && data.hm_nvml == NULL && data.hm_xnvctrl == NULL) { gpu_temp_disable = 1; } @@ -14467,7 +14629,7 @@ int main (int argc, char **argv) { if (gpu_temp_abort < gpu_temp_retain) { - log_error ("ERROR: invalid values for gpu-temp-abort. Parameter gpu-temp-abort is less than gpu-temp-retain."); + log_error ("ERROR: Invalid values for gpu-temp-abort. Parameter gpu-temp-abort is less than gpu-temp-retain."); return (-1); } @@ -14523,7 +14685,7 @@ int main (int argc, char **argv) */ #ifdef HAVE_HWMON - if (gpu_temp_disable == 0 && data.hm_adl == NULL && data.hm_nvml == NULL) + if (gpu_temp_disable == 0 && data.hm_adl == NULL && data.hm_nvml == NULL && data.hm_xnvctrl == NULL) { log_info ("Watchdog: Hardware Monitoring Interface not found on your system"); } @@ -14573,9 +14735,10 @@ int main (int argc, char **argv) data.hm_device[device_id].adl = hm_adapters_adl[platform_devices_id].adl; data.hm_device[device_id].nvapi = 0; data.hm_device[device_id].nvml = 0; + data.hm_device[device_id].xnvctrl = 0; data.hm_device[device_id].od_version = hm_adapters_adl[platform_devices_id].od_version; data.hm_device[device_id].fan_get_supported = hm_adapters_adl[platform_devices_id].fan_get_supported; - data.hm_device[device_id].fan_set_supported = hm_adapters_adl[platform_devices_id].fan_set_supported; + data.hm_device[device_id].fan_set_supported = 0; } if (device_param->device_vendor_id == VENDOR_ID_NV) @@ -14583,6 +14746,7 @@ int main (int argc, char **argv) data.hm_device[device_id].adl = 0; data.hm_device[device_id].nvapi = hm_adapters_nvapi[platform_devices_id].nvapi; data.hm_device[device_id].nvml = hm_adapters_nvml[platform_devices_id].nvml; + data.hm_device[device_id].xnvctrl = hm_adapters_xnvctrl[platform_devices_id].xnvctrl; data.hm_device[device_id].od_version = 0; data.hm_device[device_id].fan_get_supported = hm_adapters_nvml[platform_devices_id].fan_get_supported; data.hm_device[device_id].fan_set_supported = 0; @@ -14693,12 +14857,12 @@ int main (int argc, char **argv) if ((engine_clock_max - engine_clock_profile_max) > warning_trigger_engine) { - log_info ("WARN: the custom profile seems to have too low maximum engine clock values. You therefore may not reach full performance"); + log_info ("WARN: The custom profile seems to have too low maximum engine clock values. You therefore may not reach full performance"); } if ((memory_clock_max - memory_clock_profile_max) > warning_trigger_memory) { - log_info ("WARN: the custom profile seems to have too low maximum memory clock values. You therefore may not reach full performance"); + log_info ("WARN: The custom profile seems to have too low maximum memory clock values. You therefore may not reach full performance"); } ADLOD6StateInfo *performance_state = (ADLOD6StateInfo*) mycalloc (1, sizeof (ADLOD6StateInfo) + sizeof (ADLOD6PerformanceLevel)); @@ -14941,7 +15105,7 @@ int main (int argc, char **argv) if (size_scryptV > device_param->device_maxmem_alloc) { - if (quiet == 0) log_info ("WARNING: not enough device memory allocatable to use --scrypt-tmto %d, increasing...", tmto); + if (quiet == 0) log_info ("WARNING: Not enough device memory allocatable to use --scrypt-tmto %d, increasing...", tmto); continue; } @@ -14957,7 +15121,7 @@ int main (int argc, char **argv) if (data.salts_buf[0].scrypt_phy == 0) { - log_error ("ERROR: can't allocate enough device memory"); + log_error ("ERROR: Can't allocate enough device memory"); return -1; } @@ -15152,7 +15316,11 @@ int main (int argc, char **argv) // now check if all device-memory sizes which depend on the kernel_accel_max amplifier are within its boundaries // if not, decrease amplifier and try again - int skip = 0; + int memory_limit_hit = 0; + + if (size_pws > device_param->device_maxmem_alloc) memory_limit_hit = 1; + if (size_tmps > device_param->device_maxmem_alloc) memory_limit_hit = 1; + if (size_hooks > device_param->device_maxmem_alloc) memory_limit_hit = 1; const u64 size_total = bitmap_size @@ -15182,12 +15350,9 @@ int main (int argc, char **argv) + size_tm + size_tmps; - // Don't ask me, ask AMD! - - if (size_total > device_param->device_maxmem_alloc) skip = 1; - if (size_total > device_param->device_global_mem) skip = 1; + if (size_total > device_param->device_global_mem) memory_limit_hit = 1; - if (skip == 1) + if (memory_limit_hit == 1) { kernel_accel_max--; @@ -15197,14 +15362,12 @@ int main (int argc, char **argv) break; } - /* - if (kernel_accel_max == 0) + if (kernel_accel_max < kernel_accel_min) { - log_error ("Device #%u: Device does not provide enough allocatable device-memory to handle hash-type %u", device_id + 1, data.hash_mode); + log_error ("- Device #%u: Device does not provide enough allocatable device-memory to handle this attack", device_id + 1); return -1; } - */ device_param->kernel_accel_min = kernel_accel_min; device_param->kernel_accel_max = kernel_accel_max; @@ -15212,7 +15375,7 @@ int main (int argc, char **argv) /* if (kernel_accel_max < kernel_accel) { - if (quiet == 0) log_info ("Device #%u: Reduced maximum kernel-accel to %u", device_id + 1, kernel_accel_max); + if (quiet == 0) log_info ("- Device #%u: Reduced maximum kernel-accel to %u", device_id + 1, kernel_accel_max); device_param->kernel_accel = kernel_accel_max; } @@ -15258,7 +15421,7 @@ int main (int argc, char **argv) */ #ifdef DEBUG - log_info ("Device #%u: build_opts '%s'\n", device_id + 1, build_opts); + log_info ("- Device #%u: build_opts '%s'\n", device_id + 1, build_opts); #endif /** @@ -15312,7 +15475,7 @@ int main (int argc, char **argv) { if (cached == 0) { - if (quiet == 0) log_info ("Device #%u: Kernel %s not found in cache! Building may take a while...", device_id + 1, cached_file); + if (quiet == 0) log_info ("- Device #%u: Kernel %s not found in cache! Building may take a while...", device_id + 1, filename_from_filepath (cached_file)); load_kernel (source_file, 1, kernel_lengths, kernel_sources); @@ -15343,7 +15506,7 @@ int main (int argc, char **argv) { device_param->skipped = true; - log_info ("Device #%u: Kernel %s build failure. Proceed without this device.", device_id + 1, source_file); + log_info ("- Device #%u: Kernel %s build failure. Proceeding without this device.", device_id + 1, source_file); continue; } @@ -15363,7 +15526,7 @@ int main (int argc, char **argv) else { #ifdef DEBUG - log_info ("Device #%u: Kernel %s (%ld bytes)", device_id + 1, cached_file, cst.st_size); + log_info ("- Device #%u: Kernel %s (%ld bytes)", device_id + 1, cached_file, cst.st_size); #endif load_kernel (cached_file, 1, kernel_lengths, kernel_sources); @@ -15376,7 +15539,7 @@ int main (int argc, char **argv) else { #ifdef DEBUG - log_info ("Device #%u: Kernel %s (%ld bytes)", device_id + 1, source_file, sst.st_size); + log_info ("- Device #%u: Kernel %s (%ld bytes)", device_id + 1, source_file, sst.st_size); #endif load_kernel (source_file, 1, kernel_lengths, kernel_sources); @@ -15423,7 +15586,7 @@ int main (int argc, char **argv) { device_param->skipped = true; - log_info ("Device #%u: Kernel %s build failure. Proceed without this device.", device_id + 1, source_file); + log_info ("- Device #%u: Kernel %s build failure. Proceeding without this device.", device_id + 1, source_file); } } @@ -15482,7 +15645,7 @@ int main (int argc, char **argv) if (cached == 0) { - if (quiet == 0) log_info ("Device #%u: Kernel %s not found in cache! Building may take a while...", device_id + 1, cached_file); + if (quiet == 0) log_info ("- Device #%u: Kernel %s not found in cache! Building may take a while...", device_id + 1, filename_from_filepath (cached_file)); if (quiet == 0) log_info (""); load_kernel (source_file, 1, kernel_lengths, kernel_sources); @@ -15495,7 +15658,7 @@ int main (int argc, char **argv) { device_param->skipped = true; - log_info ("Device #%u: Kernel %s build failure. Proceed without this device.", device_id + 1, source_file); + log_info ("- Device #%u: Kernel %s build failure. Proceeding without this device.", device_id + 1, source_file); continue; } @@ -15515,7 +15678,7 @@ int main (int argc, char **argv) else { #ifdef DEBUG - log_info ("Device #%u: Kernel %s (%ld bytes)", device_id + 1, cached_file, cst.st_size); + log_info ("- Device #%u: Kernel %s (%ld bytes)", device_id + 1, cached_file, cst.st_size); #endif load_kernel (cached_file, 1, kernel_lengths, kernel_sources); @@ -15584,7 +15747,7 @@ int main (int argc, char **argv) if (cached == 0) { - if (quiet == 0) log_info ("Device #%u: Kernel %s not found in cache! Building may take a while...", device_id + 1, cached_file); + if (quiet == 0) log_info ("- Device #%u: Kernel %s not found in cache! Building may take a while...", device_id + 1, filename_from_filepath (cached_file)); if (quiet == 0) log_info (""); load_kernel (source_file, 1, kernel_lengths, kernel_sources); @@ -15597,7 +15760,7 @@ int main (int argc, char **argv) { device_param->skipped = true; - log_info ("Device #%u: Kernel %s build failure. Proceed without this device.", device_id + 1, source_file); + log_info ("- Device #%u: Kernel %s build failure. Proceed without this device.", device_id + 1, source_file); continue; } @@ -15617,7 +15780,7 @@ int main (int argc, char **argv) else { #ifdef DEBUG - if (quiet == 0) log_info ("Device #%u: Kernel %s (%ld bytes)", device_id + 1, cached_file, cst.st_size); + if (quiet == 0) log_info ("- Device #%u: Kernel %s (%ld bytes)", device_id + 1, cached_file, cst.st_size); #endif load_kernel (cached_file, 1, kernel_lengths, kernel_sources); @@ -16100,7 +16263,13 @@ int main (int argc, char **argv) } else if (device_param->device_vendor_id == VENDOR_ID_NV) { + #ifdef LINUX + rc = set_fan_control (data.hm_xnvctrl, data.hm_device[device_id].xnvctrl, NV_CTRL_GPU_COOLER_MANUAL_CONTROL_TRUE); + #endif + #ifdef WIN + rc = hm_set_fanspeed_with_device_id_nvapi (device_id, fanspeed, 1); + #endif } if (rc == 0) @@ -16247,7 +16416,7 @@ int main (int argc, char **argv) if (keyspace == 1) { - log_error ("ERROR: keyspace parameter is not allowed together with a directory"); + log_error ("ERROR: Keyspace parameter is not allowed together with a directory"); return (-1); } @@ -16710,7 +16879,7 @@ int main (int argc, char **argv) if (keyspace == 1) { - log_error ("ERROR: keyspace parameter is not allowed together with a directory"); + log_error ("ERROR: Keyspace parameter is not allowed together with a directory"); return (-1); } @@ -16889,7 +17058,7 @@ int main (int argc, char **argv) if (keyspace == 1) { - log_error ("ERROR: keyspace parameter is not allowed together with a directory"); + log_error ("ERROR: Keyspace parameter is not allowed together with a directory"); return (-1); } @@ -17063,8 +17232,8 @@ int main (int argc, char **argv) { if (potfile_remove_cracks > 0) { - if (potfile_remove_cracks == 1) log_info ("INFO: removed 1 hash found in pot file\n"); - else log_info ("INFO: removed %u hashes found in pot file\n", potfile_remove_cracks); + if (potfile_remove_cracks == 1) log_info ("INFO: Removed 1 hash found in pot file\n"); + else log_info ("INFO: Removed %u hashes found in pot file\n", potfile_remove_cracks); } } @@ -17586,12 +17755,12 @@ int main (int argc, char **argv) { if (css_cnt < mask_min) { - log_info ("WARNING: skipping mask '%s' because it is smaller than the minimum password length", mask); + log_info ("WARNING: Skipping mask '%s' because it is smaller than the minimum password length", mask); } if (css_cnt > mask_max) { - log_info ("WARNING: skipping mask '%s' because it is larger than the maximum password length", mask); + log_info ("WARNING: Skipping mask '%s' because it is larger than the maximum password length", mask); } // skip to next mask @@ -17806,7 +17975,7 @@ int main (int argc, char **argv) if (data.words_cur > data.words_base) { - log_error ("ERROR: restore value greater keyspace"); + log_error ("ERROR: Restore value greater keyspace"); return (-1); } @@ -17915,6 +18084,8 @@ int main (int argc, char **argv) { if (quiet == 0) { + clear_prompt (); + log_info ("ATTENTION!"); log_info (" The wordlist or mask you are using is too small."); log_info (" Therefore, hashcat is unable to utilize the full parallelization power of your device(s)."); @@ -18300,7 +18471,13 @@ int main (int argc, char **argv) } else if (device_param->device_vendor_id == VENDOR_ID_NV) { + #ifdef LINUX + rc = set_fan_control (data.hm_xnvctrl, data.hm_device[device_id].xnvctrl, NV_CTRL_GPU_COOLER_MANUAL_CONTROL_FALSE); + #endif + #ifdef WIN + rc = hm_set_fanspeed_with_device_id_nvapi (device_id, fanspeed, fanpolicy); + #endif } if (rc == -1) log_info ("WARNING: Failed to restore default fan speed and policy for device #%", device_id + 1); @@ -18398,6 +18575,24 @@ int main (int argc, char **argv) data.hm_nvml = NULL; } + if (data.hm_nvapi) + { + hm_NvAPI_Unload (data.hm_nvapi); + + nvapi_close (data.hm_nvapi); + + data.hm_nvapi = NULL; + } + + if (data.hm_xnvctrl) + { + hm_XNVCTRL_XCloseDisplay (data.hm_xnvctrl); + + xnvctrl_close (data.hm_xnvctrl); + + data.hm_xnvctrl = NULL; + } + if (data.hm_adl) { hm_ADL_Main_Control_Destroy (data.hm_adl);