汇编 switch case
知识点:
switch case生成的汇编框架
逆向汇编代码还原成C++代码 一、了解switch case结构
、普通情况
|. 83C4 ADD ESP,
|. C745 FC >MOV DWORD PTR SS:[EBP-], ; a=;
0040101B |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-]
0040101E |. F8 MOV DWORD PTR SS:[EBP-],EAX ; switch (a)
|. 837D F8 CMP DWORD PTR SS:[EBP-], ; case :
|. 0E JE SHORT switchCa.
|. 837D F8 CMP DWORD PTR SS:[EBP-], ; case :
0040102B |. JE SHORT switchCa.
0040102D |. 837D F8 CMP DWORD PTR SS:[EBP-], ; case :
|. JE SHORT switchCa.
|. EB JMP SHORT switchCa. ; default: 、跳转表 |. C745 FC >MOV DWORD PTR SS:[EBP-], ; a=;
0040101B |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-]
0040101E |. F8 MOV DWORD PTR SS:[EBP-],EAX ; b=a
|. 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-] ; b==
|. 83E9 SUB ECX, ; a-0x3=跳转表数组大小
|. 894D F8 MOV DWORD PTR SS:[EBP-],ECX
0040102A |. 837D F8 0E CMP DWORD PTR SS:[EBP-],0E ; 0E=case最大常量-case最小常量
0040102E |. JA SHORT switchCa. ; default:
|. 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-]
|. 0FB682 CC1040>MOVZX EAX,BYTE PTR DS:[EDX+4010CC] ; 跳转表的索引数组
0040103A |> FF2485 B41040>JMP DWORD PTR DS:[EAX*+4010B4] ; /跳转表
知识点:
入口函数main的定位
逆向汇编代码还原成C++代码
索引表数组
跳转表 一、索引表及跳转表分析
、确定case常量
,,,
、确定case常量顺序 (可以根据 跳转表 调整也可以)
000210AC 30.00021063
000210B0 30.00021053
000210B4 30.00021048
000210B8 30.00021089
//调整后 实际上就是按地址大小排序
000210B4 30.00021048
000210B0 30.00021053
000210AC 30.00021063
000210B8 30.00021089 二、还原代码
printf("begin");
int a,b; a=0x16; b=;
switch(a)
{
case :
b=b+a;
break;
case :
printf("");
break;
//18,20,28,32
case :
if (b>)
{
printf("");
}else
{
printf("");
}
break;
case :
printf("");
//break;
default:
printf("00end");
break;
}
//end
汇编 switch case的更多相关文章
- 逆向知识第九讲,switch case语句在汇编中表达的方式
一丶Switch Case语句在汇编中的第一种表达方式 (引导性跳转表) 第一种表达方式生成条件: case 个数偏少,那么汇编中将会生成引导性的跳转表,会做出 if else的情况(类似,但还是能分 ...
- switch...case 和 if...else
switch...case与if...else的根本区别在于: switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的,switc ...
- if语句,if...else if语句和switch...case语句的区别和分析
前段时间在工作中遇到了一个关于条件判断语句的问题,在if语句,if else if语句和switch case语句这三者之间分析,使用其中最有效率的一种方法. 所以就将这个问题作为自己第一篇博客的主要 ...
- 为什么switch...case语句比if...else执行效率高
在C语言中,教科书告诉我们switch...case...语句比if...else if...else执行效率要高,但这到底是为什么呢?本文尝试从汇编的角度予以分析并揭晓其中的奥秘. 第一步,写一个d ...
- 知识扩展--if...else...与switch...case...的执行原理
一.简述 编程语言中的条件分支结构有两种:if-else和switch-case,这两种条件分支之间可以相互转换,但是也存在一些区别,那么什么时候该用if-else,什么时候该用switch-case ...
- if else和switch case那个效率更高一点
switch...case写法: switch (表达式){ case 值1 : 语句1 break; case 值2 : 语句2 break; ... default : 语句n break; } ...
- python中Switch/Case实现
学习Python过程中,发现没有switch-case,过去写C习惯用Switch/Case语句,官方文档说通过if-elif实现.所以不妨自己来实现Switch/Case功能. 方法一 通过字典实现 ...
- javascript switch..... case
switch(条件表达式) { case 常量: { 语句a; } break; case 常量: { 语句b; } break; case 常量: { 语句c; } break; ... case ...
- switch...case...语句分析(大表跟小表何时产生)
一.switch...case...的格式 switch(表达式) { case 常量表达式1: 语句; break; case 常量表达式2: 语句; break; case 常量表达式3: 语句; ...
随机推荐
- 数组、ArrayList、链表、LinkedList
数组 数组 数组类型 不可重复 无序(线性查找) 可重复(找到第一个即可) 无序(线性查找) 不可重复 有序(二分查找) 可重复(找到第一个即可) 有序(二分查找) 插入 O(N) O(1) O( ...
- Hive使用SequenceFile存储数据
SequenceFile是使用二进制保存数据,是可以压缩的,并且压缩后的数据可被分割,可以供mapreduce处理. 下面的实例使用SequenceFile保存Hive表的数据,并且使用了压缩. se ...
- python 元组编码和解码问题
先看一个例子: (u'agentEnum', True, '200', {u'msg': u'\u6210\u529f', u'code': 1}) 在2.7.15版本中,如果有下面代码: def f ...
- 《SQLSERVER2012实施与管理实战指南》前4章节笔记内容
<SQLSERVER2012实施与管理实战指南>前4章节笔记内容 <SQLSERVER2012实施与管理实战指南>的前面4章是<SQLSERVER企业级平台管理实践> ...
- sql 经典面试题及答案(选课表)
SQL数据库面试题以及答案 Student(Sno,Sname,Sage,Ssex) 学生表 Sno:学号:Sname:学生姓名:Sage:学生年龄:Ssex:学生性别Course(Cno ...
- python selenium爬取自如租房数据保存到TXT文件
# -*- coding: utf-8 -*-"""Created on Fri Aug 31 2018 @author: chenlinlab"" ...
- THE ELEMENTS OF C# STYLE
|前言 程序员其实艺术家,灵动的双手如行云流水般在键盘上创造着生命的奇迹,我认为代码是有灵魂的.同一个模块,在每个程序员手中所缔造出来的是不相同的. 最终,这个模块或者实现了最初的业务,但是回过头看看 ...
- AfxBeginThread
用户界面线程和工作者线程都是由AfxBeginThread创建的.现在,考察该函数:MFC提供了两个重载版的AfxBeginThread,一个用于用户界面线程,另一个用于工作者线程,分别有如下的原型和 ...
- Javaweb学习(二):Http通信协议
当我们开始jsp/servlet编程之旅之前,我们还需要知道一些关于网络通讯方面的一些知识.这样能更加有助于我们的理解,希望大家能看懂我的描述,而不至于在学习的路上一知半解.(手动比❤) 认识Ht ...
- python基础之单例设计模式
class Player(): instance = None init_flag = False def __init__(self): if self.init_flag is False: pr ...