x32dbg/x64dbg逆向之反汇编switch分析 x32dbg/x64dbg逆向之反汇编switch分析1反汇编switch分析如果咱们条件语句很少各位会发现一个有趣的问题它和if-else反汇编一摸一样但是如果分支条件多了很神奇会出现一个特殊的table。咱们看下switch在汇编中是什么表现x86和x64有什么区别以及DebugRelease又有什么区别2C语言案例代码咱们在学习逆向分析的同时同步梳理C和C基础知识点一正一反正向开发逆向分析为后续深耕底层技术打好基础哦。#includestdio.hvoid test(int x){switch (x){case 1:printf(%d, x);break;case 3:printf(%d, x);break;case 7:printf(%d, x);break;case 10:printf(%d, x);break;//Add this ?case 888:printf(%d, x);break;//Add this ?case 9999:printf(%d, x);break;/*?????001C1BCF je __$EncStackInitStart0A8h (01C1C44h)001C1BD1 cmp dword ptr [ebp-0C4h],1001C1BD8 je __$EncStackInitStart6Fh (01C1C0Bh)001C1BDA cmp dword ptr [ebp-0C4h],3001C1BE1 je __$EncStackInitStart82h (01C1C1Eh)001C1BE3 cmp dword ptr [ebp-0C4h],7001C1BEA je __$EncStackInitStart95h (01C1C31h)001C1BEC jmp __$EncStackInitStart0E1h (01C1C7Dh)001C1BF1 cmp dword ptr [ebp-0C4h],378h001C1BFB je __$EncStackInitStart0BBh (01C1C57h)001C1BFD cmp dword ptr [ebp-0C4h],270Fh001C1C07 je __$EncStackInitStart0CEh (01C1C6Ah)001C1C09 jmp __$EncStackInitStart0E1h (01C1C7Dh)*/default:printf(%d, 0);break;}}void test1(int x){switch (x){case 1:printf(%d, x);switch (x){case 1:printf(%d, x);break;case 3:printf(%d, x);break;case 7:printf(%d, x);break;default:printf(%d, 0);break;}break;case 3:printf(%d, x);switch (x){case 1:printf(%d, x);break;case 3:printf(%d, x);break;case 7:printf(%d, x);break;default:printf(%d, 0);break;}break;case 7:printf(%d, x);switch (x){case 1:printf(%d, x);break;case 3:printf(%d, x);break;case 7:printf(%d, x);break;default:printf(%d, 0);break;}break;break;case 10:printf(%d, x);switch (x){case 1:printf(%d, x);break;case 3:printf(%d, x);break;case 7:printf(%d, x);break;default:printf(%d, 0);break;}break;default:printf(%d, 0);switch (x){case 1:printf(%d, x);break;case 3:printf(%d, x);break;case 7:printf(%d, x);break;default:printf(%d, 0);break;}break;}}int main(){test(1);test1(7);}3单个switchx86Debug版本ds指向数据段全局/静态变量ss指向栈段局部变量反汇编时候有没有发现不同之处如果你使用分支语句小于四个时候肯定会发现很多jecmp指令但是分支语句一旦多了咱们就看不到多个jecmp了eax*4b.内存里面有个表记录着每一个分支语句地址004C1C76 | 8B45 08 | mov eax,dword ptr ss:[ebp8] | FileName.cpp:6读取函数传入的形参到eax寄存器004C1C79 | 8985 3CFFFFFF | mov dword ptr ss:[ebp-C4],eax | 复制给局部变量004C1C7F | 8B8D 3CFFFFFF | mov ecx,dword ptr ss:[ebp-C4] |004C1C85 | 83E9 01 | sub ecx,1 | 为什么要减一004C1C88 | 898D 3CFFFFFF | mov dword ptr ss:[ebp-C4],ecx |004C1C8E | 83BD 3CFFFFFF 09 | cmp dword ptr ss:[ebp-C4],9 | 09:\t,比较如果都没有比9大直接跳到Default004C1C95 | 77 60 | ja project1.$LN8 | 比较如果都比9大直接跳到Default分支004C1C97 | 8B95 3CFFFFFF | mov edx,dword ptr ss:[ebp-C4] |30 1D 4C 00 - 小端序反转 004C1D30索引表基址1C 1D 4C 00 - 小端序反转 004C1D1Ccase 地址跳转表基址004C1C9D | 0FB682 301D4C00 | movzx eax,byte ptr ds:[edx] | 从跳转索引表取出索引值零扩展后存入eax004C1CA4 | FF2485 1C1D4C00 | jmp dword ptr ds:[eax*4] | 通过eax*4计算的结果跳转到指定的case通过eax*4偏移跳转表基址跳转到对应case分支4C1D1C内存存储各case分支入口地址eax*4b.内存里面有个表记录着每一个分支语句地址004C1CAB | 8B45 08 | mov eax,dword ptr ss:[ebp8] | FileName.cpp:9读取函数传入的形参到eax寄存器004C1CAE | 50 | push eax |004C1CAF | 68 307B4C00 | push project1.%d... | 4C7B30:%d004C1CB4 | E8 19F4FFFF | call project1.4C10D2 | printf004C1CB9 | 83C4 08 | add esp,8 |004C1CBC | EB 48 | jmp project1.4C1D06 | FileName.cpp:10004C1CBE | 8B45 08 | mov eax,dword ptr ss:[ebp8] | FileName.cpp:12004C1CC1 | 50 | push eax |004C1CC2 | 68 307B4C00 | push project1.%d... | 4C7B30:%d004C1CC7 | E8 06F4FFFF | call project1.4C10D2 | printf004C1CCC | 83C4 08 | add esp,8 |004C1CCF | EB 35 | jmp project1.4C1D06 | FileName.cpp:13004C1CD1 | 8B45 08 | mov eax,dword ptr ss:[ebp8] | FileName.cpp:15004C1CD4 | 50 | push eax |004C1CD5 | 68 307B4C00 | push project1.%d... | 4C7B30:%d004C1CDA | E8 F3F3FFFF | call project1.4C10D2 |004C1CDF | 83C4 08 | add esp,8 |004C1CE2 | EB 22 | jmp project1.4C1D06 | FileName.cpp:16004C1CE4 | 8B45 08 | mov eax,dword ptr ss:[ebp8] | FileName.cpp:18004C1CE7 | 50 | push eax |004C1CE8 | 68 307B4C00 | push project1.%d... | 4C7B30:%d004C1CED | E8 E0F3FFFF | call project1.4C10D2 |004C1CF2 | 83C4 08 | add esp,8 |004C1CF5 | EB 0F | jmp project1.4C1D06 | FileName.cpp:19004C1CF7 | 6A 00 | push 0 | FileName.cpp:22004C1CF9 | 68 307B4C00 | push project1.%d... | 4C7B30:%d004C1CFE | E8 CFF3FFFF | call project1.4C10D2 |004C1D03 | 83C4 08 | add esp,8 |

