hash c语言算法
[C] 纯文本查看 复制代码 uint32_t hash(const char *s)
{
uint32_t seed = 3735928559;//0xDEADBEEF
uint32_t h = 3735928559;
while (*s) {
uint8_t c = *s++;
h = (h * c + c) ^ seed;
}
return h;
}
换成python:
[Python] 纯文本查看 复制代码 def hash_func(s):
hash = 0xDEADBEEF
for c in s:
c = ord(c)
hash = ((hash * c) + c) & 0xFFFFFFFF
hash ^= 0xDEADBEEF
return hash
print( hex(hash_func("xxxx")) == 0xA5C312F8)
貌似不能逆推出KeyGen(至少我不会,有大佬会的话希望能教教我)
只能暴力遍历
下面为暴力遍历的python代码:
[Python] 纯文本查看 复制代码 import string
import itertools
def hash_func(s):
hash = 0xDEADBEEF
for c in s:
c = ord(c)
hash = ((hash * c) + c) & 0xFFFFFFFF
hash ^= 0xDEADBEEF
return hash
TARGET = 0xA5C312F8
ALPHABET = string.printable.strip() # 可打印字符全集(不含空白)
MAX_LEN = 6 # 先试 1~6 位,可以改大
if __name__ == '__main__':
for length in range(1, MAX_LEN + 1):
print(f"length : {length}")
for s in itertools.product(ALPHABET, repeat=length):
cand = ''.join(s)
if hash_func(cand) == TARGET:
print(f'Found: {repr(cand)}')
return cand
print('Not found in current range.')
好吧,发现KeyGen至少大于等于5位,我不想等了。
算了,直接改判断吧,
将.text:00401179(特征码:75 16 6A 00 68 53)改为 74 xxxx
结果展示:
|