栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[逆向|C语言]C语言switch case以及它的反汇编

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[逆向|C语言]C语言switch case以及它的反汇编

目录

一.if else if 转换成switch case的形式

二.switch case多减去4字节空间

三.switch case怎么判断比较的位置

四.switch case的几种情况


一.if else if 转换成switch case的形式
int fun()
{
	int a;
	int b;
	a=1;
	b=2;
	if(a+b==0)
	{
		a++;
	}
	else if(a+b==1)
	{
		b++;
	}
	else if(a+b==2)
	{
		b++;
	}
	else if(a+b==3)
	{
		b++;
	}
	else if(a+b==4)
	{
		b++;
	}
	else
	{
		a=a+b;
	}
	return 0;
}

上图的这个函数是用if else if写的,转换成switch case写就如下图所示.

int fun()
{
	int a;
	int b;
	a=1;
	b=2;

	switch(a+b)
	{
	case 0:
		{
			a++;
			break;
		}
	case 1:
		{
			b++;
			break;
		}
	case 2:
		{
			b++;
			break;
		}
	case 3:
		{
			b++;
			break;
		}
	case 4:
		{
			b++;
		}
	default:
		{
			a=a+b;
		}
	}
	return 0;
}

由此例可以看出,If else if转换成switch case的形式必须满足下面三个条件:

1.必须是==表达式

2.等号左边必须是相同的表达式

3.等号的右边必须是常量或数字,而且数字要互不相同.

二.switch case多减去4字节空间

switch case多减去4字节空间,用来存放表达式的结果

如图所示,只有两个变量却减了C,ebp-c的位置用来存放表达式a+b的结果 

三.switch case怎么判断比较的位置

如果case从0开始,则比较最大case数

上面写的代码case从0开始,最大是4, 则比较的就是最大case数.

如果case不从0开始,则先减去最小的case数,变为从0开始

然后比较时用最大的case数减去最小的case数,就是比较的值

如下图case不从0开始,最小的case数为1,最大的case数为8

switch(a+b)
	{
	case 2:
		{
			a++;
			break;
		}
	case 1:
		{
			b++;
			break;
		}
	case 8:
		{
			b++;
			break;
		}
	case 3:
		{
			b++;
			break;
		}
	case 4:
		{
			b++;
		}
	default:
		{
			a=a+b;
		}
	}

那么它的反汇编就是先减去最小的case数1,比较时就是最大的case数8减去最小的case数1,比较的值为7,如下图所示

四.switch case的几种情况

1.case数连续的,会建一张表,case地址表,表里放case数的地址

 如上图所示是case0,case1,case2,case3,case4这样的反汇编,建了一张表,表里存放了每一个case数的地址.

2.相对连续的情况,它会建两张表,第一张表是编号表,里面放case的编号,从0开始,如果没有的case,里面存放的是case的个数,对应default的位置.第二张表记录case的地址,用case的编号加上case的地址找到case的位置.

switch(a+b)
	{
	case 0:
		{
			a++;
			break;
		}
	case 1:
		{
			b++;
			break;
		}
	case 2:
		{
			b++;
			break;
		}
	case 11:
		{
			b++;
			break;
		}
	case 12:
		{
			b++;
		}
	case 13:
		{
			b++;
		}
	default:
		{
			a=a+b;
		}
	}

代码如上所示,case0,1,2连续,后面11,12,13连续 

 如上图红框所示,右边的红框为编号表,没有case的就用总个数6代替,有case的就从0依次编号

上图红框表示第二张表,case地址表,里面的内容对应每个case的地址 

3.毫无规律的情况,直接判断比较,一般比较方式:用二分法

switch(a+b)
	{
	case 0x100:
		{
			a++;
			break;
		}
	case 0x300:
		{
			b++;
			break;
		}
	case 0x500:
		{
			b++;
			break;
		}
	case 0x1000:
		{
			b++;
			break;
		}
	case 0x6000:
		{
			b++;
			break;
		}
	case 0x8000:
		{
			b++;
		}
	case 0x9000:
		{
			b++;
		}
	default:
		{
			a=a+b;
		}
	}

case数如上面的代码所示

反汇编直接从中间的1000开始比 ,二分法比较.

4.综合前面三种

 如图所示,除了建表也有直接比较的


今天的文章就到这里了,如果有任何不明白的地方欢迎与我交流,我必定知无不言。这篇文章也花了一定的心血,喜欢的小伙伴可以点赞关注哦。感激不尽!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/989414.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号