相关新闻

最新新闻

从零开始的C语言学习:第2节 C语言的常见概念 2

从零开始的C语言学习:第2节 C语言的常见概念 2

目录 1.关键字介绍 2.字符与ASCII编码 3.字符串 免责声明 1.关键字介绍 在编写C语言程序的过程中,我们往往会用到很多的变量,所以也会给变量取各种各样的名字,聪明的你肯定会想到,C语言中好像有一些规定着其特定作用的词语&a…

2026/8/16 6:53:55
2026黔东危房鉴定检测怎么选?老旧房危房鉴定靠谱机构 TOP 结构安全检测+ 报告可查 电话汇总

2026黔东危房鉴定检测怎么选?老旧房危房鉴定靠谱机构 TOP 结构安全检测+ 报告可查 电话汇总

黔东街头巷尾的老旧小区、乡镇自建房、沿街商铺乃至工业园区厂房,眼下正面临一轮危房鉴定检测的刚性需求。小编实地走访发现,市面上危房鉴定机构虽多,但资质参差不齐,不少无证团队出具的所谓“报告”根本过不了住建局审核&#xf…

2026/8/16 6:53:55
职业教育培训行业近期补充资讯汇总

职业教育培训行业近期补充资讯汇总

职业教育培训行业近期补充资讯汇总 教育部8月4日公布2026年《职业教育专业目录》增补结果,共新增27个职业教育本、专科专业,涵盖人形机器人、数字孪生、低空运输、城市更新设计技术等新兴赛道。教育部同步明确将规范院校新专业开设流程,严防…

2026/8/16 6:53:55
给 AI 助手装个「耳朵」:Groq 免费语音转文字实战指南

给 AI 助手装个「耳朵」:Groq 免费语音转文字实战指南

微信里发条语音,1-3 秒后 AI 助手回你一行简体字——这是给自部署助手接上 Groq 免费语音识别后最直观的变化。 1-3 秒 —— 微信语音出简体字 8 小时/天 —— 免费档音频额度,个人用不完 零内存 —— 转写全在云端,本地 0 占用 为什么折腾这个?我的助手 Hermes 跑在一台 2G 内…

2026/8/16 6:53:55
2026黔南危房鉴定检测怎么选?老旧房危房鉴定靠谱机构 TOP 结构安全检测+ 报告可查 电话汇总

2026黔南危房鉴定检测怎么选?老旧房危房鉴定靠谱机构 TOP 结构安全检测+ 报告可查 电话汇总

黔南的老旧小区业主、乡镇自建房住户、商铺经营者乃至园区厂房与学校医院,眼下正面临一个棘手难题:危房鉴定机构遍地开花,却鱼龙混杂、良莠不齐。不少无资质团队出具的所谓报告,送到住建窗口直接被驳回,既耽误工期又白…

2026/8/16 6:53:55
C++哈希表深度解析:从原理到LeetCode实战应用

C++哈希表深度解析:从原理到LeetCode实战应用

1. 项目概述:为什么我们需要深入理解哈希表?如果你正在学习数据结构与算法,或者准备技术面试,那么“哈希表”这个词对你来说一定不陌生。它几乎是所有面试官和算法题(尤其是LeetCode)的宠儿。但很多朋友对它…

2026/8/16 6:48:55