1.线性switch case语句逆向特征

文章目录

  • 逆向实战:我是怎么从这段汇编一眼看出它是 `switch`,而不是一串 `if/else`
    • 1. 先把源码和目标放在脑子里
    • 2. 第一眼看到的异常感:**比较链太“整齐”了**
      • 2.1 同一个变量,被连续拿来和多个“干净的常量”比较
    • 3. 再往下看:每个分支都“自己干完事就跳走”
      • 为什么?
    • 4. 最后一个确认点:那个“兜底的 jmp”
    • 5. 到这里,我在脑子里已经还原出完整结构了
    • 6. 顺手对照一下完整示例代码(你给的)
    • 7. 我自己在逆向里总结的“线性 switch 判断口诀”

逆向实战:我是怎么从这段汇编一眼看出它是switch,而不是一串if/else

有时候在逆向里,最关键的不是“会不会写 C”,而是看到一坨汇编时,你脑子里第一反应是什么结构

这篇就直接拿你这段汇编来说:我是怎么一步步判断它是switch-case,而不是普通if / else if / else的。


1. 先把源码和目标放在脑子里

源码是一个非常简单的 switch:

intvar=10;switch(var){case1:printf("1\r\n");break;case2:printf("2\r\n");break;case3:printf("3\r\n");break;default:printf("default\r\n");break;}

逆向时我并不是一开始就假设它是 switch,而是先看汇编在“干什么”。

关键汇编如下(无关代码已省略):

; var = 10; 00C114FE mov dword ptr [ebp-4],0Ah ; switch (var) 00C11505 mov eax,dword ptr [ebp-4] 00C11508 mov dword ptr [ebp-8],eax ; 依次比较 1 / 2 / 3 00C1150B cmp dword ptr [ebp-8],1 00C1150F je 00C1151F ; case 1 00C11511 cmp dword ptr [ebp-8],2 00C11515 je 00C1152E ; case 2 00C11517 cmp dword ptr [ebp-8],3 00C1151B je 00C1153D ; case 3 00C1151D jmp 00C1154C ; default

2. 第一眼看到的异常感:比较链太“整齐”了

我在逆向里看到这段时,第一个感觉是:

这不像人手写的 if/else,更像编译器生成的结构。

为什么?

2.1 同一个变量,被连续拿来和多个“干净的常量”比较

cmp [ebp-8], 1 je case_1 cmp [ebp-8], 2 je case_2 cmp [ebp-8], 3 je case_3

注意几个细节:

  • 比较对象完全一样:全是[ebp-8]
  • 比较值非常规整:1、2、3
  • 每次 cmp 后立刻 je 跳走

这在逆向里是一个非常强的信号。

如果是普通 if/else:

  • 有可能是<><=
  • 有可能中途就return
  • 有可能比较对象变来变去

但这里是一模一样的比较模板重复 N 次,只是立即数不同。

👉这非常像 switch 的 case 常量。


3. 再往下看:每个分支都“自己干完事就跳走”

我顺着je跳到每个目标地址去看:

; case 1: 00C1151F push 0C17B30h ; "1\r\n" 00C11524 call printf 00C11529 add esp,4 00C1152C jmp 00C11559 ; ← 关键 ; case 2: 00C1152E push 0C17B34h ; "2\r\n" 00C11533 call printf 00C11538 add esp,4 00C1153B jmp 00C11559 ; case 3: 00C1153D push 0C17B38h ; "3\r\n" 00C11542 call printf 00C11547 add esp,4 00C1154A jmp 00C11559

这一步我基本已经 80% 确认是 switch 了。

为什么?

因为它们全部在做一件事

执行各自的 case 代码 →无条件跳到同一个地址

这在 C 里只有一个非常典型的来源:

caseX:...break;

也就是说:

  • jmp 00C11559break;
  • 00C11559≈ switch 之后的统一出口

如果是 if/else,很多时候:

  • 不需要手动jmp
  • 可以顺着自然流控制流往下走

switch + break 的汇编特征就是:多个分支 → 多个 jmp → 同一出口


4. 最后一个确认点:那个“兜底的 jmp”

回头再看比较链的结尾:

cmp [ebp-8], 3 je case_3 jmp default

这条jmp default非常关键。

因为它说明一件事:

所有 case 都没命中 → 强制跳到某一个固定分支

这在 C 里,只能是:

default:

而且这个default块:

00C1154C push 0C17B3Ch ; "default\r\n" 00C11551 call printf 00C11556 add esp,4
  • 没有被任何je直接命中
  • 只通过这一条 fallbackjmp进来

👉100% 的 default 分支形态。


5. 到这里,我在脑子里已经还原出完整结构了

在没看源码前,我在逆向里已经可以直接写出这样的伪代码:

if(v==1){printf("1");}elseif(v==2){printf("2");}elseif(v==3){printf("3");}else{printf("default");}

