news 2026/5/1 11:35:54

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/5/1 4:07:05

Qwen3-VL API测试:云端1小时快速验证,成本不到2块钱

Qwen3-VL API测试&#xff1a;云端1小时快速验证&#xff0c;成本不到2块钱 1. 为什么需要云端快速测试Qwen3-VL API&#xff1f; 作为软件工程师&#xff0c;当你需要测试Qwen3-VL这类多模态大模型的API响应速度时&#xff0c;往往会遇到两个现实问题&#xff1a; 本地硬件…

作者头像 李华
网站建设 2026/5/1 4:05:10

HY-MT1.5-1.8B性能测试:小模型的大作为全解析

HY-MT1.5-1.8B性能测试&#xff1a;小模型的大作为全解析 随着多语言交流需求的不断增长&#xff0c;高质量、低延迟的翻译模型成为智能应用落地的关键。腾讯近期开源了混元翻译模型1.5版本&#xff08;HY-MT1.5&#xff09;&#xff0c;其中包含两个核心模型&#xff1a;HY-M…

作者头像 李华
网站建设 2026/5/1 4:06:15

如何提升HY-MT1.5翻译准确率?上下文翻译功能调优实战教程

如何提升HY-MT1.5翻译准确率&#xff1f;上下文翻译功能调优实战教程 在多语言交流日益频繁的今天&#xff0c;高质量的机器翻译模型成为跨语言沟通的核心基础设施。腾讯开源的混元翻译大模型 HY-MT1.5 系列&#xff0c;凭借其卓越的翻译性能和对复杂场景的支持能力&#xff0…

作者头像 李华
网站建设 2026/5/1 4:07:36

HY-MT1.5-7B术语库管理API:动态更新实现方案

HY-MT1.5-7B术语库管理API&#xff1a;动态更新实现方案 1. 引言 随着全球化进程的加速&#xff0c;高质量、多语言互译能力成为企业出海、内容本地化和跨文化交流的核心需求。腾讯开源的混元翻译大模型 HY-MT1.5 系列&#xff0c;凭借其在翻译质量、多语言支持与场景适应性方…

作者头像 李华
网站建设 2026/5/1 4:08:54

HY-MT1.5如何实现上下文翻译?多句连贯推理部署教程

HY-MT1.5如何实现上下文翻译&#xff1f;多句连贯推理部署教程 1. 引言&#xff1a;腾讯开源的轻量级高性能翻译大模型 随着全球化进程加速&#xff0c;高质量、低延迟的机器翻译需求日益增长。传统翻译服务往往依赖云端计算&#xff0c;存在隐私泄露、网络延迟和成本高等问题…

作者头像 李华
网站建设 2026/5/1 4:06:17

HY-MT1.5混合语言处理:方言翻译实战案例

HY-MT1.5混合语言处理&#xff1a;方言翻译实战案例 1. 引言&#xff1a;腾讯开源的混元翻译新标杆 随着全球化进程加速和多语言交流需求激增&#xff0c;高质量、低延迟的机器翻译系统成为智能应用的核心基础设施。传统翻译模型在面对混合语言输入&#xff08;如中英夹杂&am…

作者头像 李华