簡體   English   中英

imul 指令的第三個操作數是 memory 地址,它的原始值是多少?

[英]Third operand of imul instruction is a memory address, what was its original value?

我目前正在從游戲中反轉 hash function 並遇到了這個:

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

指令本身不是問題,它與三個操作數多重簽名:目標、源1和源2。 Source1 和 Source2 相乘,結果存儲在目標操作數中。

當我試圖對此進行逆向工程時,我想知道這個操作碼在源代碼中會是什么樣子?
我懷疑開發人員將BASE_ADDRESS+C00193放在他們的代碼中......?
(那個游戲的基地址是 0x00400000 btw,如果重要的話,地址是 static)

游戲將 hash function 的結果與硬編碼值進行比較。 所以我認為游戲開發者不太可能想要一個不可預測的結果。

Afaik 第三個操作數是一個立即值,如果我沒記錯的話,這意味着它“按原樣”對待第三個操作數。 所以第三個操作數的值不是那個 memory 地址的值(應該是 0),而是 base_address+C00193 的總和。

所以當我在我的代碼中這樣做時: hash *= 0x00400000 + 0xc00193; 它確實有效,但原始源代碼中的價值是什么?
我已經完全實現了 function,如果需要我可以發布。

我的猜測是反匯編程序在這里試圖變得聰明並假設常量是 memory 地址,但實際上它可能不是。 從技術上講,memory 地址也只是一個數字。 如果它們“看起來像一個”,反匯編器將嘗試將它們顯示為 memory 地址。 (在許多情況下,這些啟發式方法非常有用,但有時它們可能會產生誤導。)根據您發布的字節( 93 01 00 01 ),它實際上是0x1000193

所以原始代碼可能是:

hash *= 0x1000193

這表明它是一個 32 位FNV hash function,如下所示:

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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM