From 8acf5b38797560de0613d77f7eb6d6daee578bcb Mon Sep 17 00:00:00 2001 From: jsteube Date: Mon, 25 Jul 2016 22:54:07 +0200 Subject: [PATCH] Add support for @ rule (RULE_OP_MANGLE_PURGECHAR) to use on GPU --- OpenCL/inc_rp.cl | 41 +++++++++++++++++++++++++++++++++++++--- docs/changes.txt | 1 + src/rp_kernel_on_cpu.c | 43 ++++++++++++++++++++++++++++++++++++++---- src/shared.c | 6 ++++-- 4 files changed, 82 insertions(+), 9 deletions(-) diff --git a/OpenCL/inc_rp.cl b/OpenCL/inc_rp.cl index 760ecee..b2059b0 100644 --- a/OpenCL/inc_rp.cl +++ b/OpenCL/inc_rp.cl @@ -1597,8 +1597,43 @@ inline u32 rule_op_mangle_replace (const u32 p0, const u32 p1, u32 buf0[4], u32 inline u32 rule_op_mangle_purgechar (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len) { - // TODO - return in_len; + u32 out_len = 0; + + u32 buf_in[8]; + + buf_in[0] = buf0[0]; + buf_in[1] = buf0[1]; + buf_in[2] = buf0[2]; + buf_in[3] = buf0[3]; + buf_in[4] = buf1[0]; + buf_in[5] = buf1[1]; + buf_in[6] = buf1[2]; + buf_in[7] = buf1[3]; + + u32 buf_out[8] = { 0 }; + + u8 *in = (u8 *) buf_in; + u8 *out = (u8 *) buf_out; + + for (u32 pos = 0; pos < in_len; pos++) + { + if (in[pos] == (u8) p0) continue; + + out[out_len] = in[pos]; + + out_len++; + } + + buf0[0] = buf_out[0]; + buf0[1] = buf_out[1]; + buf0[2] = buf_out[2]; + buf0[3] = buf_out[3]; + buf1[0] = buf_out[4]; + buf1[1] = buf_out[5]; + buf1[2] = buf_out[6]; + buf1[3] = buf_out[7]; + + return out_len; } inline u32 rule_op_mangle_togglecase_rec (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len) @@ -2490,7 +2525,7 @@ inline u32 apply_rule (const u32 name, const u32 p0, const u32 p1, u32 buf0[4], case RULE_OP_MANGLE_OVERSTRIKE: out_len = rule_op_mangle_overstrike (p0, p1, buf0, buf1, out_len); break; case RULE_OP_MANGLE_TRUNCATE_AT: out_len = rule_op_mangle_truncate_at (p0, p1, buf0, buf1, out_len); break; case RULE_OP_MANGLE_REPLACE: out_len = rule_op_mangle_replace (p0, p1, buf0, buf1, out_len); break; - //case RULE_OP_MANGLE_PURGECHAR: out_len = rule_op_mangle_purgechar (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_PURGECHAR: out_len = rule_op_mangle_purgechar (p0, p1, buf0, buf1, out_len); break; //case RULE_OP_MANGLE_TOGGLECASE_REC: out_len = rule_op_mangle_togglecase_rec (p0, p1, buf0, buf1, out_len); break; case RULE_OP_MANGLE_DUPECHAR_FIRST: out_len = rule_op_mangle_dupechar_first (p0, p1, buf0, buf1, out_len); break; case RULE_OP_MANGLE_DUPECHAR_LAST: out_len = rule_op_mangle_dupechar_last (p0, p1, buf0, buf1, out_len); break; diff --git a/docs/changes.txt b/docs/changes.txt index a1551c7..1cfe511 100644 --- a/docs/changes.txt +++ b/docs/changes.txt @@ -20,6 +20,7 @@ - Output cracked hashes on Windows using \r\n and not \n - Replace RegGetValue() with RegQueryValueEx() to enable Windows XP 32 bit compatibility - Slightly increased NVidias rule-processing performance by using generic instructions instead of byte_perm() +- Add support for @ rule (RULE_OP_MANGLE_PURGECHAR) to use on GPU ## ## Bugs diff --git a/src/rp_kernel_on_cpu.c b/src/rp_kernel_on_cpu.c index 3cc869c..36b2159 100644 --- a/src/rp_kernel_on_cpu.c +++ b/src/rp_kernel_on_cpu.c @@ -1663,13 +1663,48 @@ static u32 rule_op_mangle_replace (const u32 p0, const u32 p1, u32 buf0[4], u32 return in_len; } -/* static u32 rule_op_mangle_purgechar (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len) { - // TODO - return in_len; + u32 out_len = 0; + + u32 buf_in[8]; + + buf_in[0] = buf0[0]; + buf_in[1] = buf0[1]; + buf_in[2] = buf0[2]; + buf_in[3] = buf0[3]; + buf_in[4] = buf1[0]; + buf_in[5] = buf1[1]; + buf_in[6] = buf1[2]; + buf_in[7] = buf1[3]; + + u32 buf_out[8] = { 0 }; + + u8 *in = (u8 *) buf_in; + u8 *out = (u8 *) buf_out; + + for (u32 pos = 0; pos < in_len; pos++) + { + if (in[pos] == (u8) p0) continue; + + out[out_len] = in[pos]; + + out_len++; + } + + buf0[0] = buf_out[0]; + buf0[1] = buf_out[1]; + buf0[2] = buf_out[2]; + buf0[3] = buf_out[3]; + buf1[0] = buf_out[4]; + buf1[1] = buf_out[5]; + buf1[2] = buf_out[6]; + buf1[3] = buf_out[7]; + + return out_len; } +/* static u32 rule_op_mangle_togglecase_rec (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len) { // TODO @@ -2638,7 +2673,7 @@ u32 apply_rule (const u32 name, const u32 p0, const u32 p1, u32 buf0[4], u32 buf case RULE_OP_MANGLE_OVERSTRIKE: out_len = rule_op_mangle_overstrike (p0, p1, buf0, buf1, out_len); break; case RULE_OP_MANGLE_TRUNCATE_AT: out_len = rule_op_mangle_truncate_at (p0, p1, buf0, buf1, out_len); break; case RULE_OP_MANGLE_REPLACE: out_len = rule_op_mangle_replace (p0, p1, buf0, buf1, out_len); break; - //case RULE_OP_MANGLE_PURGECHAR: out_len = rule_op_mangle_purgechar (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_PURGECHAR: out_len = rule_op_mangle_purgechar (p0, p1, buf0, buf1, out_len); break; //case RULE_OP_MANGLE_TOGGLECASE_REC: out_len = rule_op_mangle_togglecase_rec (p0, p1, buf0, buf1, out_len); break; case RULE_OP_MANGLE_DUPECHAR_FIRST: out_len = rule_op_mangle_dupechar_first (p0, p1, buf0, buf1, out_len); break; case RULE_OP_MANGLE_DUPECHAR_LAST: out_len = rule_op_mangle_dupechar_last (p0, p1, buf0, buf1, out_len); break; diff --git a/src/shared.c b/src/shared.c index 0bb70b7..2d0b5f7 100644 --- a/src/shared.c +++ b/src/shared.c @@ -21139,7 +21139,8 @@ int cpu_rule_to_kernel_rule (char *rule_buf, uint rule_len, kernel_rule_t *rule) break; case RULE_OP_MANGLE_PURGECHAR: - return -1; + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0 (rule, rule_buf[rule_pos]); break; case RULE_OP_MANGLE_TOGGLECASE_REC: @@ -21358,7 +21359,8 @@ int kernel_rule_to_cpu_rule (char *rule_buf, kernel_rule_t *rule) break; case RULE_OP_MANGLE_PURGECHAR: - return -1; + rule_buf[rule_pos] = rule_cmd; + GET_P0 (rule); break; case RULE_OP_MANGLE_TOGGLECASE_REC: -- 2.25.1