I started again with this version:
Code:
https://github.com/hashcat/hashca/
tree/72319875d84c8bebf91647756448ae3991881688
I made the changes (I have attached the patch file) :
Code:
// do not try to simply change this, it will not work
#define PW_MIN 0
#define PW_MAX 8192
#define PW_MAX_OLD 8192
#define SALT_MIN 0
#define SALT_MAX 8192
#define SALT_MAX_OLD 8192
#define HCBUFSIZ_TINY 0x1000
#define HCBUFSIZ_LARGE 0xb0000
The note states that changing the values is not enough ...
Code:
static bool parse_and_store_generic_salt (u8 *out_buf, int *out_len, const u8 *in_buf, const int in_len, MAYBE_UNUSED hashconfig_t *hashconfig)
{
u32 tmp_u32[(2048 * 2) + 1] = { 0 };
if (in_len > 16384) return false; // 512 = 2 * 256 -- (2 * because of hex), 256 because of maximum salt length in salt_t
if (hashconfig->opts_type & OPTS_TYPE_ST_HEX)
{
if (in_len < (int) (hashconfig->salt_min * 2)) return false;
if (in_len > (int) (hashconfig->salt_max * 2)) return false;
}
else
{
if (in_len < (int) hashconfig->salt_min) return false;
if (in_len > (int) hashconfig->salt_max) return false;
}
u8 *tmp_buf = (u8 *) tmp_u32;
int tmp_len = 0;
if (hashconfig->opts_type & OPTS_TYPE_ST_HEX)
{
if (tmp_len & 1) return false;
tmp_len = in_len / 2;
for (int i = 0, j = 0; i < tmp_len; i += 1, j += 2)
{
u8 p0 = in_buf[j + 0];
u8 p1 = in_buf[j + 1];
tmp_buf[i] = hex_convert (p1) << 0;
tmp_buf[i] |= hex_convert (p0) << 4;
}
}
else if (hashconfig->opts_type & OPTS_TYPE_ST_BASE64)
{
tmp_len = base64_decode (base64_to_int, (const u8 *) in_buf, in_len, tmp_buf);
}
else
{
if (in_len) memcpy (tmp_buf, in_buf, in_len);
tmp_len = in_len;
}
if (hashconfig->opts_type & OPTS_TYPE_ST_UTF16LE)
{
if (tmp_len >= 4096) return false;
for (int i = 2048 - 1; i >= 1; i -= 2)
{
const u32 v = tmp_u32[i / 2];
tmp_u32[i - 0] = ((v >> 8) & 0x00FF0000) | ((v >> 16) & 0x000000FF);
tmp_u32[i - 1] = ((v << 8) & 0x00FF0000) | ((v >> 0) & 0x000000FF);
}
tmp_len = tmp_len * 2;
}
if (hashconfig->opts_type & OPTS_TYPE_ST_LOWER)
{
lowercase (tmp_buf, tmp_len);
}
if (hashconfig->opts_type & OPTS_TYPE_ST_UPPER)
{
uppercase (tmp_buf, tmp_len);
}
int tmp2_len = tmp_len;
if (hashconfig->opts_type & OPTS_TYPE_ST_ADD80)
{
if (tmp2_len >= 8192) return false;
tmp_buf[tmp2_len++] = 0x80;
}
if (hashconfig->opts_type & OPTS_TYPE_ST_ADD01)
{
if (tmp2_len >= 8192) return false;
tmp_buf[tmp2_len++] = 0x01;
}
if (hashconfig->opts_type & OPTS_TYPE_ST_GENERATE_LE)
{
u32 max = tmp2_len / 4;
if (tmp2_len % 4) max++;
for (u32 i = 0; i < max; i++)
{
tmp_u32[i] = byte_swap_32 (tmp_u32[i]);
}
// Important: we may need to increase the length of memcpy since
// we don't want to "loose" some swapped bytes (could happen if
// they do not perfectly fit in the 4-byte blocks)
// Memcpy does always copy the bytes in the BE order, but since
// we swapped them, some important bytes could be in positions
// we normally skip with the original len
if (tmp2_len % 4) tmp2_len += 4 - (tmp2_len % 4);
}
memcpy (out_buf, tmp_buf, tmp2_len);
*out_len = tmp_len;
return true;
}
Code:
int sha256s_parse_hash (u8 *input_buf, u32 input_len, hash_t *hash_buf, MAYBE_UNUSED hashconfig_t *hashconfig)
{
u32 *digest = (u32 *) hash_buf->digest;
salt_t *salt = hash_buf->salt;
token_t token;
token.token_cnt = 2;
token.sep[0] = hashconfig->separator;
token.len_min[0] = 64;
token.len_max[0] = 8192;
token.attr[0] = TOKEN_ATTR_VERIFY_LENGTH
| TOKEN_ATTR_VERIFY_HEX;
token.len_min[1] = SALT_MIN;
token.len_max[1] = SALT_MAX;
token.attr[1] = TOKEN_ATTR_VERIFY_LENGTH;
if (hashconfig->opts_type & OPTS_TYPE_ST_HEX)
{
token.len_min[1] *= 2;
token.len_max[1] *= 2;
token.attr[1] |= TOKEN_ATTR_VERIFY_HEX;
}
const int rc_tokenizer = input_tokenizer (input_buf, input_len, &token);
if (rc_tokenizer != PARSER_OK) return (rc_tokenizer);
u8 *hash_pos = token.buf[0];
digest[0] = hex_to_u32 (hash_pos + 0);
digest[1] = hex_to_u32 (hash_pos + 8);
digest[2] = hex_to_u32 (hash_pos + 16);
digest[3] = hex_to_u32 (hash_pos + 24);
digest[4] = hex_to_u32 (hash_pos + 32);
digest[5] = hex_to_u32 (hash_pos + 40);
digest[6] = hex_to_u32 (hash_pos + 48);
digest[7] = hex_to_u32 (hash_pos + 56);
digest[0] = byte_swap_32 (digest[0]);
digest[1] = byte_swap_32 (digest[1]);
digest[2] = byte_swap_32 (digest[2]);
digest[3] = byte_swap_32 (digest[3]);
digest[4] = byte_swap_32 (digest[4]);
digest[5] = byte_swap_32 (digest[5]);
digest[6] = byte_swap_32 (digest[6]);
digest[7] = byte_swap_32 (digest[7]);
if (hashconfig->opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE)
{
digest[0] -= SHA256M_A;
digest[1] -= SHA256M_B;
digest[2] -= SHA256M_C;
digest[3] -= SHA256M_D;
digest[4] -= SHA256M_E;
digest[5] -= SHA256M_F;
digest[6] -= SHA256M_G;
digest[7] -= SHA256M_H;
}
u8 *salt_pos = token.buf[1];
int salt_len = token.len[1];
const bool parse_rc = parse_and_store_generic_salt ((u8 *) salt->salt_buf, (int *) &salt->salt_len, salt_pos, salt_len, hashconfig);
if (parse_rc == false) return (PARSER_SALT_LENGTH);
return (PARSER_OK);
}
Starting the program, it gives no error, but stops without signaling anything ...
Code:
hashcat (v5.1.0) starting...
OpenCL Platform #1: Advanced Micro Devices, Inc.
================================================
* Device #1: Intel(R) Core(TM) i7 CPU 950 @ 3.07GHz, 3069/12279 MB allocatable, 8MCU
Hashes: 1 digests; 1 unique digests, 1 unique salts
Bitmaps: 16 bits, 65536 entries, 0x0000ffff mask, 262144 bytes, 5/13 rotates
Applicable optimizers:
* Zero-Byte
* Not-Iterated
* Single-Hash
* Single-Salt
* Brute-Force
Minimum password length supported by kernel: 0
Maximum password length supported by kernel: 8192
ATTENTION! Pure (unoptimized) OpenCL kernels selected.
This enables cracking passwords and salts > length 32 but for the price of drastically reduced performance.
If you want to switch to optimized OpenCL kernels, append -O to your commandline.
Watchdog: Hardware monitoring interface not found on your system.
Watchdog: Temperature abort trigger disabled.
Initialized device kernels and memory...
Other ideas ?