mirror of
https://github.com/hashcat/hashcat.git
synced 2024-11-22 08:08:10 +00:00
Keep output of --show and --left in the original ordering of the input hash file
This commit is contained in:
parent
30f0745252
commit
6adc217bae
@ -30,5 +30,6 @@ void potfile_update_hashes (hashcat_ctx_t *hashcat_ctx, hash_t *hash_buf, cha
|
||||
void pot_tree_destroy (pot_tree_entry_t *tree);
|
||||
|
||||
int sort_pot_tree_by_hash (const void *v1, const void *v2);
|
||||
int sort_pot_orig_line (const void *v1, const void *v2);
|
||||
|
||||
#endif // _POTFILE_H
|
||||
|
@ -834,6 +834,7 @@ typedef struct hash
|
||||
hashinfo_t *hash_info;
|
||||
char *pw_buf;
|
||||
int pw_len;
|
||||
u64 orig_line_pos;
|
||||
|
||||
} hash_t;
|
||||
|
||||
@ -1695,6 +1696,14 @@ typedef struct pot_tree_entry
|
||||
|
||||
} pot_tree_entry_t;
|
||||
|
||||
typedef struct pot_orig_line_entry
|
||||
{
|
||||
u8 *hash_buf;
|
||||
int hash_len;
|
||||
int line_pos;
|
||||
|
||||
} pot_orig_line_entry_t;
|
||||
|
||||
typedef struct restore_data
|
||||
{
|
||||
int version;
|
||||
|
@ -822,6 +822,12 @@ int hashes_init_stage1 (hashcat_ctx_t *hashcat_ctx)
|
||||
|
||||
for (u64 hash_pos = 0; hash_pos < hashes_avail; hash_pos++)
|
||||
{
|
||||
/**
|
||||
* Initialize some values for later use
|
||||
*/
|
||||
|
||||
hashes_buf[hash_pos].orig_line_pos = hash_pos;
|
||||
|
||||
hashes_buf[hash_pos].digest = ((char *) digests_buf) + (hash_pos * hashconfig->dgst_size);
|
||||
|
||||
if (hashconfig->is_salted == true)
|
||||
|
@ -74,6 +74,16 @@ int sort_pot_tree_by_hash (const void *v1, const void *v2)
|
||||
return sort_by_hash (h1, h2, hc);
|
||||
}
|
||||
|
||||
// this function is used to reproduce the hash ordering based on the original input hash file
|
||||
|
||||
int sort_pot_orig_line (const void *v1, const void *v2)
|
||||
{
|
||||
const pot_orig_line_entry_t *t1 = (const pot_orig_line_entry_t *) v1;
|
||||
const pot_orig_line_entry_t *t2 = (const pot_orig_line_entry_t *) v2;
|
||||
|
||||
return t1->line_pos > t2->line_pos;
|
||||
}
|
||||
|
||||
// the problem with the GNU tdestroy () function is that it doesn't work with mingw etc
|
||||
// there are 2 alternatives:
|
||||
// 1. recursively delete the entries with entry->left and entry->right
|
||||
@ -648,6 +658,9 @@ int potfile_handle_show (hashcat_ctx_t *hashcat_ctx)
|
||||
u32 salts_cnt = hashes->salts_cnt;
|
||||
salt_t *salts_buf = hashes->salts_buf;
|
||||
|
||||
pot_orig_line_entry_t *final_buf = (pot_orig_line_entry_t *) hccalloc (hashes->hashes_cnt, sizeof (pot_orig_line_entry_t));
|
||||
u32 final_cnt = 0;
|
||||
|
||||
if (hashconfig->opts_type & OPTS_TYPE_HASH_SPLIT)
|
||||
{
|
||||
// this implementation will work for LM only
|
||||
@ -757,7 +770,17 @@ int potfile_handle_show (hashcat_ctx_t *hashcat_ctx)
|
||||
|
||||
const int tmp_len = outfile_write (hashcat_ctx, (char *) out_buf, out_len, (u8 *) mixed_buf, mixed_len, 0, username, user_len, (char *) tmp_buf);
|
||||
|
||||
EVENT_DATA (EVENT_POTFILE_HASH_SHOW, tmp_buf, tmp_len);
|
||||
//EVENT_DATA (EVENT_POTFILE_HASH_SHOW, tmp_buf, tmp_len);
|
||||
|
||||
final_buf[final_cnt].hash_buf = (u8 *) hcmalloc (tmp_len);
|
||||
|
||||
memcpy (final_buf[final_cnt].hash_buf, tmp_buf, tmp_len);
|
||||
|
||||
final_buf[final_cnt].hash_len = tmp_len;
|
||||
|
||||
final_buf[final_cnt].line_pos = hash1->orig_line_pos;
|
||||
|
||||
final_cnt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -808,7 +831,6 @@ int potfile_handle_show (hashcat_ctx_t *hashcat_ctx)
|
||||
|
||||
tmp_buf[0] = 0;
|
||||
|
||||
|
||||
// special case for collider modes: we do not use the $HEX[] format within the hash itself
|
||||
// therefore we need to convert the $HEX[] password into hexadecimal (without "$HEX[" and "]")
|
||||
|
||||
@ -837,11 +859,32 @@ int potfile_handle_show (hashcat_ctx_t *hashcat_ctx)
|
||||
tmp_len = outfile_write (hashcat_ctx, (char *) out_buf, out_len, (u8 *) hash->pw_buf, hash->pw_len, 0, username, user_len, (char *) tmp_buf);
|
||||
}
|
||||
|
||||
EVENT_DATA (EVENT_POTFILE_HASH_SHOW, tmp_buf, tmp_len);
|
||||
//EVENT_DATA (EVENT_POTFILE_HASH_SHOW, tmp_buf, tmp_len);
|
||||
|
||||
final_buf[final_cnt].hash_buf = (u8 *) hcmalloc (tmp_len);
|
||||
|
||||
memcpy (final_buf[final_cnt].hash_buf, tmp_buf, tmp_len);
|
||||
|
||||
final_buf[final_cnt].hash_len = tmp_len;
|
||||
|
||||
final_buf[final_cnt].line_pos = hash->orig_line_pos;
|
||||
|
||||
final_cnt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
qsort (final_buf, final_cnt, sizeof (pot_orig_line_entry_t), sort_pot_orig_line);
|
||||
|
||||
for (u32 final_pos = 0; final_pos < final_cnt; final_pos++)
|
||||
{
|
||||
EVENT_DATA (EVENT_POTFILE_HASH_SHOW, final_buf[final_pos].hash_buf, final_buf[final_pos].hash_len);
|
||||
|
||||
hcfree (final_buf[final_pos].hash_buf);
|
||||
}
|
||||
|
||||
hcfree (final_buf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -857,6 +900,9 @@ int potfile_handle_left (hashcat_ctx_t *hashcat_ctx)
|
||||
u32 salts_cnt = hashes->salts_cnt;
|
||||
salt_t *salts_buf = hashes->salts_buf;
|
||||
|
||||
pot_orig_line_entry_t *final_buf = (pot_orig_line_entry_t *) hccalloc (hashes->hashes_cnt, sizeof (pot_orig_line_entry_t));
|
||||
u32 final_cnt = 0;
|
||||
|
||||
if (hashconfig->opts_type & OPTS_TYPE_HASH_SPLIT)
|
||||
{
|
||||
// this implementation will work for LM only
|
||||
@ -933,7 +979,17 @@ int potfile_handle_left (hashcat_ctx_t *hashcat_ctx)
|
||||
|
||||
const int tmp_len = outfile_write (hashcat_ctx, (char *) out_buf, out_len, NULL, 0, 0, username, user_len, (char *) tmp_buf);
|
||||
|
||||
EVENT_DATA (EVENT_POTFILE_HASH_LEFT, tmp_buf, tmp_len);
|
||||
//EVENT_DATA (EVENT_POTFILE_HASH_LEFT, tmp_buf, tmp_len);
|
||||
|
||||
final_buf[final_cnt].hash_buf = (u8 *) hcmalloc (tmp_len);
|
||||
|
||||
memcpy (final_buf[final_cnt].hash_buf, tmp_buf, tmp_len);
|
||||
|
||||
final_buf[final_cnt].hash_len = tmp_len;
|
||||
|
||||
final_buf[final_cnt].line_pos = hash1->orig_line_pos;
|
||||
|
||||
final_cnt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1008,10 +1064,31 @@ int potfile_handle_left (hashcat_ctx_t *hashcat_ctx)
|
||||
|
||||
const int tmp_len = outfile_write (hashcat_ctx, (char *) out_buf, out_len, NULL, 0, 0, username, user_len, (char *) tmp_buf);
|
||||
|
||||
EVENT_DATA (EVENT_POTFILE_HASH_LEFT, tmp_buf, tmp_len);
|
||||
//EVENT_DATA (EVENT_POTFILE_HASH_LEFT, tmp_buf, tmp_len);
|
||||
|
||||
final_buf[final_cnt].hash_buf = (u8 *) hcmalloc (tmp_len);
|
||||
|
||||
memcpy (final_buf[final_cnt].hash_buf, tmp_buf, tmp_len);
|
||||
|
||||
final_buf[final_cnt].hash_len = tmp_len;
|
||||
|
||||
final_buf[final_cnt].line_pos = hash->orig_line_pos;
|
||||
|
||||
final_cnt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
qsort (final_buf, final_cnt, sizeof (pot_orig_line_entry_t), sort_pot_orig_line);
|
||||
|
||||
for (u32 final_pos = 0; final_pos < final_cnt; final_pos++)
|
||||
{
|
||||
EVENT_DATA (EVENT_POTFILE_HASH_LEFT, final_buf[final_pos].hash_buf, final_buf[final_pos].hash_len);
|
||||
|
||||
hcfree (final_buf[final_pos].hash_buf);
|
||||
}
|
||||
|
||||
hcfree (final_buf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user