static int findrev(Revlog *rl, char *name) { uchar hash[HASHSZ]; int n, i, rev; char *s; if(strcmp(name, "tip") == 0) return rl->nmap-1; rev = strtol(name, &s, 10); if(s > name && (*s == 0 || ispunct(*s))) return rev; rev = -1; if(s = strchr(name, '.')) name = s+1; if((n = hex2hash(name, hash)) > 0){ for(i=0; i<rl->nmap; i++){ if(memcmp(rl->map[i].hash, hash, n) == 0){ if(rev < 0) rev = i; else { rev = -1; break; } } } } return rev; }
int readhash(char *path, char *name, uchar hash[]) { char buf[MAXPATH], *p; int n; snprint(buf, sizeof(buf), "%s/%s", path, name); readfile(buf, buf, sizeof(buf)); if(p = strchr(buf, '.')) p++; else p = buf; n = hex2hash(p, hash); if(n != HASHSZ) return -1; return 0; }
int main(int argc, char** argv) { if (argc == 1 || !strcmp(argv[1], "--help") || !strcmp(argv[1], "-h")) { usage(argc, argv); exit(0); } else if (!strcmp(argv[1], "--version") || !strcmp(argv[1], "-v")) { printf("ltcrack\n"); printf("Compiled on %s at %s\n", __DATE__, __TIME__); exit(0); } if (argc < 4) { usage(argc, argv); exit(1); } Target ttype; char* tstr = argv[1]; if (strcmp(tstr, "-x") == 0 || strcmp(tstr, "--hash") == 0) ttype = T_HASH; else if (strcmp(tstr, "-f") == 0 || strcmp(tstr, "--file") == 0) ttype = T_FILE; else if (strcmp(tstr, "-r") == 0 || strcmp(tstr, "--random") == 0) ttype = T_RAND; else ERROR("Invalid target '%s'\n", tstr); char* tparam = argv[2]; // load tables n_lt = argc-3; lt = malloc(sizeof(LTable) * n_lt); assert(lt); for (u32 i = 0; i < n_lt; i++) if (!LTable_FromFile(<[i], argv[i+3])) ERROR("Could no load table '%s'\n", argv[i+3]) // some parameters u32 l_string = lt[0].l_string; char* charset = lt[0].charset; u32 n_charset = lt[0].n_charset; // some buffers char hash[16]; bufstr = malloc(l_string); assert(bufstr); // try and crack hash(es) switch (ttype) { case T_HASH: hex2hash(tparam, hash, 16); if (reverseHash(hash)) { printHash(hash, 16); printf(" "); printString(bufstr, l_string); printf("\n"); } else printf("Could not reverse hash\n"); break; case T_FILE: (void) 0; FILE* f = strcmp(tparam, "-") == 0 ? stdin : fopen(tparam, "r"); assert(f); while (1) { char hashstr[33]; fread(hashstr, 1, 33, f); if (feof(f)) break; hex2hash(hashstr, hash, 16); if (reverseHash(hash)) { printHash(hash, 16); printf(" "); printString(bufstr, l_string); printf("\n"); } else printf("Could not reverse hash\n"); } fclose(f); break; case T_RAND: srandom(time(NULL)); u32 n = atoi(tparam); u32 n_crack = 0; for (u32 i = 0; i < n; i++) { for (u32 j = 0; j < l_string; j++) bufstr[j] = charset[random() % n_charset]; char hash[16]; MD5((u8*) hash, (u8*) bufstr, l_string); if (reverseHash(hash)) n_crack++; rewriteLine(); printf("%lu / %lu", n_crack, i+1); fflush(stdout); } printf("\n"); } free(bufstr); for (u32 i = 0; i < n_lt; i++) LTable_Delete(<[i]); free(lt); return 0; }