能力值:
( LV2,RANK:10 )
|
-
-
626 楼
很好~又学习了~继续下一站
|
能力值:
( LV2,RANK:10 )
|
-
-
627 楼
能看见这么精彩详细的教学,真的受益了,诚心给你说一句,我们新手感谢你!
|
能力值:
( LV2,RANK:10 )
|
-
-
629 楼
辛苦LZ了,这几天在看雪网站学到了不少啊~
|
能力值:
( LV2,RANK:10 )
|
-
-
630 楼
这篇也认真看完咯
|
能力值:
( LV2,RANK:10 )
|
-
-
631 楼
很好的资料,谢谢.
|
能力值:
( LV2,RANK:10 )
|
-
-
632 楼
我有一个小问题,怎摸知道是要在00440F2C处下断点,是根据什么判断的?
|
能力值:
( LV2,RANK:10 )
|
-
-
633 楼
CM,已经搞定
很高兴啊
|
能力值:
( LV2,RANK:10 )
|
-
-
635 楼
非常感谢!学习中
|
能力值:
( LV2,RANK:10 )
|
-
-
636 楼
新手学习中。.........
|
能力值:
( LV2,RANK:10 )
|
-
-
637 楼
别的不说了,顶死你就可以了
|
能力值:
( LV2,RANK:10 )
|
-
-
638 楼
看完了第一篇,谢谢
|
能力值:
( LV5,RANK:60 )
|
-
-
639 楼
太好了,十分感谢,总之就是感谢。支持,坚决支持。
|
能力值:
( LV2,RANK:10 )
|
-
-
640 楼
不愧是"置顶"的好文.
找了N篇文章,只有LZ这几篇文章才是真正的入门教材.希望多写这样的教材!
代表无数想学破解的朋友,对LZ表示忠心的感谢.
大恩不言谢,只有把你往死里顶.
|
能力值:
( LV2,RANK:10 )
|
-
-
641 楼
谢谢!这步学会了,我会好好往下学的
|
能力值:
( LV2,RANK:10 )
|
-
-
642 楼
谢谢楼主啊,
不过学的累死人了,
注册码:GFX-754-IER-954
软件发过来的是754-GFX,怪不得老不行
|
能力值:
( LV2,RANK:10 )
|
-
-
643 楼
谢谢了,刚来
|
能力值:
( LV2,RANK:10 )
|
-
-
645 楼
我认为原注释有不恰当的地方:
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 ; 用户名为空则跳
其中 CMP EAX,EDX ; 用“Registered User”和我们输入的用户名作比较
这里应该是用“Registered User”所在的内存地址 和 我们输入的用户名所在的内存地址 做比较!!
不知道这个是否是一种习惯说法,不过这似乎会使人迷惑,第一个感觉就是32位4字节的寄存器能存得下这么多字符吗?
有一个地方是原注释没有解释清楚的:
00403B49 |. 29D0 SUB EAX,EDX ; 把用户名长度和“Registered User”字串长度相减
00403B4B |. 77 02 JA SHORT CrackMe3.00403B4F ; 用户名长度大于“Registered User”长度则跳
00403B4D |. 01C2 ADD EDX,EAX ; 把减后值与“Registered User”长度相加,即用户名长度
实际上这是一个交换两个变量的算法,是《深入理解计算机系统》P.39页 inplace_swap算法的另一个实现。
EAX = EAX - EDX ; step 1
EDX = EDX + EAX ; step 2
结果是 EDX = 原 EAX 的值,既得到我们输入的用户名的长度
算法分析 :
------------------------------------------------------------------------------------------------------------------
00440F2C |. 8B45 FC mov eax, [ebp-4] ; EAX = 我们输入的用户名地址
00440F2F |. BA 14104400 mov edx, 00441014 ; Edx = "registered user" 地址
00440F34 |. E8 F32BFCFF call 00403B2C ; 验证用户名,寄存器 Z = 0 失败,Z = 1 成功
00440F39 |. 75 51 jnz short 00440F8C
00440F3B |. 8D55 FC lea edx, [ebp-4]
00440F3E |. 8B83 C8020000 mov eax, [ebx+2C8]
00440F44 |. E8 D7FEFDFF call 00420E20
00440F49 |. 8B45 FC mov eax, [ebp-4] ; EAX = 我们输入的注册码 地址
00440F4C |. BA 2C104400 mov edx, 0044102C ; EDX = "gfx-754-ier-954" 地址
00440F51 |. E8 D62BFCFF call 00403B2C ; 验证注册码
验证用户名和注册码的函数
00403B2F |. 89C6 mov esi, eax ; ESI = 我们输入的用户名 的地址
00403B31 |. 89D7 mov edi, edx ; EDI = "Registered User" 的地址
00403B33 |. 39D0 cmp eax, edx
00403B35 |. 0F84 8F000000 je 00403BCA ; "Registered User" 和 "用户名" 地址相等则跳
00403B3B |. 85F6 test esi, esi
00403B3D |. 74 68 je short 00403BA7 ; 指针esi空则跳
00403B3F |. 85FF test edi, edi
00403B41 |. 74 6B je short 00403BAE ; 指针edi空则跳
00403B43 |. 8B46 FC mov eax, [esi-4] ; EAX = 用户名长度
00403B46 |. 8B57 FC mov edx, [edi-4] ; EDX = 字符串"Registered User"的长度等于15
00403B49 |. 29D0 sub eax, edx ; eax = eax - edx
00403B4B |. 77 02 ja short 00403B4F ; 输入的用户名 > 15 跳
00403B4D |. 01C2 add edx, eax ; step 1
00403B4F |> 52 push edx ; 保存 输入的用户名长度
00403B50 |. C1EA 02 shr edx, 2 ; step 2 交换两个变量的算法既 edx = eax,现在edx是用户名长度
00403B53 |. 74 26 je short 00403B7B ; 用户名 < 4 跳
00403B55 |> 8B0E /mov ecx, [esi] ; ecx = 用户名的 前4个字符
00403B57 |. 8B1F |mov ebx, [edi] ; ebx = "Registered User" 的前4个字符
00403B59 |. 39D9 |cmp ecx, ebx
00403B5B |. 75 58 |jnz short 00403BB5 ; 前4个字符不等则跳
00403B5D |. 4A |dec edx ; 如果用户名长度等于4,前面除4后等于1,这里减1就是0了
00403B5E |. 74 15 |je short 00403B75 ; 未比较的字符数已经 < 4,跳
00403B60 |. 8B4E 04 |mov ecx, [esi+4] ; ecx = 用户名的后4个字符
00403B63 |. 8B5F 04 |mov ebx, [edi+4] ; ebx = "Registered User" 的后4个字符
00403B66 |. 39D9 |cmp ecx, ebx ; 比较
00403B68 |. 75 4B |jnz short 00403BB5 ; 前8个字符不等跳
00403B6A |. 83C6 08 |add esi, 8 ; 让 指针esi 越过前8个指符
00403B6D |. 83C7 08 |add edi, 8 ; 参见上一条
00403B70 |. 4A |dec edx
00403B71 |.^ 75 E2 \jnz short 00403B55
00403B73 |. EB 06 jmp short 00403B7B
00403B75 |> 83C6 04 add esi, 4 ; 前面的循环最大比较字符数是12,最小比较字符数是4,\
00403B78 |. 83C7 04 add edi, 4 ; 这里让指针越过前12个字节或4字节
00403B7B |> 5A pop edx ; edx = 输入的用户名长度
00403B7C |. 83E2 03 and edx, 3 ; 用户名长度是否是 4 的整数倍,是就表明已经没有未判断字符
00403B7F |. 74 22 je short 00403BA3 ; 是4的整数倍 跳
00403B81 |. 8B0E mov ecx, [esi] ; ecx = 剩下的未比较字符,只可能有 1 ~ 3 个
00403B83 |. 8B1F mov ebx, [edi]
00403B85 |. 38D9 cmp cl, bl ; 比较一个字符
00403B87 |. 75 41 jnz short 00403BCA ; 不等跳,失败!!
00403B89 4A dec edx ; 未比较字符数减 1
00403B8A |. 74 17 je short 00403BA3 ; 收工了没?
00403B8C |. 38FD cmp ch, bh ; 比较下一个字符
00403B8E |. 75 3A jnz short 00403BCA ; 不等跳,失败!!
00403B90 |. 4A dec edx ; 未比较字符数减 1
00403B91 |. 74 10 je short 00403BA3 ; 收工了没?
00403B93 |. 81E3 0000FF00 and ebx, 0FF0000 ; 这次真的是最后一个字符了
00403B99 |. 81E1 0000FF00 and ecx, 0FF0000 ; 看吧,这里用掩码屏蔽掉低两个字符
00403B9F |. 39D9 cmp ecx, ebx ; 直接用32位寄存器来比较,好样的!做人不能太小器嘛
00403BA1 |. 75 27 jnz short 00403BCA ; 惨了,大风大浪都过来了想不到阴沟里翻船
00403BA3 |> 01C0 add eax, eax ; 好像没什么意义嘛
00403BA5 |. EB 23 jmp short 00403BCA ; 如果前面的最后一次 cmp 指令将零标志寄存器 Z 设置为 Z =1 就大功告成!!!
00403BA7 |> 8B57 FC mov edx, [edi-4] ; "Registered User" 的长度
00403BAA |. 29D0 sub eax, edx ; 这里是为了要将寄存器 Z 清零,这是验证用户名失败的暗号咯
00403BAC |. EB 1C jmp short 00403BCA
00403BAE |> 8B46 FC mov eax, [esi-4] ; 参见上面
00403BB1 |. 29D0 sub eax, edx
00403BB3 |. EB 15 jmp short 00403BCA
00403BB5 |> 5A pop edx ; edx = 用户名长度
00403BB6 |. 38D9 cmp cl, bl ; ---------------------------------------------
00403BB8 |. 75 10 jnz short 00403BCA
00403BBA |. 38FD cmp ch, bh ; 前面有4个字符的比较已经失败
00403BBC |. 75 0C jnz short 00403BCA
00403BBE |. C1E9 10 shr ecx, 10 ; 这一段分别比较每一个字符
00403BC1 |. C1EB 10 shr ebx, 10
00403BC4 |. 38D9 cmp cl, bl ; 不过似乎是多余的,大局已定
00403BC6 |. 75 02 jnz short 00403BCA
00403BC8 |. 38FD cmp ch, bh ; ----------------------------------------------
00403BCA |> 5F pop edi
00403BCB |. 5E pop esi
00403BCC |. 5B pop ebx
00403BCD \. C3 retn
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
能力值:
( LV2,RANK:10 )
|
-
-
648 楼
楼主真好,多谢了
|
能力值:
( LV2,RANK:10 )
|
-
-
649 楼
我晕..我狂晕...怎么我按教程来的....不好使呢?????
|