#include <stdio.h>
#include <string.h>
typedef unsigned long ulong;
typedef unsigned char uchar;
ulong rotr(unsigned long n, int s){
return (n >> s) | (n << (32 - s));
}
ulong hash_str(char* str, int len){
ulong hash = 0;
do{
/* Get current char */
unsigned char currentChar = *str++;
/* Get rid of lowercase shit */
if(currentChar >= 97)
currentChar -= 32;
hash = currentChar + rotr(hash, 13);
len--;
}while(len);
return hash;
}
ulong x65559(uchar* str){
unsigned long hash = 0;
int c;
while ((c = *str++))
hash = c + (hash << 6) + (hash << 16) - hash;
return hash;
}
int main(void) {
// char str[] = "kernel32.dll";
// char str[] = "k\x00e\x00r\x00n\x00e\x00l\x003\x002\x00.\x00d\x00l\x00l";
char str[] = { 'k', 0, 'e', 0, 'r', 0, 'n', 0, 'e', 0, 'l', 0, '3', 0, '2', 0, '.', 0, 'd', 0, 'l', 0, 'l', 0 };
int len = sizeof(str);
printf("hashed '%s' (length: %d) is %08X\n", str, len, hash_str(str, len));
printf("x65559 hashes: %s is %08X", "BaseThreadInitThunk", x65559((uchar*) "BaseThreadInitThunk"));
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KCnR5cGVkZWYgdW5zaWduZWQgbG9uZyB1bG9uZzsKdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHVjaGFyOwoKdWxvbmcgcm90cih1bnNpZ25lZCBsb25nIG4sIGludCBzKXsKCXJldHVybiAobiA+PiBzKSB8IChuIDw8ICgzMiAtIHMpKTsKfQoKdWxvbmcgaGFzaF9zdHIoY2hhciogc3RyLCBpbnQgbGVuKXsKCXVsb25nIGhhc2ggPSAwOwoKCWRvewoJCS8qIEdldCBjdXJyZW50IGNoYXIgKi8KCQl1bnNpZ25lZCBjaGFyIGN1cnJlbnRDaGFyID0gKnN0cisrOwoJCS8qIEdldCByaWQgb2YgbG93ZXJjYXNlIHNoaXQgKi8KCQlpZihjdXJyZW50Q2hhciA+PSA5NykKCQkJY3VycmVudENoYXIgLT0gMzI7CgkJaGFzaCA9IGN1cnJlbnRDaGFyICsgcm90cihoYXNoLCAxMyk7CgkJbGVuLS07Cgl9d2hpbGUobGVuKTsKCQoJcmV0dXJuIGhhc2g7Cn0KCnVsb25nIHg2NTU1OSh1Y2hhciogc3RyKXsKICAgIHVuc2lnbmVkIGxvbmcgaGFzaCA9IDA7CiAgICBpbnQgYzsKCiAgICB3aGlsZSAoKGMgPSAqc3RyKyspKQogICAgICAgIGhhc2ggPSBjICsgKGhhc2ggPDwgNikgKyAoaGFzaCA8PCAxNikgLSBoYXNoOwoKICAgIHJldHVybiBoYXNoOwp9CgppbnQgbWFpbih2b2lkKSB7CgkvLyBjaGFyIHN0cltdID0gImtlcm5lbDMyLmRsbCI7CgkvLyBjaGFyIHN0cltdID0gImtceDAwZVx4MDByXHgwMG5ceDAwZVx4MDBsXHgwMDNceDAwMlx4MDAuXHgwMGRceDAwbFx4MDBsIjsKCWNoYXIgc3RyW10gPSB7ICdrJywgMCwgJ2UnLCAwLCAncicsIDAsICduJywgMCwgJ2UnLCAwLCAnbCcsIDAsICczJywgMCwgJzInLCAwLCAnLicsIDAsICdkJywgMCwgJ2wnLCAwLCAnbCcsIDAgfTsKCWludCBsZW4gPSBzaXplb2Yoc3RyKTsKCQoJcHJpbnRmKCJoYXNoZWQgJyVzJyAobGVuZ3RoOiAlZCkgaXMgJTA4WFxuIiwgc3RyLCBsZW4sIGhhc2hfc3RyKHN0ciwgbGVuKSk7CglwcmludGYoIng2NTU1OSBoYXNoZXM6ICVzIGlzICUwOFgiLCAiQmFzZVRocmVhZEluaXRUaHVuayIsIHg2NTU1OSgodWNoYXIqKSAiQmFzZVRocmVhZEluaXRUaHVuayIpKTsKCQoJcmV0dXJuIDA7Cn0K