C语言中指针使用频率是很高的,我们知道指针一个特殊的变量,它的值是指向一块内存地址
我写了一个简单的C代码
[C] 纯文本查看 复制代码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;
来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |