static int mp_get_truncated_mask (hashcat_ctx_t *hashcat_ctx, const char *mask_buf, const size_t mask_len, const u32 len, char *new_mask_buf) { const user_options_t *user_options = hashcat_ctx->user_options; u32 mask_pos; u32 css_pos; for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++) { if (css_pos == len) break; char p0 = mask_buf[mask_pos]; new_mask_buf[mask_pos] = p0; if (p0 == '?') { mask_pos++; if (mask_pos == mask_len) break; new_mask_buf[mask_pos] = mask_buf[mask_pos]; } else { if (user_options->hex_charset == true) { mask_pos++; if (mask_pos == mask_len) { event_log_error (hashcat_ctx, "The hex-charset option expects exactly 2 hexadecimal chars. Failed mask: %s", mask_buf); return -1; } char p1 = mask_buf[mask_pos]; // if they are not valid hex character, show an error: if ((is_valid_hex_char ((u8) p0) == false) || (is_valid_hex_char ((u8) p1) == false)) { event_log_error (hashcat_ctx, "Invalid hex character detected in mask: %s", mask_buf); return -1; } new_mask_buf[mask_pos] = p1; } } } return 0; }
bool WriteByte(uint8 *pCursor, uint8 nValue, uint8 nRawValue) { if( ! is_valid_hex_char(nRawValue) ) return false; nValue = get_key_val(nRawValue); if( m_bSecondChar ) { nValue = (*pCursor & 0xF0) + nValue; AddUndoEntry(1, pCursor, *pCursor, nValue); *pCursor = nValue; m_bSecondChar = false; GetOwner()->MoveCursorBy(1); } else { nValue = (*pCursor & 0x0F) + (nValue << 4); AddUndoEntry(0, pCursor, *pCursor, nValue); *pCursor = nValue; m_bSecondChar = true; } return true; }
uint8 *ParseFindText(const String &cText, int *pnLength) { // Allow spaces or valid hex chars. std::vector<uint8> cBytes; bool bHigh = true; bool bErr = false; uint8 nTmp = 0; for( uint32 i = 0; i < cText.size(); i++ ) if( is_valid_hex_char(cText[i] ) ) if( bHigh ) { nTmp = get_key_val(cText[i]) << 4; bHigh = false; } else { nTmp |= get_key_val(cText[i]); bHigh = true; cBytes.push_back(nTmp); } else if( cText[i] != ' ' ) { bErr = true; break; } if( bErr ) { SetMessage(STR_MSG_INVALID_HEX_STRING); return NULL; } uint8 *pnBytes = (uint8 *)malloc(cBytes.size()); *pnLength = cBytes.size(); for( int i = 0; i < *pnLength; i++ ) *(pnBytes + i) = cBytes[i]; return pnBytes; }
static int mp_gen_css (hashcat_ctx_t *hashcat_ctx, char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, cs_t *css_buf, u32 *css_cnt) { const user_options_t *user_options = hashcat_ctx->user_options; u32 mask_pos; u32 css_pos; for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++) { char p0 = mask_buf[mask_pos]; if (p0 == '?') { mask_pos++; if (mask_pos == mask_len) break; char p1 = mask_buf[mask_pos]; u32 chr = (u32) p1; int rc = 0; switch (p1) { case 'l': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[0].cs_buf, mp_sys[0].cs_len, css_buf, css_pos); break; case 'u': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[1].cs_buf, mp_sys[1].cs_len, css_buf, css_pos); break; case 'd': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[2].cs_buf, mp_sys[2].cs_len, css_buf, css_pos); break; case 's': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[3].cs_buf, mp_sys[3].cs_len, css_buf, css_pos); break; case 'a': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[4].cs_buf, mp_sys[4].cs_len, css_buf, css_pos); break; case 'b': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[5].cs_buf, mp_sys[5].cs_len, css_buf, css_pos); break; case 'h': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[6].cs_buf, mp_sys[6].cs_len, css_buf, css_pos); break; case 'H': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[7].cs_buf, mp_sys[7].cs_len, css_buf, css_pos); break; case '1': if (mp_usr[0].cs_len == 0) { event_log_error (hashcat_ctx, "Custom-charset 1 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, mp_usr[0].cs_buf, mp_usr[0].cs_len, css_buf, css_pos); break; case '2': if (mp_usr[1].cs_len == 0) { event_log_error (hashcat_ctx, "Custom-charset 2 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, mp_usr[1].cs_buf, mp_usr[1].cs_len, css_buf, css_pos); break; case '3': if (mp_usr[2].cs_len == 0) { event_log_error (hashcat_ctx, "Custom-charset 3 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, mp_usr[2].cs_buf, mp_usr[2].cs_len, css_buf, css_pos); break; case '4': if (mp_usr[3].cs_len == 0) { event_log_error (hashcat_ctx, "Custom-charset 4 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, mp_usr[3].cs_buf, mp_usr[3].cs_len, css_buf, css_pos); break; case '?': rc = mp_add_cs_buf (hashcat_ctx, &chr, 1, css_buf, css_pos); break; default: event_log_error (hashcat_ctx, "Syntax error: %s", mask_buf); return -1; } if (rc == -1) return -1; } else { if (user_options->hex_charset == true) { mask_pos++; // if there is no 2nd hex character, show an error: if (mask_pos == mask_len) { event_log_error (hashcat_ctx, "The hex-charset option expects exactly 2 hexadecimal chars. Failed mask: %s", mask_buf); return -1; } char p1 = mask_buf[mask_pos]; // if they are not valid hex character, show an error: if ((is_valid_hex_char ((u8) p0) == false) || (is_valid_hex_char ((u8) p1) == false)) { event_log_error (hashcat_ctx, "Invalid hex character detected in mask %s", mask_buf); return -1; } u32 chr = 0; chr |= (u32) hex_convert ((u8) p1) << 0; chr |= (u32) hex_convert ((u8) p0) << 4; const int rc = mp_add_cs_buf (hashcat_ctx, &chr, 1, css_buf, css_pos); if (rc == -1) return -1; } else { u32 chr = (u32) p0; const int rc = mp_add_cs_buf (hashcat_ctx, &chr, 1, css_buf, css_pos); if (rc == -1) return -1; } } } if (css_pos == 0) { event_log_error (hashcat_ctx, "Invalid mask length (0)."); return -1; } *css_cnt = css_pos; return 0; }
static int mp_expand (hashcat_ctx_t *hashcat_ctx, const char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, u32 mp_usr_offset, int interpret) { const user_options_t *user_options = hashcat_ctx->user_options; size_t in_pos; for (in_pos = 0; in_pos < in_len; in_pos++) { u32 p0 = in_buf[in_pos] & 0xff; if (interpret == 1 && p0 == '?') { in_pos++; if (in_pos == in_len) break; u32 p1 = in_buf[in_pos] & 0xff; int rc = 0; switch (p1) { case 'l': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset); break; case 'u': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset); break; case 'd': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset); break; case 's': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset); break; case 'a': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset); break; case 'b': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset); break; case 'h': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[6].cs_buf, mp_sys[6].cs_len, mp_usr, mp_usr_offset); break; case 'H': rc = mp_add_cs_buf (hashcat_ctx, mp_sys[7].cs_buf, mp_sys[7].cs_len, mp_usr, mp_usr_offset); break; case '1': if (mp_usr[0].cs_len == 0) { event_log_error (hashcat_ctx, "Custom-charset 1 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset); break; case '2': if (mp_usr[1].cs_len == 0) { event_log_error (hashcat_ctx, "Custom-charset 2 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset); break; case '3': if (mp_usr[2].cs_len == 0) { event_log_error (hashcat_ctx, "Custom-charset 3 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset); break; case '4': if (mp_usr[3].cs_len == 0) { event_log_error (hashcat_ctx, "Custom-charset 4 is undefined."); return -1; } rc = mp_add_cs_buf (hashcat_ctx, mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset); break; case '?': rc = mp_add_cs_buf (hashcat_ctx, &p0, 1, mp_usr, mp_usr_offset); break; default: event_log_error (hashcat_ctx, "Syntax error: %s", in_buf); return -1; } if (rc == -1) return -1; } else { if (user_options->hex_charset == true) { in_pos++; if (in_pos == in_len) { event_log_error (hashcat_ctx, "The hex-charset option expects exactly 2 hexadecimal chars. Failed mask: %s", in_buf); return -1; } u32 p1 = in_buf[in_pos] & 0xff; if ((is_valid_hex_char ((u8) p0) == false) || (is_valid_hex_char ((u8) p1) == false)) { event_log_error (hashcat_ctx, "Invalid hex character detected in mask %s", in_buf); return -1; } u32 chr = 0; chr = (u32) hex_convert ((u8) p1) << 0; chr |= (u32) hex_convert ((u8) p0) << 4; const int rc = mp_add_cs_buf (hashcat_ctx, &chr, 1, mp_usr, mp_usr_offset); if (rc == -1) return -1; } else { u32 chr = p0; const int rc = mp_add_cs_buf (hashcat_ctx, &chr, 1, mp_usr, mp_usr_offset); if (rc == -1) return -1; } } } return 0; }