然后再结合:

  • 比较对象完全一致
  • 常量是离散整数
  • 所有分支都有 break 行为

👉这不是人手写的 if/else,而是编译器生成的线性 switch。


6. 顺手对照一下完整示例代码(你给的)

#include<stdio.h>voidfunc(){intvar=10;switch(var){case1:printf("1\r\n");break;case2:printf("2\r\n");break;default:printf("default\r\n");break;}}intmain(){func();return0;}

和汇编一一对应,没有任何矛盾点。


7. 我自己在逆向里总结的“线性 switch 判断口诀”

最后用人话总结一下这类 switch,我在逆向时脑子里的判断流程是这样的:

  1. 同一个变量被连续 cmp 多次
  2. cmp 的都是干净的常量(1、2、3…)
  3. 每个 cmp 后面都是 je,直接跳走
  4. 比较链最后有一个无条件 jmp → 兜底分支
  5. 每个分支末尾都 jmp 到同一个地址

只要这五条同时出现,我几乎不会再怀疑:

这是 switch,而且是 case 数量少、没用跳转表的那种。


如果你愿意,下一步我们可以直接接着写一篇:

  • “从汇编里区分:线性 switch vs 跳转表 switch”
  • 或者“switch 没有 break(fall-through)在汇编里的真实样子”

这些在真实逆向里,比语法本身更容易踩坑。

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

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

相关文章

实时数据异常检测模块

污水监控 环境监测 云平台半夜三点&#xff0c;我盯着电脑屏幕上的折线图突然开始剧烈波动——污水厂进水口的COD浓度在十分钟内从200mg/L飙升到1200mg/L。这不是普通的污染事件&#xff0c;系统自动触发警报的同时&#xff0c;Python脚本已经开始抓取周边企业排水数据。 def d…

HY-MT1.5-7B A/B测试:不同参数版本效果对比部署方案

HY-MT1.5-7B A/B测试&#xff1a;不同参数版本效果对比部署方案 1. 引言 随着多语言交流需求的不断增长&#xff0c;高质量、低延迟的翻译模型成为智能应用的核心组件。腾讯近期开源了混元翻译大模型1.5版本&#xff08;HY-MT1.5&#xff09;&#xff0c;包含两个关键模型&am…

实时日志分析:ELK Stack深度优化指南

实时日志分析&#xff1a;ELK Stack深度优化指南 引言 在DevOps、故障排查、用户行为分析等场景中&#xff0c;实时日志分析是企业IT系统的“神经中枢”。它能帮助团队快速定位问题&#xff08;比如服务器宕机、接口超时&#xff09;、监控系统状态&#xff08;比如CPU使用率、…

MoE(Mixture of Experts)架构十年演进(2015–2025)

MoE&#xff08;Mixture of Experts&#xff09;架构十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 2015年MoE还是“理论复苏小规模手工专家路由”的学术时代&#xff0c;2025年已进化成“万亿级多模态VLA动态MoE意图级自适应专家量子加速自进化全域具身…

HY-MT1.5如何接入现有系统?API接口调用实战教程

HY-MT1.5如何接入现有系统&#xff1f;API接口调用实战教程 1. 引言&#xff1a;为什么选择HY-MT1.5进行翻译集成&#xff1f; 随着全球化业务的不断扩展&#xff0c;多语言实时翻译能力已成为企业出海、内容本地化和跨语言沟通的核心需求。传统商业翻译API&#xff08;如Goog…

Fine-tuning十年演进(2015–2025)

Fine-tuning十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 2015年Fine-tuning还是“全参数手工微调小样本监督学习”的粗暴时代&#xff0c;2025年已进化成“端到端VLA意图级自适应微调量子鲁棒零样本亿级在线自进化全域具身知识统一”的普惠智能时代&am…

导师推荐!8款一键生成论文工具测评:本科生毕业论文高效写作指南

导师推荐&#xff01;8款一键生成论文工具测评&#xff1a;本科生毕业论文高效写作指南 学术写作工具测评&#xff1a;如何选择适合你的高效助手 随着人工智能技术的不断发展&#xff0c;AI写作工具逐渐成为高校学生和研究人员的重要辅助工具。然而&#xff0c;面对市场上琳琅满…

HY-MT1.5-1.8B模型微调教程:特定领域适应性训练步骤

HY-MT1.5-1.8B模型微调教程&#xff1a;特定领域适应性训练步骤 1. 引言 1.1 背景与学习目标 随着全球化进程的加速&#xff0c;高质量、低延迟的机器翻译需求日益增长。腾讯开源的混元翻译大模型 HY-MT1.5 系列&#xff0c;凭借其在多语言互译、混合语言处理和边缘部署方面…

提示工程架构师实战:Agentic AI可追溯性的技术实现

