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

[逆向|C语言]C语言数组计算数组的偏移

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

[逆向|C语言]C语言数组计算数组的偏移

一.数组简介

<1>.简单介绍

数组:把相同类型的变量放在一起

数组是从0开始的
常常这样定义,譬如int a[10],最小是a[0],最大是a[9]

<2>.如何看变量的类型?把变量去掉即可

譬如int a[10][2] ,类型就是int [10][2]

二.数组地址

数组的变量名就是数组的地址,

数组的第一个成员的地址也就是数组的地址

数组的最后一个成员是ebp-4,数组的存放方式反汇编是反着来的

三.计算数组的偏移

用首地址的偏移减去本成员的偏移

<1>.对齐的情况

方法: (数组的个数-偏移的个数)*前面类型的大小 得到偏移的位置 只适用int 其他要先计算首地址

int fun1()
{
	int a[30];
	a[0]=1;
	a[1]=2;
	a[2]=3;
	a[3]=4;
	a[4]=5;
	a[5]=6; //4*10-5*4  (10-5)*sizeof(int)
	a[6]=7;
	a[7]=8;
	a[8]=9;
	a[9]=10;
	a[12]=55;
	return 0;
}

如上面代码所示,a[12]的地址怎么算,根据上面的方法:(数组的个数-偏移的个数)*前面类型的大小,

(30-12)*4=72,转换成16进制就是48.那么a[12]的地址就是ebp-0x48,反汇编如下图所示

 <2>.如果去计算数组偏移的时候出现没有对齐的情况,那么要先对齐再去计算
int fun1()
{
	short a[35];
	a[0]=1;
	a[1]=2;
	a[2]=3;
	a[3]=4;
	a[4]=5;
	a[5]=6; 
	a[6]=7;
	a[7]=8;
	a[8]=9;
	a[9]=10;
	a[12]=55;
	a[23]=66;

	return 0;
}

如上面代码所示,a[23]的地址怎么算,先计算首地址,35*2=70 化成16进制结果为46,看过我前面汇编文章的就很容易明白,46是没对齐的,那么就要先对齐为48. 然后23*2=46,转换成16进制位2e,16进制的48减去2e结果为1A.反汇编如下图所示

<3>.基址+偏移的方式进行寻址 
int fun1()
{

	int a[10];
	int i;
	for (i=0;i<10;i++)
	{
		a[i]=i;
		printf("%dn",a[i]);
	}
	return 0;
}

上面代码反汇编如下图所示

ebp-(28-1*4) 相当于 ebp-28+1*4 --->基址+偏移的方式进行寻址

注意:int不用补齐,short char等注意首地址自动补齐的问题


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

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

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

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