c - 了解反编译的汇编代码

标签 c assembly int32

我试图从汇编中理解这段代码,

int32_t phase_5(char * str) {
    int32_t v1 = 0;
    if (strlen(str) != 4) {
        // 0x8049153
        alert_henchmen(5);
        v1 = 0;
        // branch -> 0x80491a6
    }
    while (true) {
        int32_t * v2 = (int32_t *)(4 * v1 + (int32_t)&g2); // 0x8049192_0
        char * v3 = (char *)(v1 + (int32_t)str);
        int32_t v4 = 0;
        int32_t v5 = 0; // 0x01516
        // branch -> 0x8049175
        int32_t v6; // bp+014
        while (true) {
            char v7 = *(char *)(v4 + (int32_t)"4l6aiqhor20x"); // 0x8049188
            v6 = v5;
            if ((int32_t)*v3 == (int32_t)v7) {
                // 0x804918f
                v6 = *v2 == v4 ? 1 : v5;
                // branch -> 0x80491a2
            }
            int32_t v8 = v4 + 1; // 0x80491a2
            if (v8 >= 12) {
                // break -> 0x80491ac
                break;
            }
            v4 = v8;
            v5 = v6;
            // continue -> 0x8049175
        }
        // 0x80491ac
        if (v6 % 256 != 1) {
            // 0x80491b7
            alert_henchmen(5);
            // branch -> 0x80491c3
        }
        int32_t v9 = v1 + 1; // 0x80491c3
        if (v9 >= 4) {
            // break -> 0x80491cd
            break;
        }
        v1 = v9;
        // continue -> 0x80491a6
    }
    // 0x80491cd
    return confirm_phase(5, str);
}

我只是不确定这一行的作用:

int32_t * v2 = (int32_t *)(4 * v1 + (int32_t)&g2) 

还有这一行:

char v7 = *(char *)(v4 + (int32_t)"4l6aiqhor20x")

int32_t 是什么意思?

最佳答案

我不太确定你的问题是什么,但我会尽力帮助回答,解释说当程序员编写某些内容时,他或她知道的每一行都有一个目的 - 例如,如果他们想要写一条消息,他们可能会调用变量“myMessage”。不过,此信息并未包含在最终结果中。因此,反编译器不知道将其称为“myMessage”,而只会分配一个内存地址(由 & 引用表示)或随机变量名称(由上面的 v 表示)。通过一些详细的检查,你可以弄清楚这部分代码具体是做什么的,但是如果没有像“myMessage”这样的提示,你可能必须处理并绘制出整个程序才能真正理解它。

对于代码行: int32_t * v2 = (int32_t *)(4 * v1 + (int32_t)&g2)

只能说取4,乘以v1,加到变量g2的地址上。结果是存储在 v2 中的 32 位地址。因为这里没有任何引用说明 g2 是什么,所以您可能会开始在我的回答中看到基本原理。由于它是 32 位(4 字节),这可以解释乘以 4,并且 v1 可能是一个计数器。

关于c - 了解反编译的汇编代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43024940/

相关文章:

c - 十六进制到十进制的转换

assembly - 更改 %esp 的值是否会从堆栈中删除值?

linux - 为什么 64 位寻址中的 sys_write 调用可以与用于 32 位寻址的寄存器中的参数一起正常工作

c# - int 到字节数组

swift - 如何快速将 Int32 值转换为 CGFloat?

C++:将 uint32 设置为 int32(负值)

c - 使用套接字发送/接收字符串

c++ - glPointSize 不起作用

c - 将每行末尾的元素追加到文件中

c++ - avr asm 从变量输出到端口