请求将switch语句的汇编指令转换为等价C代码并恢复case分支
我明白你现在的困扰——对着汇编猜switch分支确实容易摸不着头脑,下面给你一套实用的步骤,帮你把模糊的猜测变成准确的C代码:
先找到跳转表的位置
汇编里的switch绝大多数是用**跳转表(jump table)**实现的,你要找这类指令:比如x86里的jmp [eax + 0x10],或者x86-64里的lea rdx, [rip + jump_table]。跳转表是一块连续的内存,里面存的全是各个case分支的入口地址,找到它就找到了switch的核心。确定switch的判断变量
看跳转前的寄存器操作,比如mov eax, [ebp+var_8]或者mov ecx, [rdi+0x18],这个被加载到寄存器里用来计算跳转偏移的变量,就是switch里的判断值。另外注意有没有范围检查指令,比如cmp eax, 0x4加上ja default_case,这直接能告诉你case的取值范围是0到4,超出就走default。把每个跳转表项对应到case分支
把跳转表里的每个地址,对应到汇编里的代码块,然后把这些代码块翻译成C语句。比如某个地址对应的汇编是:case_1: mov [ebp+result], 0x1 jmp end_switch那对应的C代码就是
case 1: result = 1; break;。如果某个case里没有直接跳转到switch结尾的指令,那就是这个case没有break,会往下执行下一个case的逻辑,这点要特别注意。定位default分支
找那些不在跳转表覆盖范围内的分支,通常是跳转表判断后用ja/jb/jmp直接跳转到的代码块,这就是switch里的default逻辑。验证你的代码
把你写好的C代码编译成汇编(用gcc -S your_code.c或者clang -S your_code.c),和原汇编对比结构。如果跳转表的顺序、case的逻辑块都能对应上,那你的代码就基本没问题了。
内容的提问来源于stack exchange,提问作者416c6578616e646572204d6f72656e

