能力值:
( LV2,RANK:10 )
|
-
-
2 楼
郁闷啊!!我到现在连找断点都还不会!!
同楼主一起学习中!o(∩_∩)o...哈哈
|
能力值:
(RANK:410 )
|
-
-
3 楼
ecx 为counter计数器,后面的rep要用到。楼主去查下汇编指令rep stos.
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
晕 找断点? 自己设置啊
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
恩 我就是不知道为什么是30h ?
谢谢大家关注
|
能力值:
(RANK:410 )
|
-
-
6 楼
用int3(CC)填充一片大小为30h的区域。为什么是30h,我也不知。等高手解答。
xor eax,eax 为return 0;
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
还是想请大鸟说说啊
|
能力值:
( 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
|
能力值:
( 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中
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
学习了,8楼说的很好。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
谢谢大家:)
学习了
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
学习了
不过我实在没看出高级代码哪里给数组赋值了
|
能力值:
( 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。
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
谢谢大家:)
学习了
|
能力值:
( LV9,RANK:140 )
|
-
-
15 楼
00411372 mov ecx,30h //就是把十六进制的30放到ecx中
0041137C rep stos dword ptr es:[edi] // 把eax中的数送到argv中
0041137E xor eax,eax // 清零eax
|
能力值:
(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的做法,我没有验证过。
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
0041136C lea edi,[ebp-0C0h]
00411372 mov ecx,30h
00411377 mov eax,0CCCCCCCCh
0041137C rep stos dwo...
|
能力值:
( 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清零 返回的话应该还有个赋值语句
}
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
学起来很费力!!!
|
能力值:
( LV2,RANK:10 )
|
-
-
20 楼
8楼讲得很详细,学习了,谢谢!
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
mov ebp,esp
好像不该解释为保护esp吧,小弟觉得这是分配栈空间的前奏
|
能力值:
( LV3,RANK:20 )
|
-
-
22 楼
继续学习
|
能力值:
( LV1,RANK:0 )
|
-
-
23 楼
同样学习了
|
能力值:
( LV2,RANK:10 )
|
-
-
24 楼
谁的洛阳铲,使得真好
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
00411372 mov ecx,30h // 不理解 ,为什么是30h ?是什么意思呢? 这个是由编译器来分配的,不同的编译器,分配的缓冲区也不一样。
|
|
|