diff --git a/include/interface.h b/include/interface.h index afa7539ab..a21982a78 100644 --- a/include/interface.h +++ b/include/interface.h @@ -1875,7 +1875,7 @@ int ethereum_scrypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_bu * hook functions */ -void seven_zip_hook_func (hc_device_param_t *device_param, hashes_t *hashes, const u32 salt_pos, const u32 pws_cnt); +void seven_zip_hook_func (hc_device_param_t *device_param, void *hook_salts_buf, const u32 salt_pos, const u32 pws_cnt); /** * output functions diff --git a/include/types.h b/include/types.h index c474b577e..755961cee 100644 --- a/include/types.h +++ b/include/types.h @@ -798,6 +798,7 @@ typedef struct hashes void *st_digests_buf; salt_t *st_salts_buf; void *st_esalts_buf; + void *st_hook_salts_buf; } hashes_t; diff --git a/src/hashes.c b/src/hashes.c index 7638b4433..a3aafbdfe 100644 --- a/src/hashes.c +++ b/src/hashes.c @@ -1522,9 +1522,10 @@ int hashes_init_selftest (hashcat_ctx_t *hashcat_ctx) if (hashconfig->st_hash == NULL) return 0; - void *st_digests_buf = NULL; - salt_t *st_salts_buf = NULL; - void *st_esalts_buf = NULL; + void *st_digests_buf = NULL; + salt_t *st_salts_buf = NULL; + void *st_esalts_buf = NULL; + void *st_hook_salts_buf = NULL; st_digests_buf = (void *) hccalloc (1, hashconfig->dgst_size); @@ -1535,12 +1536,17 @@ int hashes_init_selftest (hashcat_ctx_t *hashcat_ctx) st_esalts_buf = (void *) hccalloc (1, hashconfig->esalt_size); } + if (hashconfig->hook_salt_size) + { + st_hook_salts_buf = (void *) hccalloc (1, hashconfig->hook_salt_size); + } + hash_t hash; hash.digest = st_digests_buf; hash.salt = st_salts_buf; hash.esalt = st_esalts_buf; - hash.hook_salt = NULL; + hash.hook_salt = st_hook_salts_buf; hash.cracked = 0; hash.hash_info = NULL; hash.pw_buf = NULL; @@ -1559,9 +1565,10 @@ int hashes_init_selftest (hashcat_ctx_t *hashcat_ctx) return -1; } - hashes->st_digests_buf = st_digests_buf; - hashes->st_salts_buf = st_salts_buf; - hashes->st_esalts_buf = st_esalts_buf; + hashes->st_digests_buf = st_digests_buf; + hashes->st_salts_buf = st_salts_buf; + hashes->st_esalts_buf = st_esalts_buf; + hashes->st_hook_salts_buf = st_hook_salts_buf; return 0; } @@ -1611,6 +1618,7 @@ void hashes_destroy (hashcat_ctx_t *hashcat_ctx) hcfree (hashes->st_digests_buf); hcfree (hashes->st_salts_buf); hcfree (hashes->st_esalts_buf); + hcfree (hashes->st_hook_salts_buf); memset (hashes, 0, sizeof (hashes_t)); } diff --git a/src/interface.c b/src/interface.c index 1be51e8a3..eb8b32258 100644 --- a/src/interface.c +++ b/src/interface.c @@ -38,7 +38,6 @@ static char ST_PASS_BIN_10410[] = "\x6a\x8a\xed\xcc\xb7"; * ST_HASH_05200 file-based * ST_HASH_062xx file-based * ST_HASH_09000 file-based - * ST_HASH_11600 hooks not working yet * ST_HASH_137xx file-based * ST_HASH_14600 file-based */ @@ -199,7 +198,7 @@ static char ST_HASH_11200[] = "$mysqlna$2576670568531371763643101056213751754328 static char ST_HASH_11300[] = "$bitcoin$96$c265931309b4a59307921cf054b4ec6b6e4554369be79802e94e16477645777d948ae1d375191831efc78e5acd1f0443$16$8017214013543185$200460$96$480008005625057442352316337722323437108374245623701184230273883222762730232857701607167815448714$66$014754433300175043011633205413774877455616682000536368706315333388"; static char ST_HASH_11400[] = "$sip$*72087*1215344588738747***342210558720*737232616*1215344588738747*8867133055*65600****MD5*e9980869221f9d1182c83b0d5e56a7db"; static char ST_HASH_11500[] = "c762de4a:00000000"; -//static char ST_HASH_11600[] = "$7z$0$14$0$$11$33363437353138333138300000000000$2365089182$16$12$d00321533b483f54a523f624a5f63269"; +static char ST_HASH_11600[] = "$7z$0$14$0$$11$33363437353138333138300000000000$2365089182$16$12$d00321533b483f54a523f624a5f63269"; static char ST_HASH_11700[] = "57e9e50caec93d72e9498c211d6dc4f4d328248b48ecf46ba7abfa874f666e36"; static char ST_HASH_11800[] = "5d5bdba48c8f89ee6c0a0e11023540424283e84902de08013aeeb626e819950bb32842903593a1d2e8f71897ff7fe72e17ac9ba8ce1d1d2f7e9c4359ea63bdc3"; static char ST_HASH_11900[] = "md5:1000:NjAxMDY4MQ==:a00DtIW9hP9voC85fmEA5uVhgdDx67nSPSm9yADHjkI="; @@ -15486,11 +15485,11 @@ int ethereum_scrypt_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, * hook functions */ -void seven_zip_hook_func (hc_device_param_t *device_param, hashes_t *hashes, const u32 salt_pos, const u32 pws_cnt) +void seven_zip_hook_func (hc_device_param_t *device_param, void *hook_salts_buf, const u32 salt_pos, const u32 pws_cnt) { seven_zip_hook_t *hook_items = (seven_zip_hook_t *) device_param->hooks_buf; - seven_zip_hook_salt_t *seven_zips = (seven_zip_hook_salt_t *) hashes->hook_salts_buf; + seven_zip_hook_salt_t *seven_zips = (seven_zip_hook_salt_t *) hook_salts_buf; seven_zip_hook_salt_t *seven_zip = &seven_zips[salt_pos]; u8 data_type = seven_zip->data_type; @@ -23063,7 +23062,7 @@ int hashconfig_init (hashcat_ctx_t *hashcat_ctx) hashconfig->dgst_pos1 = 1; hashconfig->dgst_pos2 = 2; hashconfig->dgst_pos3 = 3; - hashconfig->st_hash = NULL; + hashconfig->st_hash = ST_HASH_11600; hashconfig->st_pass = ST_PASS_HASHCAT_PLAIN; break; diff --git a/src/opencl.c b/src/opencl.c index 529726f56..7700d23fc 100644 --- a/src/opencl.c +++ b/src/opencl.c @@ -1240,7 +1240,7 @@ int choose_kernel (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param, switch (hashconfig->hash_mode) { // for 7z we only need device_param->hooks_buf, but other hooks could use any info from device_param. All of them should/must update hooks_buf - case 11600: seven_zip_hook_func (device_param, hashes, salt_pos, pws_cnt); break; + case 11600: seven_zip_hook_func (device_param, hashes->hook_salts_buf, salt_pos, pws_cnt); break; } /* diff --git a/src/selftest.c b/src/selftest.c index 458be273a..9f364117c 100644 --- a/src/selftest.c +++ b/src/selftest.c @@ -322,6 +322,23 @@ static int selftest (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param if (CL_rc == -1) return -1; + if (hashconfig->opts_type & OPTS_TYPE_HOOK12) + { + CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_12, 1, false, 0); + + if (CL_rc == -1) return -1; + + CL_rc = hc_clEnqueueReadBuffer (hashcat_ctx, device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL); + + if (CL_rc == -1) return -1; + + // do something with data + + CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL); + + if (CL_rc == -1) return -1; + } + const u32 salt_pos = 0; salt_t *salt_buf = &hashes->st_salts_buf[salt_pos]; @@ -346,6 +363,35 @@ static int selftest (hashcat_ctx_t *hashcat_ctx, hc_device_param_t *device_param if (CL_rc == -1) return -1; } + if (hashconfig->opts_type & OPTS_TYPE_HOOK23) + { + CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_23, 1, false, 0); + + if (CL_rc == -1) return -1; + + CL_rc = hc_clEnqueueReadBuffer (hashcat_ctx, device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL); + + if (CL_rc == -1) return -1; + + /* + * The following section depends on the hash mode + */ + + switch (hashconfig->hash_mode) + { + // for 7z we only need device_param->hooks_buf, but other hooks could use any info from device_param. All of them should/must update hooks_buf + case 11600: seven_zip_hook_func (device_param, hashes->st_hook_salts_buf, 0, 1); break; + } + + /* + * END of hash mode specific hook operations + */ + + CL_rc = hc_clEnqueueWriteBuffer (hashcat_ctx, device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL); + + if (CL_rc == -1) return -1; + } + CL_rc = run_kernel (hashcat_ctx, device_param, KERN_RUN_3, 1, false, 0); if (CL_rc == -1) return -1;