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;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1140650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hunyuan开源模型能否商用?HY-MT1.5企业落地案例分享

Hunyuan开源模型能否商用&#xff1f;HY-MT1.5企业落地案例分享 1. 引言&#xff1a;从开源翻译到商业落地的现实挑战 随着大模型技术的快速演进&#xff0c;AI翻译正从“能用”迈向“好用”。腾讯混元团队推出的 HY-MT1.5 系列翻译模型&#xff0c;不仅在多个国际评测中表现亮…

HY-MT1.5-1.8B嵌入式部署:无人机多语言播报系统开发实录

HY-MT1.5-1.8B嵌入式部署&#xff1a;无人机多语言播报系统开发实录 随着人工智能在边缘计算场景的深入应用&#xff0c;轻量化大模型的落地成为智能硬件发展的关键突破口。特别是在无人机、移动巡检、跨境物流等需要实时交互的领域&#xff0c;多语言自动播报系统的需求日益增…

向量空间 AI 平台:让团队快速掌握 AI 开发能力

当AI应用开发成为企业数字化转型的核心竞争力&#xff0c;“如何让技术团队快速掌握AI开发能力”成了不少管理者的痛点——从零摸索成本高、团队水平参差不齐、实战经验难积累……而向量空间AI应用开发学习平台&#xff0c;正是瞄准这些痛点的解决方案。一、不止是“工具”&…

HY-MT1.5-1.8B GPU适配难?4090D单卡部署保姆级图文教程

HY-MT1.5-1.8B GPU适配难&#xff1f;4090D单卡部署保姆级图文教程 随着大模型在翻译领域的持续突破&#xff0c;腾讯开源的混元翻译大模型 HY-MT1.5 系列凭借其卓越的语言覆盖能力和高质量翻译表现&#xff0c;迅速成为开发者关注的焦点。其中&#xff0c;HY-MT1.5-1.8B 作为…

Qwen3-VL-WEBUI教学实践:计算机教室秒变AI实验室

Qwen3-VL-WEBUI教学实践&#xff1a;计算机教室秒变AI实验室 引言 作为一名大学讲师&#xff0c;你是否也遇到过这样的困境&#xff1a;实验室设备老旧&#xff0c;无法运行最新的AI模型&#xff1b;学生人数众多&#xff0c;每人配置高性能GPU成本过高&#xff1b;想教授前沿…

HY-MT1.5新闻翻译应用:多语种内容发布系统搭建步骤

HY-MT1.5新闻翻译应用&#xff1a;多语种内容发布系统搭建步骤 随着全球化进程的加速&#xff0c;跨语言内容传播已成为媒体、企业与政府机构的核心需求。在这一背景下&#xff0c;高质量、低延迟的自动翻译系统成为构建多语种内容发布平台的关键基础设施。腾讯近期开源的混元…

HY-MT1.5-1.8B成本优化案例:量化后低功耗设备全天候运行

HY-MT1.5-1.8B成本优化案例&#xff1a;量化后低功耗设备全天候运行 随着多语言交流需求的爆发式增长&#xff0c;高效、低成本的翻译模型部署成为边缘计算和终端设备的关键挑战。腾讯开源的混元翻译大模型HY-MT1.5系列&#xff0c;凭借其在翻译质量与推理效率之间的出色平衡&…

HY-MT1.5金融文档翻译实战:格式化输出部署完整指南

HY-MT1.5金融文档翻译实战&#xff1a;格式化输出部署完整指南 在金融、法律、医疗等专业领域&#xff0c;文档翻译不仅要求语义准确&#xff0c;还需保持原始排版结构和术语一致性。传统翻译工具往往在格式还原上表现不佳&#xff0c;导致后期人工校对成本高昂。腾讯开源的混…

5个开源翻译模型部署推荐:Hunyuan HY-MT1.5免配置一键启动

