好友
阅读权限10
听众
最后登录1970-1-1
|
C语言中指针使用频率是很高的,我们知道指针一个特殊的变量,它的值是指向一块内存地址
我写了一个简单的C代码
[C] 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 | void Test1()
{
int ***ptr_int = NULL;
int i1 = 100;
int *ptr_1 = &i1;
int **ptr_2 = &ptr_1;
ptr_int = &ptr_2;
int k = ***ptr_int;
}
|
编译,然后OllyDbg载入
我们一句句来
mov dword ptr ss:[ebp-0xC],0x0
将值0 放入栈空间地址 ss:[ebp-0xC] 物理地址为 00D3FBDC
对应C代码 int ***ptr_int = NULL;
mov dword ptr ss:[ebp-0x18],0x64
将值0x64 放入栈空间地址 ss:[ebp-0x18] 物理地址为 00D3FBD0 00000064
对应C代码 int i1 = 100;
这两行代码 先将 ss:[ebp-0x18] 地址赋给寄存器 eax,然后将eax值赋给地址 ss:[ebp-0x24]
00E41716 8D45 E8 lea eax,dword ptr ss:[ebp-0x18]
00E41719 8945 DC mov dword ptr ss:[ebp-0x24],eax
对应C代码
int *ptr_1 = &i1; //一级内存地址空间偏移
这里的 ss:[ebp-0x18]便是 整型变量i1的内存地址
这两行代码 做的事情同上,但注意地址变化了,这是是将地址 ss:[ebp-0x24] 赋给 ss:[ebp-0x30]
而 ss:[ebp-0x24]就是指针变量 int *ptr_1的值
00E4171C 8D45 DC lea eax,dword ptr ss:[ebp-0x24]
00E4171F 8945 D0 mov dword ptr ss:[ebp-0x30],eax
对应C代码
int **ptr_2 = &ptr_1; //二级内存地址空间偏移
这两行代码 做的事情同上, 将二级指针变量地址 ss:[ebp-0x30] 赋给 ss:[ebp-0xC]三级指针变量
00E41722 8D45 D0 lea eax,dword ptr ss:[ebp-0x30]
00E41725 8945 F4 mov dword ptr ss:[ebp-0xC],eax
对应C代码
ptr_int = &ptr_2; //三级内存地址空间偏移
将3级指针地址对应的解引用 取 出来。
00E41728 8B45 F4 mov eax,dword ptr ss:[ebp-0xC]
对应C代码
int k = ***ptr_int;
|
免费评分
-
查看全部评分
本帖被以下淘专辑推荐:
- · 学习及教程|主题: 1073, 订阅: 1130
|