二进制C-结构体反汇编
xiu定义
找到具体的机构体对象以后
偏移:加偏移可以访问结构体的属性,二级偏移就是结构体里面的结构体
基址:全局变量
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;
void fun() { AA xiu={'a',6,3.14,{0,1}}; }
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;
}
|

作为参数传递
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 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] 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;
}
|