首页
社区
课程
招聘
[求助]一段C代码反汇编的疑惑
发表于: 2010-5-5 11:16 4665

[求助]一段C代码反汇编的疑惑

2010-5-5 11:16
4665
小弟跟踪了一段C语言的反汇编代码,存在以下疑惑,希望知道的解释下。
void mynew(int* pp)
{
00411C60  push        ebp  
00411C61  mov         ebp,esp
// 没明白这中间的几段代码的含义
00411C63  sub         esp,0C0h
00411C69  push        ebx  
00411C6A  push        esi  
00411C6B  push        edi  
00411C6C  lea         edi,[ebp-0C0h]
00411C72  mov         ecx,30h
00411C77  mov         eax,0CCCCCCCCh
00411C7C  rep stos    dword ptr [edi]
// 到这里
        pp = NULL;
00411C7E  mov         dword ptr [pp],0
}

稍作改动,栈空间的分配大小又发生了变化
void mynew(int* pp)
{
00411C60  push        ebp  
00411C61  mov         ebp,esp
// 大小也变化了
00411C63  sub         esp,0CCh
00411C69  push        ebx  
00411C6A  push        esi  
00411C6B  push        edi  
00411C6C  lea         edi,[ebp-0CCh]
00411C72  mov         ecx,33h
00411C77  mov         eax,0CCCCCCCCh
00411C7C  rep stos    dword ptr [edi]
// 到这里
        pp = new int;
00411C7E  push        4   
00411C80  call        operator new (411555h)
00411C85  add         esp,4
00411C88  mov         dword ptr [ebp-0C8h],eax
00411C8E  mov         eax,dword ptr [ebp-0C8h]
00411C94  mov         dword ptr [pp],eax
}

这段代码我主要想搞清楚传值和传址的区分的,我没想明白为什么lea后就能达到传址的效果,底层的原理是什么?我可能问过头了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 466
活跃值: (175)
能力值: ( LV9,RANK:190 )
在线值:
发帖
回帖
粉丝
2
~~~底层~~把寄存器的值 ebp 的值+ 0x0c0 放到地址总线上,而不是数据总线上,就行了。
2010-5-5 12:43
0
雪    币: 260
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
DEBUG模式下填充0xCC而已,有啥大惊小怪的。改成RELEASE再看下咯。
2010-5-5 12:57
0
雪    币: 508
活跃值: (89)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
4
请问
00411C63  sub         esp,0C0h
00411C69  push        ebx  
00411C6A  push        esi  
00411C6B  push        edi  
00411C6C  lea         edi,[ebp-0C0h]
00411C72  mov         ecx,30h
00411C77  mov         eax,0CCCCCCCCh
00411C7C  rep stos    dword ptr [edi]

这段代码在debug模式下作用是什么?为什么还要单独开这块空间呢?我以为只要对ebp+08h操作就可以了
2010-5-5 13:13
0
雪    币: 260
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
00411C63  sub         esp,0C0h   栈上申请0xC0个字节 = 192个0xCC要填充
00411C69  push        ebx  
00411C6A  push        esi  
00411C6B  push        edi  
00411C6C  lea         edi,[ebp-0C0h]    取0xC0个字节的低地址,也就是开始填充0xCC的开始地址
00411C72  mov         ecx,30h              一次操作4字节(DWORD),所以循环次数=0x30=192/4=48次
00411C77  mov         eax,0CCCCCCCCh
00411C7C  rep stos    dword ptr [edi] 执行48次赋值0xCCCCCCCC

很基础的东西,大牛们不愿意说,我就献丑了,哈哈!
2010-5-5 13:20
0
雪    币: 508
活跃值: (89)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
楼上的哥们,我没问这段代码的含义,我不是那种入门级的菜鸟,我是说这段代码在debug模式下保存哪些信息,谢谢
2010-5-5 13:23
0
雪    币: 260
活跃值: (47)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
晕倒,填充这么多0xCC都还不知道啥意思,多看看加密解密再说吧。
2010-5-5 13:27
0
雪    币: 508
活跃值: (89)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
8
你说说吧,或是发个链接给我扫盲吧,谢谢了
2010-5-5 13:29
0
雪    币: 101
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
CC是INT 3 如果出错会出现异常中断,方便调试吧。
2010-5-5 13:29
0
雪    币: 142
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
sub         esp,0C0h 主要是用来分配内存给变量预留。 push   ebx ,push esi,push edi是辅助寄存器ebx,edi,esi的状态保存。作为通用寄存器,它们经常被用在一些常见的操作中。特别是在字符串、数组等的操作中,edi、esi通常作为存储目的、源数据的地址指针来使用。因此这里先保存这三个寄存器的值。
00411C6C  lea         edi,[ebp-0C0h]
00411C72  mov         ecx,30h
00411C77  mov         eax,0CCCCCCCCh
00411C7C  rep stos    dword ptr [edi]
程序获得局部变量空间的起始地址(低地址)并将它送入edi寄存器,然后通过循环指令rep stos将eax中的值存入以edi为起始地址的192字节的地址空间内。再说说为什么填充0CCCCCCCC. 只有在Debug时才填充。CC在VC++是INT3 ,作用是当把数据当成代码访问时就会引起一个中断引发一个导常主要是Debug时用到。最后是分192配192个字节的问题,其实在所有的Visual C++函数中,编译器都要分配192的保留空间。如果定义了局部变量,则在192的基础上再加。所以这个是一个保留的空间这里是192也可以是其他的数。
2010-5-5 15:52
0
雪    币: 508
活跃值: (89)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
11
多谢mcaok的回复,懂了一些
2010-5-5 17:57
0
游客
登录 | 注册 方可回帖
返回
//