news 2026/6/12 16:50:58

3.多条件 if 语句执行流程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
3.多条件 if 语句执行流程

文章目录

    • 一、先把原始代码和汇编摆在桌面上
      • 原始 C 代码(不改)
      • 对应的关键汇编(不改,仅截取核心逻辑)
    • 二、第一眼扫过去:这不是 switch,是一条 if-else 链
    • 三、从第一个 if 开始,对着汇编“反着读逻辑”
    • 四、else if 的本质:上一个条件失败后,立刻 cmp 下一个阈值
    • 五、看到补码就要警觉:开始进入负数区间判断
    • 六、没有 cmp 的那一段:这就是 else
    • 七、把整个 if-else 链“反推”成一张逻辑表
    • 八、一句话总结这类结构的“逆向直觉”

一、先把原始代码和汇编摆在桌面上

原始 C 代码(不改)

intcheckNumber(intnum){intresult;if(num>1000)result=10000;elseif(num>500)result=5000;elseif(num>100)result=1000;elseif(num>50)result=500;elseif(num>0)result=100;elseif(num==0)result=0;elseif(num>-50)result=-100;elseif(num>-100)result=-500;elseif(num>-500)result=-1000;elseresult=-5000;returnresult;}

对应的关键汇编(不改,仅截取核心逻辑)

002F1576 cmp dword ptr [ebp+8],3E8h 002F157D jle 002F158B 002F157F mov dword ptr [ebp-4],2710h 002F1586 jmp 002F1610 002F158B cmp dword ptr [ebp+8],1F4h 002F1592 jle 002F159D 002F1594 mov dword ptr [ebp-4],1388h 002F159B jmp 002F1610 002F159D cmp dword ptr [ebp+8],64h 002F15A4 jle 002F15AF 002F15A6 mov dword ptr [ebp-4],3E8h 002F15AD jmp 002F1610 002F15AF cmp dword ptr [ebp+8],32h 002F15B6 jle 002F15C1 002F15B8 mov dword ptr [ebp-4],1F4h 002F15BF jmp 002F1610 002F15C1 cmp dword ptr [ebp+8],0 002F15C5 jle 002F15CF 002F15C7 mov dword ptr [ebp-4],64h 002F15CE jmp 002F1610 002F15CF cmp dword ptr [ebp+8],0 002F15D3 jne 002F15D9 002F15D5 mov dword ptr [ebp-4],0 002F15DC jmp 002F1610 002F15D9 cmp dword ptr [ebp+8],0FFFFFFCEh 002F15DD jle 002F15E8 002F15DF mov dword ptr [ebp-4],0FFFFFF9Ch 002F15E6 jmp 002F1610 002F15E8 cmp dword ptr [ebp+8],0FFFFFF9Ch 002F15EC jle 002F15F7 002F15EE mov dword ptr [ebp-4],0FFFFFE0Ch 002F15F5 jmp 002F1610 002F15F7 cmp dword ptr [ebp+8],0FFFFFE0Ch 002F15FB jle 002F1606 002F15FD mov dword ptr [ebp-4],0FFFFFC18h 002F1604 jmp 002F1610 002F1606 mov dword ptr [ebp-4],0FFFFEC78h 002F1610 mov eax,dword ptr [ebp-4]

二、第一眼扫过去:这不是 switch,是一条 if-else 链

我在 IDA 里第一眼看到这段的时候,并没有逐条翻译,而是先看结构:

  • [ebp+8]被反复cmp

  • 每次cmp后面紧跟条件跳转

  • 每个分支一旦命中,都会:

    • mov [ebp-4], 常量

    • jmp 002F1610

  • 002F1610所有路径都会汇合的统一出口

这在逆向里基本是一个信号:

这是“线性 if → else if → else”的经典编译形态。


三、从第一个 if 开始,对着汇编“反着读逻辑”

cmp dword ptr [ebp+8],3E8h jle 002F158B

这里非常关键的一点是:

  • C 里写的是if (num > 1000)

  • 汇编里判断的是“不满足就跳走”

也就是说:

  • jle跳走 → 条件失败 → 去试下一个 else if

  • 不跳 → 条件成立 → 执行赋值

mov dword ptr [ebp-4],2710h ; result = 10000 jmp 002F1610

到这里,第一个 if 分支已经完全闭合


四、else if 的本质:上一个条件失败后,立刻 cmp 下一个阈值

002F158B cmp dword ptr [ebp+8],1F4h 002F1592 jle 002F159D

我在这里通常会做一件事:

看上一个jle的目标地址,是不是正好跳到这里。

一对上,结构就彻底清楚了:

  • 失败 → 跳到下一个 cmp

  • 成功 → 赋值 → 跳统一出口

mov dword ptr [ebp-4],1388h ; result = 5000 jmp 002F1610

这就是:

elseif(num>500)

后面的num > 100 / 50 / 0分支,全都是同一个套路,只是阈值和结果不同。


五、看到补码就要警觉:开始进入负数区间判断

cmp dword ptr [ebp+8],0FFFFFFCEh jle 002F15E8

0xFFFFFFCE是什么?

  • 补码

  • 转成有符号:-50

再看赋值:

mov dword ptr [ebp-4],0FFFFFF9Ch ; -100