提示工程架构师实战&#xff1a;Agentic AI可追溯性的技术实现——从理论到落地的全流程指南 一、引言&#xff1a;为什么Agentic AI需要可追溯性&#xff1f; 想象这样一个场景&#xff1a; 你是一家电商公司的AI产品经理&#xff0c;刚上线的智能推荐Agent突然给一位用户推荐…

Agent十年演进(2015–2025)

Agent十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 2015年Agent还是“规则脚本单一任务执行器”的工具时代&#xff0c;2025年已进化成“万亿级多模态VLA具身智能Agent实时意图级自进化量子鲁棒社交协作全域自主决策伙伴”的通用智能物种&#xff0c;中…

HY-MT1.5-7B支持哪些民族语言?方言翻译实测与部署说明

HY-MT1.5-7B支持哪些民族语言&#xff1f;方言翻译实测与部署说明 1. 引言&#xff1a;腾讯开源的混元翻译大模型 随着多语言交流需求的不断增长&#xff0c;高质量、低延迟的机器翻译系统成为跨语言沟通的关键基础设施。腾讯近期开源了其混元翻译模型1.5版本&#xff08;HY-…

LangChain十年演进(2015–2025)

LangChain十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 2015年LangChain还“不存在”&#xff08;LLM应用刚起步&#xff09;&#xff0c;2022年10月诞生后仅3年&#xff0c;已从“链式LLM工具调用框架”进化成“万亿级多模态VLA Agent原生平台实时意图…

Llama十年演进(2015–2025)

Llama十年演进&#xff08;2015–2025&#xff09; 一句话总论&#xff1a; 虽然Llama系列正式诞生于2023年&#xff0c;但其核心思想“开源大语言模型高效训练社区普惠”可追溯到更早的开源预训练浪潮。十年间&#xff0c;Llama从“不存在”到“全球开源大模型绝对王者万亿级多…

HY-MT1.5如何保护隐私?完全离线翻译系统搭建

HY-MT1.5如何保护隐私&#xff1f;完全离线翻译系统搭建 随着全球化交流的不断深入&#xff0c;机器翻译已成为跨语言沟通的核心工具。然而&#xff0c;传统云翻译服务在数据上传过程中存在隐私泄露风险&#xff0c;尤其在医疗、金融、政府等敏感领域&#xff0c;用户对数据安…

土木工程生就业难?靠远程工作,我找到了高薪稳定工作

作为2025届土木工程毕业生&#xff0c;我曾和无数同专业同学一样陷入就业焦虑&#xff1a;校招时&#xff0c;房企裁员缩招、施工单位岗位缩减&#xff0c;好不容易拿到的几个offer不是需要常年驻场偏远工地&#xff0c;就是薪资微薄且晋升渺茫&#xff1b;身边不少同学要么被迫…

Hunyuan翻译模型多场景落地:医疗文档翻译系统搭建案例

Hunyuan翻译模型多场景落地&#xff1a;医疗文档翻译系统搭建案例 1. 引言&#xff1a;为何选择Hunyuan MT进行专业领域翻译&#xff1f; 随着全球化进程加速&#xff0c;跨语言信息交互需求激增&#xff0c;尤其在医疗、法律、金融等专业领域&#xff0c;高质量、高可靠性的…

Hunyuan翻译模型多场景落地:医疗文档翻译系统搭建案例

Hunyuan翻译模型多场景落地&#xff1a;医疗文档翻译系统搭建案例 1. 引言&#xff1a;为何选择Hunyuan MT进行专业领域翻译&#xff1f; 随着全球化进程加速&#xff0c;跨语言信息交互需求激增&#xff0c;尤其在医疗、法律、金融等专业领域&#xff0c;高质量、高可靠性的…

Hunyuan翻译系统监控怎么做?Prometheus集成实战

Hunyuan翻译系统监控怎么做&#xff1f;Prometheus集成实战 1. 引言&#xff1a;HY-MT1.5 腾讯开源翻译模型的工程化挑战 随着大模型在多语言场景中的广泛应用&#xff0c;翻译系统的稳定性、性能与可维护性成为工程落地的关键瓶颈。腾讯开源的混元翻译大模型 HY-MT1.5 系列&…

HY-MT1.5-1.8B vs Google Translate API:开源模型部署性价比全面对比

HY-MT1.5-1.8B vs Google Translate API&#xff1a;开源模型部署性价比全面对比 在多语言交流日益频繁的今天&#xff0c;高质量、低延迟的翻译服务已成为全球化应用的核心需求。传统上&#xff0c;开发者普遍依赖 Google Translate API 等商业云服务实现文本翻译功能&#x…

Python 编程中 21 个最基础且核心的功能与概念

✅ 1. 变量与数据类型理解变量赋值、命名规则掌握基本数据类型&#xff1a;int, float, str, bool了解 type() 函数和动态类型特性✅ 2. 基本输入输出使用 print() 输出信息使用 input() 获取用户输入格式化输出&#xff1a;f-string、.format()、% 格式化✅ 3. 条件语句&#…