Python实现ROR算法计算字符串哈希时为何漏掉最后一个字符
问题根因
你使用的是Windows shellcode场景下常用的API哈希算法,出现结果偏差由两个问题共同导致:
- 该算法要求将字符串末尾的空终止符
\0(数值为0)作为独立字符参与哈希计算,你当前的代码仅遍历了字符串的可打印字符,遗漏了这个额外的空字符 - Python的整数为高精度无溢出类型,而该算法基于32位无符号整数设计,运算过程中没有做32位截断,会导致数值超出预期范围
修正后代码
def ROR(data, shift, size=32): shift %= size data &= 0xFFFFFFFF body = data >> shift remains = (data << (size - shift)) & 0xFFFFFFFF return (body + remains) & 0xFFFFFFFF def calculateHash(apiName): result = 0 for ch in apiName: result = ROR(result, 0x13) result += ord(ch) result &= 0xFFFFFFFF # 补充处理末尾的空终止符 result = ROR(result, 0x13) result += 0 result &= 0xFFFFFFFF return result
调用calculateHash("timeGetTime")即可得到正确结果0xFF407C2F。
补充说明
你观察到的“循环在末尾'e'处停止”属于误判,循环已经完整遍历了字符串的所有可打印字符,问题本质是算法要求多处理一个空终止符,不是循环逻辑异常。
内容的提问来源于stack exchange,提问作者Raafat
相关产品推荐
相关产品推荐

