news 2026/1/26 8:33:17

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/1/26 0:35:19

Mac用户福音:Qwen3-VL云端WebUI,不买显卡也能玩多模态AI

Mac用户福音&#xff1a;Qwen3-VL云端WebUI&#xff0c;不买显卡也能玩多模态AI 1. 为什么Mac用户需要Qwen3-VL云端WebUI 作为一名UI设计师&#xff0c;你是否经常遇到这样的困扰&#xff1a;看到同行用AI视觉模型生成惊艳的设计灵感&#xff0c;但自己的MacBook Pro却因为显…

作者头像 李华
网站建设 2026/1/15 10:56:53

Qwen3-VL教学实验室方案:30名学生同时体验不超预算

Qwen3-VL教学实验室方案&#xff1a;30名学生同时体验不超预算 引言 作为一名大学讲师&#xff0c;设计AI课程实验时最头疼的就是硬件资源不足。最近我想让全班30名学生同时体验Qwen3-VL多模态大模型&#xff0c;但学校机房配置太低&#xff0c;申请新设备审批要等到下学期。…

作者头像 李华
网站建设 2026/1/14 23:52:36

Hunyuan-HY-MT1.5开源价值:可审计、可定制的翻译模型部署优势

Hunyuan-HY-MT1.5开源价值&#xff1a;可审计、可定制的翻译模型部署优势 随着全球化进程加速&#xff0c;高质量、低延迟的机器翻译需求日益增长。然而&#xff0c;主流商业翻译服务在数据隐私、定制化能力和部署灵活性方面存在明显局限。腾讯推出的开源翻译大模型 HY-MT1.5 …

作者头像 李华
网站建设 2026/1/23 14:59:03

学长亲荐9个AI论文写作软件,研究生轻松搞定毕业论文!

学长亲荐9个AI论文写作软件&#xff0c;研究生轻松搞定毕业论文&#xff01; AI 工具如何让论文写作更高效&#xff1f; 在研究生阶段&#xff0c;论文写作往往成为最大的挑战之一。无论是开题报告、文献综述还是最终的毕业论文&#xff0c;都需要大量的时间与精力投入。而随着…

作者头像 李华
网站建设 2026/1/19 6:10:31

腾讯开源HY-MT1.5部署:Kubernetes集群方案

腾讯开源HY-MT1.5部署&#xff1a;Kubernetes集群方案 1. 引言 1.1 开源翻译模型的演进与挑战 随着全球化进程加速&#xff0c;高质量、低延迟的机器翻译需求日益增长。传统云服务依赖高带宽和中心化算力&#xff0c;难以满足边缘侧实时翻译、隐私保护和多语言混合场景的需求…

作者头像 李华
网站建设 2026/1/15 10:26:13

HY-MT1.5部署自动化:CI/CD流水线集成实战案例

HY-MT1.5部署自动化&#xff1a;CI/CD流水线集成实战案例 随着多语言内容在全球范围内的快速增长&#xff0c;高质量、低延迟的翻译模型部署成为企业出海、跨语言服务和本地化业务的核心需求。腾讯开源的混元翻译大模型HY-MT1.5系列&#xff0c;凭借其在翻译质量、多语言支持与…

作者头像 李华