C-结构体反汇编

定义

找到具体的机构体对象以后

偏移:加偏移可以访问结构体的属性,二级偏移就是结构体里面的结构体

基址:全局变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "stdafx.h"

struct AA//声明一个新的结构体类型AA,声明类型不会分配空间
{
char x;
int y;
float a;
int arr[2];

};
int a;//全局变量,程序编译成exe的时候就分配好了内存空间

void fun()
{

AA xiu={'a',6,3.14,{0,1}};//声明一个AA类型的变量xiu并且为变量初始化值,在这一步才会分配空间

}

int main(int argc, char* argv[])
{
fun();
return 0;

}

使用

连续等宽很可能是数组

连续不等宽很可能是结构体

打印结构体属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include "stdafx.h"

struct AA
{
char x;
int y;
float a;
int arr[2];

};
AA xiu={'a',6,3.14,{0,1}};

void fun()
{

printf("%c %d %d",xiu.x,xiu.arr[0],xiu.y);

}

int main(int argc, char* argv[])
{
fun();
return 0;

}

image-20231108094224903

作为参数传递

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include "stdafx.h"

struct AA
{
int a;
int b;
int c;
int d;
int e;
int f;

};


void fun(AA x)
{


}

int main(int argc, char* argv[])
{
AA xiu={1,2,3,4,5,6};
fun(xiu);
return 0;

}

00401058 mov dword ptr [ebp-18h],1
0040105F mov dword ptr [ebp-14h],2
00401066 mov dword ptr [ebp-10h],3
0040106D mov dword ptr [ebp-0Ch],4
00401074 mov dword ptr [ebp-8],5
0040107B mov dword ptr [ebp-4],6
//main函数把xiu变量的值存到了自己的缓冲区
00401082 sub esp,18h
//栈顶空间提升
00401085 mov ecx,6
0040108A lea esi,[ebp-18h]
0040108D mov edi,esp
0040108F rep movs dword ptr [edi],dword ptr [esi]
//利用rep movs命令代替push把参数压到堆栈里
00401091 call @ILT+10(fun) (0040100f)

结构体在使用的时候作为全局变量,也尽量不要在传参中使用结构体

结构体作返回值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include "stdafx.h"

struct AA
{
int a;
int b;
int c;
int d;
int e;
int f;

};


AA fun()
{
AA xiu={1,2,3,4,5,6};
return xiu;
}

int main(int argc, char* argv[])
{

fun();
return 0;

}