首页
社区
课程
招聘
[求助]新手对MOV ECX,DWORD PTR DS:[ESI] 的困惑
发表于: 2008-8-30 20:10 21041

[求助]新手对MOV ECX,DWORD PTR DS:[ESI] 的困惑

2008-8-30 20:10
21041
看了CCDEBUG 大哥的OD教程,我也学着读了下代码,可到关键部分怎么也理解不了语句的意思,看注释也想不通
有2处注释是否错了,见红色部分,困惑中。。。
以下是CCDEBUG 的文章引用部分。。。。。
们所看到的那些 PUSH EBX、 PUSH ESI 等都是调用子程序保存堆栈时用的指令,不用管它,按 F8 键一步步过来,我们只关心关键部分:

00403B2C /$ 53              PUSH EBX
00403B2D |. 56              PUSH ESI
00403B2E |. 57              PUSH EDI
00403B2F |. 89C6            MOV ESI,EAX                         ; 把EAX内我们输入的用户名送到 ESI
00403B31 |. 89D7            MOV EDI,EDX                         ; 把EDX内的数据“Registered User”送到EDI
00403B33 |. 39D0            CMP EAX,EDX                         ; 用“Registered User”和我们输入的用户名作比较
00403B35 |. 0F84 8F000000   JE CrackMe3.00403BCA                ; 相同则跳
00403B3B |. 85F6            TEST ESI,ESI                        ; 看看ESI中是否有数据,主要是看看我们有没有输入用户名
00403B3D |. 74 68           JE SHORT CrackMe3.00403BA7          ; 用户名为空则跳
00403B3F |. 85FF            TEST EDI,EDI
00403B41 |. 74 6B           JE SHORT CrackMe3.00403BAE
00403B43 |. 8B46 FC         MOV EAX,DWORD PTR DS:[ESI-4]        ; 用户名长度送EAX
00403B46 |. 8B57 FC         MOV EDX,DWORD PTR DS:[EDI-4]        ; “Registered User”字串的长度送EDX00403B49
|. 29D0            SUB EAX,EDX                         ; 把用户名长度和“Registered User”字串长度相减
00403B4B |. 77 02           JA SHORT CrackMe3.00403B4F          ; 用户名长度大于“Registered User”长度则跳
00403B4D |. 01C2            ADD EDX,EAX                         ; 把减后值与“Registered User”长度相加,即用户名长度
00403B4F |> 52              PUSH EDX
00403B50 |. C1EA 02         SHR EDX,2                           ; 用户名长度值右移2位,这里相当于长度除以4
00403B53 |. 74 26           JE SHORT CrackMe3.00403B7B          ; 上面的指令及这条指令就是判断用户名长度最少不能低于4
00403B55 |> 8B0E            MOV ECX,DWORD PTR DS:[ESI]          ; 把我们输入的用户名送到ECX
00403B57 |. 8B1F            MOV EBX,DWORD PTR DS:[EDI]          ; 把“Registered User”送到EBX
00403B59 |. 39D9            CMP ECX,EBX                         ; 比较
00403B5B |. 75 58           JNZ SHORT CrackMe3.00403BB5         ; 不等则完蛋

红色部分,小弟有一下困惑:
1,ptr 应该是传递的一个地址吧?怎么变成了字符串长度?
2,dword 是把地址变为32位地址的意思吧?
3,小弟是新手,DS:[ESI-4]是取字符串低位地址(首地址)吧?

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

收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 82
活跃值: (10)
能力值: (RANK:210 )
在线值:
发帖
回帖
粉丝
2
取地址内数据送寄存器
2008-8-30 20:15
0
雪    币: 230
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
注释上明明写的是长度么?
2008-8-30 20:23
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
DWORD PTR DS:[ESI]是字符串本身
前面的4个字节存储的是字符串的长度
2008-8-31 09:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
想问一下,LZ看的这个例子是哪一篇里的,题目是什么,我想具体看一下!
2008-9-9 15:39
0
雪    币: 247
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
通常在C语言中:
char c[6] = "pediy";
在内存中存储格式是:'p','e','d','i','y','\0'。

但是某些高级语言或是某些编译器中(比如Dephi,或者BCB),为了字符串使用的安全
存储格式为:    05,00,00,00,'p','e','d','i','y','\0'。(这样写应该能看懂吧?)

所以当EDI指向用户名的时候,dword ptr [EDI-4]就是这个字符串的长度。
2008-9-9 17:03
0
雪    币: 13
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习啦,不错
2010-2-8 10:37
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
8
6楼 正解!
2010-2-8 11:25
0
雪    币: 458
活跃值: (421)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
9
-
PS:这样的问题发到求助问答区吧!
2010-2-8 11:27
0
雪    币: 65
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
恩,EDI和ESI此时应该都是指针值,DOWRD PTR[]就是指指针所指向的值
2010-2-8 17:50
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
6楼讲得很好
2010-2-14 23:40
0
雪    币: 488
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
[QUOTE=安摧;507161]通常在C语言中:
char c[6] = "pediy";
在内存中存储格式是:'p','e','d','i','y','\0'。

但是某些高级语言或是某些编译器中(比如Dephi,或者BCB),为了字符串使用的安全,
存储格式为:    05,00,00,00,'p','e','d','i','...[/QUOTE]

不错,长见识了
2010-11-3 20:41
0
雪    币: 421
活跃值: (60)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
13
长知识了!谢谢。!
2010-11-3 21:21
0
雪    币: 91
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习了,这个还真明白怎么回事了。
2012-12-9 21:10
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
6楼高手!!
2017-8-21 01:03
0
游客
登录 | 注册 方可回帖
返回
//