enowars5-service-stldoctor

STL-Analyzing A/D Service for ENOWARS5 in 2021
git clone https://git.sinitax.com/sinitax/enowars5-service-stldoctor
Log | Files | Refs | README | LICENSE | sfeed.txt

main.c (2265B)


      1#include <stdlib.h>
      2#include <string.h>
      3#include <stdio.h>
      4#include <stdint.h>
      5
      6#define MAXITER   256 * 100
      7#define MHASHLEN  40
      8#define MAX(x,y)  ((x) > (y) ? (x) : (y))
      9#define MIN(x,y)  ((x) < (y) ? (x) : (y))
     10
     11int
     12mhash(const char *str, size_t len)
     13{
     14	static char buf[MHASHLEN + 1];
     15	int i, k, v;
     16	char c, *bp;
     17
     18	if (!str || !*str) str = ".";
     19	if (len <= 0) return EXIT_FAILURE;
     20
     21	for (v = 0, i = 0; i < len; i++) v += str[i];
     22
     23	srand(v);
     24	for (bp = buf, i = 0; i < MHASHLEN / 2; i++)
     25		bp += sprintf(bp, "%02x", str[i % len] ^ (rand() % 256));
     26
     27	printf("%s\n", buf);
     28
     29	return EXIT_SUCCESS;
     30}
     31
     32int
     33hash()
     34{
     35	char str[256];
     36	size_t len;
     37
     38	if (!fgets(str, sizeof(str), stdin))
     39		return EXIT_FAILURE;
     40
     41	return mhash(str, strlen(str) - 1);
     42}
     43
     44int
     45revhash(const char *hashstr)
     46{
     47	char c, hexbuf[3] = { 0 }, *end, buf[256];
     48	int i, k, v, maxlen, sum, hash[256], sublen, aftersum;
     49
     50	if (strlen(hashstr) % 2 != 0)
     51		goto invalid;
     52	maxlen = strlen(hashstr) / 2;
     53
     54	/* convert hex to int array */
     55	for (i = 0; i < maxlen; i++) {
     56		memcpy(hexbuf, hashstr + 2 * i, 2);
     57		hash[i] = strtol(hexbuf, &end, 16);
     58		if (end && *end) goto invalid;
     59	}
     60
     61	/* bruteforce srand seed */
     62	for (i = 0; i < MAXITER; i++) {
     63		srand(i);
     64
     65		/* reverse chars for given sum */
     66		for (sum = i, k = 0; k < maxlen && sum > 0; k++) {
     67			buf[k] = (char) hash[k] ^ (rand() % 256);
     68			if (buf[k] < 0) break;
     69			sum -= buf[k];
     70		}
     71
     72		/* repeat if too short */
     73		if (k && sum == 0) {
     74			sublen = k;
     75			for (k = sublen; k < maxlen; k++) {
     76				buf[k] = (char) hash[k] ^ (rand() % 256);
     77				if (buf[k] < 0 || buf[k] != buf[k % sublen]) break;
     78			}
     79		} else {
     80			sublen = maxlen;
     81		}
     82
     83		if (k < maxlen) continue;
     84
     85		/* output first part we know */
     86		printf("%.*s", sublen, buf);
     87
     88		/* add rest of chars */
     89		while (sum > 0) {
     90			c = MIN(127, sum);
     91			printf("%c", c);
     92			sum -= c;
     93			buf[k++] = c;
     94		}
     95
     96		printf("\n");
     97
     98		if (getenv("OUTPUT_HASH"))
     99			mhash(buf, k);
    100
    101		return EXIT_SUCCESS;
    102	}
    103
    104	return EXIT_FAILURE;
    105
    106invalid:
    107	fprintf(stderr, "Invalid hash string!\n");
    108	return EXIT_FAILURE;
    109}
    110
    111int
    112main(int argc, const char **argv)
    113{
    114	if (argc < 2) {
    115		fprintf(stderr, "USAGE: revhash <hash>\n");
    116		return EXIT_FAILURE;
    117	}
    118
    119	if (!strcmp(argv[1], "hash"))
    120		return hash();
    121	else
    122		return revhash(argv[1]);
    123}