- UID
- 832
- 精华
- 积分
- 48
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
原以为 x64的结构体是以8字节对齐的
当计算结构大小的时候 不够8字节的补齐,比如
结构大小 0x2c sizeof的时候 会显示0x30 补齐8字节
可是后来, 反汇编时 发现这么行不通
反汇编的时候 操作的都是+?h 的偏移
所以 判断成员的大小很有必要 ,所以又做了一个实验
- typedef struct SIZEOF {
- ULONG Count;
- PVOID Ower;
- ULONG A;
- KEVENT Event;
- ULONG Irql;
- } SIZEOF;
- DbgPrint("SIZEOF=0x%x\n", sizeof(SIZEOF));
- DbgPrint("KEVENT=0x%x\n", sizeof(KEVENT));
- DbgPrint("PVOID=0x%x\n", sizeof(PVOID));
- DbgPrint("ULONG=0x%x\n", sizeof(ULONG));
- 打印结果:
- SIZEOF=0x38
- KEVENT=0x18
- PVOID=0x8
- ULONG=0x4
复制代码
看到打印结构发现了什么 ?
3个ULONG =C;
C+8+0x18= 2c; 可是这与结构完全不同
哦,想了想 原来分配内存的时候
把 不是8字节的 变量 都以8字节对齐
4*8=0x20; 然后 0x20+0x18=0x38;
哦,原来如此, 挺高兴的,
但是 如果真的这么认为 就大错特错了
当时我是这么认为的, 可是后来又在看汇编代码的时候
发现又发现了问题,按照前面对结构理解的思路
汇编代码中的结构体 对不上号了;
这让我恼火了很长时间,最后发现就是出现在结构上的时候
决定重新 研究下 这个结构什么时候 到底多大;
又实验:
- typedef struct SIZEOF {
- ULONG Count;
- PVOID Ower;
- ULONG A;
- //KEVENT Event;
- ULONG Irql;
- } SIZEOF;
- DbgPrint("SIZEOF=0x%x\n", sizeof(SIZEOF));
- SIZEOF=0x18
复制代码
显然 0x18+KEVENT(0x18)=0x30; 跟上边的 0x38 显然是不一样的
然后就想难道以 结构中最大 值来决定的?
或者 ````再多的猜想也没用, 实验吧;
经过了N次 实验后 发现问题了 原来是我对内存对齐的概念没有搞清楚
- typedef struct SIZEOF {
- UCHAR A;
- ULONG64 B;
- UCHAR C;
- ULONG64 D;
- UCHAR E;
- ULONG64 F;
- ULONG G;
- ULONG64 K;
- } SIZEOF;
- DbgPrint("SIZEOF=0x%x\n", sizeof(SIZEOF));
- SIZEOF=0x40
复制代码
结果是0x40 因为是8字节对齐方式
比如第一个成员 uchar 1个字节
但是下一个是8个字节的 要对齐
所以这就成0x10个字节了
同样 我把 成员变量的位置换 一下
马上就变了
- typedef struct SIZEOF {
- UCHAR A;
- UCHAR C;
- UCHAR E;
- ULONG64 B;
- ULONG64 D;
- ULONG64 F;
- ULONG G;
- ULONG64 K;
- } SIZEOF;
- SIZEOF=0x30
复制代码
因为 少了2个8字节对齐 所以少了0x10
第一个8字节 能存放下 3个uchar 类型
现在 我把ulong 放到上边,一定会又少8个字节
- typedef struct SIZEOF {
- UCHAR A;
- UCHAR C;
- UCHAR E;
- ULONG G;
- ULONG64 B;
- ULONG64 D;
- ULONG64 F;
- ULONG64 K;
- } SIZEOF;
- DbgPrint("SIZEOF=0x%x\n", sizeof(SIZEOF));
- SIZEOF=0x28
复制代码
注意这 上边是以8字节为准的 ,如果没有 8字节的变量呢
所以 这样实验下
- typedef struct SIZEOF {
- UCHAR A;
- UCHAR C;
- UCHAR E;
- ULONG G;
- ULONG B;
- } SIZEOF;
- DbgPrint("SIZEOF=0x%x\n", sizeof(SIZEOF));
- SIZEOF=0xc
复制代码
现在是以4字节对齐的了,
这么看来 如果一个结构中最大的不超过8字节
将不会以8字节为准 以最大的字节 比如这样
- typedef struct SIZEOF {
- UCHAR E;
- USHORT a;
- } SIZEOF;
- DbgPrint("SIZEOF=0x%x\n", sizeof(SIZEOF));
- SIZEOF=0x4
复制代码 |
|