gpt4 book ai didi

assembly - imul 指令的第三个操作数是内存地址,它的原始值是多少?

转载 作者:行者123 更新时间:2023-12-04 00:00:13 24 4
gpt4 key购买 nike

我目前正在从游戏中反转哈希函数并遇到了这个问题:

Game.exe+1F745D - 69 C0 93 01 00 01 - imul eax,eax,Game.exe+C00193

指令本身不是问题,它的符号乘以三个操作数:destination、source1 和 source2。 Source1 和 Source2 相乘,结果存储在目标操作数中。

当我试图对此进行逆向工程时,我想知道这个操作码在源代码中会是什么样子?
我怀疑开发人员将 BASE_ADDRESS+C00193 放在他们的代码中...?
(那个游戏的基地址是 0x00400000 btw,如果重要的话,地址是静态的)

游戏将哈希函数的结果与硬编码值进行比较。所以我认为游戏开发者不太可能想要一个不可预测的结果。

Afaik 第三个操作数是一个立即数,如果我没记错的话,这意味着它“按原样”对待第三个操作数。所以第三个操作数的值不是那个内存地址的值(应该是0),而是base_address+C00193的总和。

所以当我在我的代码中执行此操作时:hash *= 0x00400000 + 0xc00193; 它确实有效,但原始源代码中的值是什么?
我已经对该功能进行了完整的工作实现,如果需要,我可以发布。

最佳答案

我的猜测是反汇编程序在这里尝试变得聪明并假设常量是内存地址,但实际上它可能不是。从技术上讲,内存地址也只是一个数字。如果它们“看起来像一个”,反汇编器将尝试将它们显示为内存地址。 (在许多情况下,这些启发式方法非常有用,但有时它们可​​能会产生误导。)根据您发布的字节 (93 01 00 01),它实际上是 0x1000193

所以原来的代码大概是:

hash *= 0x1000193

这表明它是 32 位 FNV hash函数,像这样:

uint32_t fnv32hash(const std::string& str) {
uint32_t hash = 0x811c9dc5;
const uint32_t primeVal = 0x1000193;

for(int i = 0; i < str.size(); i++) {
uint8_t byte = str[i];
hash ^= byte;
hash *= primeVal; // Here is your imul instruction!
}

return hash;
}

关于assembly - imul 指令的第三个操作数是内存地址,它的原始值是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62778926/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com