这一步在逆向时非常“顺”:

结构没变,只是常量换成了负数。

说明 C 里的逻辑大概是:

elseif(num>-50)result=-100;

后面的-100 / -500分支,完全同理。


六、没有 cmp 的那一段:这就是 else

002F1606 mov dword ptr [ebp-4],0FFFFEC78h

这里有两个非常明显的信号:

  • 前面没有任何比较

  • 执行完就自然落到返回点

这说明:

这是所有条件都失败之后的兜底分支

也就是:

elseresult=-5000;

七、把整个 if-else 链“反推”成一张逻辑表

这是我在逆向里经常做的最后一步,用来确认自己没有看漏条件:

条件result
num > 100010000
num > 5005000
num > 1001000
num > 50500
num > 0100
num == 00
num > -50-100
num > -100-500
num > -500-1000
else-5000

如果这张表能完整整理出来,说明这个函数已经被你完全逆向成功


八、一句话总结这类结构的“逆向直觉”

只要在反汇编里看到:同一个变量被一串cmp连续比较,每个分支内部“赋值 + jmp 同一个出口”,最后还有一个自然落地的分支,那它几乎一定是一个多条件 if-else if-else。

#include<iostream>intcheckNumber(intnum){intresult;// 多条件 if-else if-else 语句if(num>1000){result=10000;}elseif(num>500){result=5000;}elseif(num>100){result=1000;}elseif(num>50){result=500;}elseif(num>0){result=100;}elseif(num==0){result=0;}elseif(num>-50){// 负数的判断,从靠近0的开始result=-100;}elseif(num>-100){result=-500;}elseif(num>-500){result=-1000;}else{result=-5000;}returnresult;}intmain(){// 测试不同的数字inttestNumbers[]={1500,750,200,75,25,0,-25,-75,-150,-300,-1000};intsize=sizeof(testNumbers)/sizeof(testNumbers[0]);std::cout<<"多条件判断测试结果:"<<std::endl;std::cout<<"===================="<<std::endl;for(inti=0;i<size;i++){intresult=checkNumber(testNumbers[i]);std::cout<<"checkNumber("<<testNumbers[i]<<") = "<<result<<std::endl;}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/6 17:30:08

5个多模态模型对比:Qwen3-VL云端实测2小时搞定

5个多模态模型对比&#xff1a;Qwen3-VL云端实测2小时搞定 引言&#xff1a;为什么需要多模态模型&#xff1f; 想象一下&#xff0c;你正在教一个小朋友认识世界。如果只给他看文字书&#xff0c;他可能知道"苹果"这个词&#xff0c;但看到实物时却认不出来&#…

作者头像 李华
网站建设 2026/6/6 18:59:15

HY-MT1.5-1.8B与Google Translate对比:开源模型能否逆袭?实战评测

HY-MT1.5-1.8B与Google Translate对比&#xff1a;开源模型能否逆袭&#xff1f;实战评测 在大模型驱动的机器翻译领域&#xff0c;闭源商业API长期占据主导地位。然而&#xff0c;随着国内厂商技术积累的加速&#xff0c;开源翻译模型正逐步打破这一格局。腾讯近期推出的混元…

作者头像 李华
网站建设 2026/6/11 9:53:49

HY-MT1.5部署日志分析:错误排查与性能诊断实战

HY-MT1.5部署日志分析&#xff1a;错误排查与性能诊断实战 随着多语言交流需求的不断增长&#xff0c;高质量、低延迟的翻译模型成为智能应用的核心组件。腾讯开源的混元翻译大模型 HY-MT1.5 系列&#xff0c;凭借其在多语言支持、边缘部署能力和翻译质量上的综合优势&#xf…

作者头像 李华
网站建设 2026/6/12 16:42:01

HY-MT1.5如何提升翻译一致性?格式化输出实战优化

HY-MT1.5如何提升翻译一致性&#xff1f;格式化输出实战优化 1. 引言&#xff1a;腾讯开源的混元翻译大模型HY-MT1.5 随着全球化进程加速&#xff0c;高质量、高一致性的机器翻译需求日益增长。传统翻译模型在处理专业术语、上下文依赖和格式保留等复杂场景时往往表现不佳&am…

作者头像 李华
网站建设 2026/6/12 11:50:59

腾讯HY-MT1.5实战:多语言网站本地化方案

腾讯HY-MT1.5实战&#xff1a;多语言网站本地化方案 随着全球化业务的不断扩展&#xff0c;多语言网站的本地化需求日益增长。传统翻译服务在成本、延迟和定制化方面存在诸多瓶颈&#xff0c;而大模型驱动的机器翻译正成为破局关键。腾讯近期开源的混元翻译模型 HY-MT1.5 系列…

作者头像 李华
网站建设 2026/6/10 21:32:43

Qwen3-VL深度体验:1块钱解锁16G显存,个人开发首选

Qwen3-VL深度体验&#xff1a;1块钱解锁16G显存&#xff0c;个人开发首选 1. 为什么Qwen3-VL是个人开发者的福音 作为一名长期在AI领域摸爬滚打的开发者&#xff0c;我深知视觉语言模型对硬件资源的苛刻要求。传统方案要么需要昂贵的专业显卡&#xff0c;要么在云端GPU上花费…

作者头像 李华