aboutsummaryrefslogtreecommitdiff
path: root/source/crypt_strings.c
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2020-05-24 16:48:22 +0200
committerToni Uhlig <matzeton@googlemail.com>2020-05-25 21:57:14 +0200
commit31c69b6ca1b91e7fd9fd8e14082fd2584c5f538c (patch)
tree16e789c7d68608831b498f41f54d9482b82a711a /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.c189
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