首页
社区
课程
招聘
[旧帖] [求助]一段简单的反汇编 请求帮助 0.00雪花
发表于: 2009-3-17 22:00 9243

[旧帖] [求助]一段简单的反汇编 请求帮助 0.00雪花

2009-3-17 22:00
9243
int _tmain(int argc, _TCHAR* argv[])
{
        return 0;
}

反汇编后:
=============================================
int _tmain(int argc, _TCHAR* argv[])
{
00411360  push        ebp  
00411361  mov         ebp,esp
00411363  sub          esp,0C0h
00411369  push        ebx  
0041136A  push        esi  
0041136B  push        edi  
0041136C  lea         edi,[ebp-0C0h]
00411372  mov         ecx,30h               //   不理解  ,为什么是30h ?是什么意思呢?
00411377  mov         eax,0CCCCCCCCh  
0041137C  rep stos    dword ptr es:[edi]    // 不理解 其含义
        return 0;
0041137E  xor         eax,eax     // 不理解 其含义
}
请大家指教   谢谢了

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (25)
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

郁闷啊!!我到现在连找断点都还不会!!
同楼主一起学习中!o(∩_∩)o...哈哈
2009-3-17 22:10
0
雪    币: 2316
活跃值: (129)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
3
ecx 为counter计数器,后面的rep要用到。楼主去查下汇编指令rep stos.
2009-3-17 22:20
0
雪    币: 190
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
晕  找断点?  自己设置啊
2009-3-17 22:21
0
雪    币: 190
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
恩  我就是不知道为什么是30h ?
谢谢大家关注
2009-3-17 22:22
0
雪    币: 2316
活跃值: (129)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
6
用int3(CC)填充一片大小为30h的区域。为什么是30h,我也不知。等高手解答。
xor eax,eax 为return 0;
2009-3-17 22:25
0
雪    币: 190
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
还是想请大鸟说说啊
2009-3-18 15:21
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
int _tmain(int argc, _TCHAR* argv[])
{
00411360  push        ebp      //保护ebp,不需要反它
00411361  mov         ebp,esp//保存ESP,不需要反它
00411363  sub          esp,0C0h //分配该函数所用动态内存的大小,不需要反它
00411369  push        ebx //保护ebx,不需要反它
0041136A  push        esi  //保护esi,不需要反它
0041136B  push        edi  //保护edi,不需要反它
0041136C  lea         edi,[ebp-0C0h] //把argv的首地址,给edi
00411372  mov         ecx,30h          // 把0x30这个立即数送ecx,是其后rep stos操作的计数
00411377  mov         eax,0CCCCCCCCh //把0x0ccccccc这个数送eax,送0x30次
0041137C  rep stos    dword ptr es:[edi]    // 把eax中的数送到argv中
  return 0;
0041137E  xor         eax,eax     //eax在函数中,通常存返回值,在这里清0(异或本身将是0),表示函数返回0
}
这段程序的意思,就是把argv的内容全部初始化为0x0CCCCCCC
你的程序不完整,有保护的语句,就是恢复的语句,如函数最后应有

pop        esi
pop        edi
pop        ebx
mov       esp, ebp
pop        ebp
2009-3-18 17:11
0
雪    币: 808
活跃值: (10)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
楼上解释的很详细,这段代码没什么难的。其实就是一个子程序。真正的功能就是如下代码:
0041136C  lea         edi,[ebp-0C0h] //把argv的首地址,给edi
00411372  mov         ecx,30h          // 把0x30这个立即数送ecx,是其后rep stos操作的计数
00411377  mov         eax,0CCCCCCCCh //把0x0ccccccc这个数送eax,送0x30次
0041137C  rep stos    dword ptr es:[edi]    // 把eax中的数送到argv中
2009-3-18 20:35
0
雪    币: 225
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习了,8楼说的很好。
2009-3-18 21:25
0
雪    币: 190
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢大家:)
学习了
2009-3-20 12:42
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习了

不过我实在没看出高级代码哪里给数组赋值了
2009-3-20 15:57
0
雪    币: 249
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
0041136C  lea         edi,[ebp-0C0h]
00411372  mov         ecx,30h               
00411377  mov         eax,0CCCCCCCCh  
0041137C  rep stos    dword ptr es:[edi]

这个应该是对栈填充CC,是debug版VC的手法
edi等于esp,
eax四字节,乘以0x30等于0xC0,
rep stos将函数栈全部写入int 3,
函数退出时一般call __chkesp。
2009-3-21 02:27
0
雪    币: 190
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
谢谢大家:)
学习了
2009-3-21 12:44
0
雪    币: 603
活跃值: (40)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
15
00411372  mov         ecx,30h   //就是把十六进制的30放到ecx中
0041137C  rep stos    dword ptr es:[edi]    // 把eax中的数送到argv中
0041137E  xor         eax,eax     // 清零eax
2009-3-21 13:40
0
雪    币: 2108
活跃值: (208)
能力值: (RANK:1260 )
在线值:
发帖
回帖
粉丝
16
[QUOTE=yuling;594363]0041136C  lea         edi,[ebp-0C0h]
00411372  mov         ecx,30h               
00411377  mov         eax,0CCCCCCCCh  
0041137C  rep stos    dwo...[/QUOTE]

赞同
但是不是debug版VC的做法,我没有验证过。
2009-3-21 16:38
0
雪    币: 182
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
0041136C  lea         edi,[ebp-0C0h]
00411372  mov         ecx,30h               
00411377  mov         eax,0CCCCCCCCh  
0041137C  rep stos    dwo...
2009-3-21 17:38
0
雪    币: 182
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
兄弟最近正在学反汇编,和你交流下

int _tmain(int argc, _TCHAR* argv[])
{
  return 0;
}

反汇编后:
=============================================
int _tmain(int argc, _TCHAR* argv[])
{
00411360  push        ebp  
00411361  mov         ebp,esp
00411363  sub         esp,0C0h
00411369  push        ebx  
0041136A  push        esi  
0041136B  push        edi  
0041136C  lea         edi,[ebp-0C0h]        //
00411372  mov         ecx,30h               //   30h是计数器和下面的联用存入字符
00411377  mov         eax,0CCCCCCCCh  
0041137C  rep stos    dword ptr es:[edi]    // 存入字符 也就是30h个  0CCCCCCCCh  30h*4=c0
上面的是函数初始化
  return 0;
0041137E  xor         eax,eax     // eax清零  返回的话应该还有个赋值语句
}
2009-3-21 17:39
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
学起来很费力!!!
2009-3-23 03:09
0
雪    币: 201
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
8楼讲得很详细,学习了,谢谢!
2009-3-23 08:43
0
雪    币: 11
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
mov         ebp,esp

好像不该解释为保护esp吧,小弟觉得这是分配栈空间的前奏
2009-3-23 13:24
0
雪    币: 101
活跃值: (743)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
22
继续学习
2020-6-11 20:40
0
雪    币: 54
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
23
同样学习了
2020-6-24 16:23
0
雪    币: 123
活跃值: (316)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
谁的洛阳铲,使得真好
2020-6-24 16:55
0
雪    币: 187
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
00411372  mov         ecx,30h               //   不理解  ,为什么是30h ?是什么意思呢?     这个是由编译器来分配的,不同的编译器,分配的缓冲区也不一样。
2020-6-26 16:18
1
游客
登录 | 注册 方可回帖
返回
//