5个开源翻译模型部署推荐&#xff1a;Hunyuan HY-MT1.5免配置一键启动 近年来&#xff0c;随着多语言交流需求的激增&#xff0c;高质量机器翻译模型成为跨语言沟通的核心基础设施。腾讯推出的混元翻译大模型&#xff08;Hunyuan MT 1.5&#xff09;凭借其卓越的翻译性能和灵活…

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

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

2026年全球化AI战略:HY-MT1.5开源翻译模型部署全景指南

2026年全球化AI战略&#xff1a;HY-MT1.5开源翻译模型部署全景指南 随着全球多语言交流需求的爆发式增长&#xff0c;高效、精准、可定制的机器翻译系统已成为企业出海、内容本地化和跨文化协作的核心基础设施。腾讯最新发布的混元翻译大模型 HY-MT1.5 系列&#xff0c;标志着…

JBoltAI4智能数据中心:企业AI数据处理新解读

在Java企业级AI应用开发中&#xff0c;数据的有效处理是衔接“原始数据”与“智能应用”的关键环节。JBoltAI4系列推出的智能数据中心&#xff0c;并非简单的功能新增&#xff0c;而是针对企业在AI开发中常见的数据处理痛点&#xff0c;从数据源接入、数据转化、数据支撑等维度…

张高兴的大模型开发实战:(七)基于 Dify #x2B; Ollama 搭建私有化知识问答助手

目录为什么选择 Dify OllamaOllama 本地部署Dify 本地容器化部署模型接入与知识库 RAG 构建准备 Embedding 模型在 Dify 中添加 Ollama 模型供应商构建知识库检索测试构建智能体应用创建应用编排界面概览查询预处理关联知识库编写提示词调整模型参数调试与发布Python API 调用…

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

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

Hunyuan翻译模型如何处理混合语言?上下文理解实战教程

Hunyuan翻译模型如何处理混合语言&#xff1f;上下文理解实战教程 在多语言交流日益频繁的今天&#xff0c;传统翻译模型常因无法准确理解语境、处理混合语言&#xff08;code-mixing&#xff09;而出现误译或语义断裂。腾讯推出的混元翻译大模型 HY-MT1.5 系列&#xff0c;正…

HY-MT1.5-1.8B性价比实战指南:边缘设备部署,成本降低70%

HY-MT1.5-1.8B性价比实战指南&#xff1a;边缘设备部署&#xff0c;成本降低70% 随着多语言交流需求的爆发式增长&#xff0c;高质量、低延迟的翻译模型成为智能硬件、跨境服务和实时通信等场景的核心支撑。然而&#xff0c;传统云端大模型推理成本高、响应慢、隐私风险大&…

Qwen3-VL低成本学习方案:学生认证送5小时GPU时长

Qwen3-VL低成本学习方案&#xff1a;学生认证送5小时GPU时长 引言&#xff1a;计算机专业学生的多模态学习困境 作为一名计算机专业的学生&#xff0c;想要系统学习多模态模型&#xff08;比如能同时理解图像和文本的AI&#xff09;&#xff0c;却常常面临一个现实问题&#…

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

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

Qwen3-VL多模态创作:设计师专属方案,2块钱无限生成

Qwen3-VL多模态创作&#xff1a;设计师专属方案&#xff0c;2块钱无限生成 引言&#xff1a;设计师的AI创作新选择 作为一名平面设计师&#xff0c;你是否遇到过这些困扰&#xff1a;创意枯竭时找不到灵感来源、反复修改设计稿耗时费力、客户需求多变难以快速响应&#xff1f…

HY-MT1.5支持自定义词典?术语库导入实战教程

HY-MT1.5支持自定义词典&#xff1f;术语库导入实战教程 随着多语言交流需求的不断增长&#xff0c;高质量、可定制化的机器翻译模型成为企业和开发者关注的重点。腾讯开源的混元翻译大模型 HY-MT1.5 系列&#xff0c;凭借其卓越的翻译性能和灵活的功能设计&#xff0c;迅速在…