之前的笔记搬运
0x1 如何确定是指针类型
1 | 当间接访问可以正常访问读取内容了, 一定是指针; |
0x2 结构体对齐
1 |
|
结构体成员之间的在内存中如何存放的, 如何对齐的?
结构体成员内存对齐值是这样的计算的: 取当前类型的字节数, 与默认的对齐值做对比,
哪个值比较小就取哪个值, 作为当前对齐值
公式:
Alignment = min( sizeof(type), default )
struct offset % Alignment == 0
结构体中的结构体该如何内存对齐?
结构体内存对齐值是这样的计算的: 取该结构体中最大类型的字节数,
与默认的对齐值做对比, 哪个值比较小就取哪个值, 作为当前对齐值
公式: Alignment = min( sizeof(Struct Max Type) , default )
0x3 结构体赋值
1 | 高级代码: |
0x4 结构体传参
小于8字节时, 直接使用两个寄存器传参
大于8字节时会把函数外申请一个同样的结构体,进行赋值后再把调用函数使用指针进行访问
1 | 高级代码: |
在函数内部可以进入IDA的栈窗口根据传入参数和结构体大小定位每个结构体的首地址, 用Alt+Q键来解释为结构体, 方便与分析;
0x5 结构体返回值
小于8字节, 返回值会在eax和edx里
大于8字节, 会在调用前开辟一个新的结构体空间把接收返回值的变量指针传入函数,
在函数里进行拷贝操作, 并且必须是第一个参数
1 | 高级代码: |
零散笔记
1 | 1. 为什么使用临时变量 |