汇编 ?switch case

知识点:
?switch case生成的汇编框架
?逆向汇编代码还原成C++代码

一、了解switch case结构
 1、普通情况
00401011  |.  83C4 04       ADD ESP,4
00401014  |.  C745 FC 20000>MOV DWORD PTR SS:[EBP-4],20              ;  a=20;
0040101B  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0040101E  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX             ;  switch (a)
00401021  |.  837D F8 03    CMP DWORD PTR SS:[EBP-8],3               ;  case 3:
00401025  |.  74 0E         JE SHORT switchCa.00401035
00401027  |.  837D F8 04    CMP DWORD PTR SS:[EBP-8],4               ;  case 4:
0040102B  |.  74 28         JE SHORT switchCa.00401055
0040102D  |.  837D F8 05    CMP DWORD PTR SS:[EBP-8],5               ;  case 5:
00401031  |.  74 12         JE SHORT switchCa.00401045
00401033  |.  EB 30         JMP SHORT switchCa.00401065              ;  default:

 2、跳转表

00401014  |.  C745 FC 20000>MOV DWORD PTR SS:[EBP-4],20              ;  a=20;
0040101B  |.  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
0040101E  |.  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX             ;  b=a
00401021  |.  8B4D F8       MOV ECX,DWORD PTR SS:[EBP-8]             ;  b==1
00401024  |.  83E9 03       SUB ECX,3                                ;  a-0x3=跳转表数组大小
00401027  |.  894D F8       MOV DWORD PTR SS:[EBP-8],ECX
0040102A  |.  837D F8 0E    CMP DWORD PTR SS:[EBP-8],0E              ;  0E=case最大常量-case最小常量
0040102E  |.  77 61         JA SHORT switchCa.00401091               ;  default:
00401030  |.  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]
00401033  |.  0FB682 CC1040>MOVZX EAX,BYTE PTR DS:[EDX+4010CC]       ;  跳转表的索引数组
0040103A  |>  FF2485 B41040>JMP DWORD PTR DS:[EAX*4+4010B4]          ; /跳转表
时间: 2024-10-24 05:36:33

汇编 ?switch case的相关文章

逆向知识第九讲,switch case语句在汇编中表达的方式

一丶Switch Case语句在汇编中的第一种表达方式 (引导性跳转表) 第一种表达方式生成条件: case 个数偏少,那么汇编中将会生成引导性的跳转表,会做出 if else的情况(类似,但还是能分辨出来的) 1.高级代码: #include "stdafx.h" int main(int argc, char* argv[]) { switch(argc) { case 0: printf("case 0\n"); break; case 1: printf(&

javascript switch..... case

switch(条件表达式) { case 常量: { 语句a; } break; case 常量: { 语句b; } break; case 常量: { 语句c; } break; ... case 常量: { 语句f; } break; default: { 语句n; } } 1 当"表达式"的值与某个case后面的常量相等时,就执行常量后面所执行的语句,之后跳出switch分支选择语句,当所有的case后面的常量都不符合"表达式"时,执行default后面的语句

if else和switch case那个效率更高一点

switch...case写法: switch (表达式){ case 值1 : 语句1 break; case 值2 : 语句2 break; ... default : 语句n break; } if...else写法: if(boolean){ }else if(boolean){ }else if(boolean){ }else{ } 由此看来,switch有点以空间换时间的意思,而事实上也的确如此.1.当分支较多时,当时用switch的效率是很高的.因为switch是随机访问的,就是确

switch case 与 if

case 在编程中偶尔使用到switch case语句,对于case语句的处理,出现了两种错误,现总结如下: 1 case后必须是常量,不能使用‘<’或‘>’这种逻辑运算 2 case后如果是‘||’或者‘&&’逻辑运算,则实际是1或者0 #include <iostream> using namespace std; int main(int argc, char * argv[]) { int i; cin>>i; switch(i) { case

数据字典+匿名委托模拟switch/case功能

基本思想每个case的选择值作为键,处理过程做成函数委托存放进数据字典.用的时候根据之调用.下面上代码 封装的FuncSwitcher类 using System; using System.Collections.Generic; namespace Test {     class FuncSwitcher<T>     {         int count;         Dictionary<T, Delegate> FuncGather;         Delega

选择语句----switch case

今天学习了选择语句的 switch case是多选一的情况可以使用. 案例: //分别输入月份 几号 输出是今年的多少天 //每年的1,3,5,7,8,10,12月是31天 //今年的2月是28天 其他是30 int m1 = 31, m2 = 28, m3 = 31, m4 = 30, m5 = 31, m6 = 30, m7 = 31, m8 = 31, m9 = 30, m10 = 31, m11 = 30;----无需定义12月份的量,因为用不着 Console.Write("请输入月份

CASE函数用法:相当于switch..case:,能够实现等值判断,也可以做范围判断 相当于if...else

--CASE函数用法:--1.相当于switch..case:,能够实现等值判断--语法:--case 字段/表达式 --判断指定折字段或者表达式的值,它不能判断null值,因为null不是一个具体的值-- when 值 then '自定义值'-- when 值 then '自定义值'-- else '前面都不满足的情况'--end--特点:-- 1.会生成一个新列-- 2.then后面的值的类型需要一致select StudentNo,StudentName,case ClassId when

c++模板元编程五:switch/case语句编译时运行

2.4 switch/case 替代 现在模拟switch/case语句,不过也是在编译期运行.先看调用代码和输出结果 // test case cout << "test case" << endl; Case<2>::Run(); test case case 2 实现代码很简单,还是模板特化 template<int v> class Case { public: static inline void Run() { cout &l

Switch Case语句中多个值匹配同一个代码块的写法

switch ($p) { case 'home': case '': $current_home = 'current'; break; case 'users.online': case 'users.location': case 'users.featured': case 'users.new': case 'users.browse': case 'users.search': case 'users.staff': $current_users = 'current'; break