首页
社区
课程
招聘
[旧帖] [求助]阅读一段代码的疑惑 0.00雪花
发表于: 2009-2-17 16:22 2957

[旧帖] [求助]阅读一段代码的疑惑 0.00雪花

2009-2-17 16:22
2957
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”字串的长度送EDX
00403B49 |. 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         ; 不等则完蛋

根据上面的分析,我们知道用户名必须是“Registered User”。

=========================================================
上面文章提到的代码既然判断输入字符串是否是“Registered User”,为什么不是“不等”就跳呢?为啥还要判断下面的长度啊等内容,小弟不是很理解

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

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 293
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个问题已经被问了好几遍了……
搜索一下吧。
http://bbs.pediy.com/showthread.php?t=70751
2009-2-17 16:30
0
雪    币: 508
活跃值: (89)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
不,我的问题和那个链接的问题不一样,我的意思是
00403B33 |. 39D0            CMP EAX,EDX                         ; 用“Registered User”和我们输入的用户名作比较
00403B35 |. 0F84 8F000000   JE CrackMe3.00403BCA                ; 相同则跳

这里为啥用JE,怎么不用JNE来判断,这样就省去了后面的长度比较了,作者的目的是什么?
2009-2-17 16:36
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
4
00403B33 |. 39D0            CMP EAX,EDX
这个才是比较长度
2009-2-17 16:41
0
雪    币: 508
活跃值: (89)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
这个不是比较寄存器内容的吗?怎么又比较长度了呢?
2009-2-17 16:52
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
前面的比较返回值.后面是一个条件语句..
2009-2-17 17:38
0
雪    币: 508
活跃值: (89)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
7
我问的不是语法,是程序逻辑
2009-2-17 17:58
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
8
kanxe : 估计这个CrackMe这地方是故意迷惑人的
http://bbs.pediy.com/showthread.php?s=&threadid=24703
2009-2-17 18:16
0
雪    币: 508
活跃值: (89)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
这样就能防住爆破了吗?我多改几次跳转还是能爆破啊
2009-2-17 18:24
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
追了一下. 不是防爆. 反到是这问题以前被人问到爆了
00440F34  |.  E8 F32BFCFF   call    00403B2C
用的是 Delphi 的字符串比对函数 (看他这么低的位址即知)
很单纯的字符串比对函数, 函数开头先检查一下 if 来源=目的 , 当然直接返回 ZF=1

节省了某些状况所花掉的多余时间.

1. 这CM可能后来被改过, 导致混乱
2. 所有人牛角都钻进Delphi的函数里了.

原CM 只允许下列条件才会成功 :
  用户名:Registered User
  注册码:GFX-754-IER-954

若你在其它地方看到用户名不是这字符串的话, 则是被改过的.

原CM : http://bbs.pediy.com/showthread.php?t=21308
2009-2-17 18:29
0
游客
登录 | 注册 方可回帖
返回
//