首页
社区
课程
招聘
[原创]OllyDBG 入门系列(二)-字串参考
发表于: 2006-2-14 13:34 1501006

[原创]OllyDBG 入门系列(二)-字串参考

2006-2-14 13:34
1501006
收藏
免费 10
支持
分享
最新回复 (1465)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
626
很好~又学习了~继续下一站
2008-4-20 08:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
627
能看见这么精彩详细的教学,真的受益了,诚心给你说一句,我们新手感谢你!
2008-4-20 12:38
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
628
偶来顶过!!!
2008-4-25 18:15
0
雪    币: 223
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
629
辛苦LZ了,这几天在看雪网站学到了不少啊~
2008-4-26 16:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
630
这篇也认真看完咯
2008-4-26 23:52
0
雪    币: 177
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
631
很好的资料,谢谢.
2008-4-30 09:31
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
632
我有一个小问题,怎摸知道是要在00440F2C处下断点,是根据什么判断的?
2008-5-1 02:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
633
CM,已经搞定
很高兴啊
2008-5-2 00:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
634
太感谢了。终于明白了一些
2008-5-6 00:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
635
非常感谢!学习中
2008-5-7 15:47
0
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
636
新手学习中。.........
2008-5-8 00:45
0
雪    币: 123
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
637
别的不说了,顶死你就可以了
2008-5-8 10:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
638
看完了第一篇,谢谢
2008-5-9 09:15
0
雪    币: 286
活跃值: (14)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
639
太好了,十分感谢,总之就是感谢。支持,坚决支持。
2008-5-9 15:09
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
640
不愧是"置顶"的好文.
找了N篇文章,只有LZ这几篇文章才是真正的入门教材.希望多写这样的教材!
代表无数想学破解的朋友,对LZ表示忠心的感谢.
大恩不言谢,只有把你往死里顶.
2008-5-9 19:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
641
谢谢!这步学会了,我会好好往下学的
2008-5-14 13:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
642
谢谢楼主啊,
不过学的累死人了,
注册码:GFX-754-IER-954
软件发过来的是754-GFX,怪不得老不行
2008-5-14 16:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
643
谢谢了,刚来
2008-5-16 08:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
644
good up~~~~~
2008-5-16 10:39
0
雪    币: 200
活跃值: (10)
能力值: ( 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

--------------------------------------------------------------------------------------------------------------------------------------------------------------------
2008-5-18 12:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
646
那你写的出来吗。。。。。
2008-5-19 14:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
647
good up~~~
2008-5-19 14:06
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
648
楼主真好,多谢了
2008-5-23 10:59
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
649
我晕..我狂晕...怎么我按教程来的....不好使呢?????
2008-5-23 11:56
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
650
谢谢 还是看不懂
2008-5-24 01:30
0
游客
登录 | 注册 方可回帖
返回
//