如何将给定反汇编代码逆向转为C代码?我的还原结果是否正确?
反汇编逆向还原结果判断
你的推测还原结果完全错误,具体原因如下:
- 首先逐行解析反汇编指令的语义:
movzx ecx, byte ptr [rax]:将rax作为内存地址,取出该地址存储的1字节无符号数据,零扩展为32位后存入ecx寄存器。这里操作的是rax指向的内存值,不是rax本身的数值。add ecx, 0FFFFFFFEh:32位模式下0FFFFFFFEh是-2的补码表示,等价于执行ecx = ecx - 2运算。cmp cl, 2:cl是ecx寄存器的低8位,该指令将减2后的低8位结果和2做比较,后续会搭配条件跳转指令实现分支判断。
- 你的推测存在两处核心错误:
- 操作对象识别错误:你将
[rax]的内存取值操作误以为是对rax寄存器本身的运算,原代码全程没有修改或直接比较rax寄存器的值。 - 运算逻辑完全错位:原逻辑是对rax指向的1字节无符号值做减2运算后和2比较,和你写的
rax - 2 > 2逻辑没有任何关联。
- 操作对象识别错误:你将
正确的还原逻辑可参考如下(假设rax是指向无符号8位整数的指针):
uint8_t *p = (uint8_t *)rax; uint8_t val = *p; // 比较逻辑取决于cmp后续的条件跳转指令,示例为大于2时进入分支的情况 if ((val - 2) > 2) { ... } // 上述判断等价于无符号场景下的 if (val > 4)
内容的提问来源于stack exchange,提问作者越峰裴
相关产品推荐
相关产品推荐

