Windows 逆向-数组反汇编

Oyst3r 于 2023-12-20 发布

前言

这节课主要还是回顾了一下大一学过的数组,但是现在从汇编的角度看它,真的会有了不一样的感悟

课堂

数组的定义

一组相同类型的变量,为了方便读写,采用另外一种表示形式

/*void Function(){
	int v_0 = 1;
	int v_1 = 2;
	int v_2 = 3;
	int v_3 = 4;
	int v_4 = 5;
	int v_5 = 6;
	int v_6 = 7;
	int v_7 = 8;
	int v_8 = 9;
	int v_9 = 10;
}*/
//使用数组表示
void Function(){
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};
}

注意:在数组声明时,必须用常量来指明长度,不能使用变量

void Func(){
	int x = 10;
	int arr[x] = {1,2,3,4,5,6,7,8,9,10};  //错误的!在数组声明时,必须用常量来指明长度(根据编译器版本决定是否可以,这里学的是不可以的)
}

这是为什么呢,咱们从反汇编的角度去分析一下

在函数提升堆栈的那一块,编译器提升堆栈时开辟的缓冲区大小默认为 0x40 字节,每有一个局部变量就增加 4 字节,我们定义的数组大小为 10 个元素,即等于 10 个局部变量,任意类型的局部变量都用 32 位容器存储,上一章提过,所以这里要开辟 40h + 28h 大小的缓冲区,但如果现在定义成 int arr[x]的话,数组的长度就无法确定,那么编译器就无法提前给数组分配好内存,所以会报错

数组的使用

void Function()
{
	int arr[10] = {1,2,3,4,5,6,7,8,9,10};

	int x = 1;
	int y = 2;
	int r ;

	r = arr[1];
	r = arr[x];
	r = arr[x+y];
	r = arr[x*2+y];
	r = arr[arr[1]+arr[2]];
	r = arr[Add(1,2)];
	int a5 = arr[100];  //不会报错
}

数组的反汇编

作业

2.数组是 3 个的时候 esp 也是提升了 4 个,数组是 4 个的时候也是提升了 4 个,只不过传 3 个,剩下有个 int3,也就是 CC;参数在传递的时候和 32 位架构保持一致,都是一次传 4 个字节,但是函数里面要使用参数的话,用的是自身的字节,比如 char 就还是只使用一个字节,局部变量和参数也是如此,这俩这方面也是一致的;以后定义参数以及局部变量的时候,就不要整什么 char 和 short,因为在计算机中都是统一分配 4 个字节

计算机的步子就是 32 位,尤其堆栈这块都是 4 个 4 个字节来的,计算机只是在追求速度和追求空间中选择了追求速度

3.

接着就开始分析如何根据下标找内存中数组元素:

4.桶排序

void sort_arry_tong(){

	int arry[10] = {3,4,6,2,1,6,6,7,0,4};
	int arry_none[10] = {0};
	int i = 0;

	for(i;i < 10 ;i++){

		int temp = 0;
		temp = arry[i];
		arry_none[temp]++;
	}

	int j = 0;
	for(j;j < 10;j++){

		int j_2 = 0;
		for(j_2;j_2 < arry_none[j];j_2++){
			printf("%d",j);
		}
	}
}

OKK 结束睡觉