首页
社区
课程
招聘
关于CCDebuger版主的 OllyDBG入门系列(三)的一些疑惑[求助]
发表于: 2006-7-26 23:39 4739

关于CCDebuger版主的 OllyDBG入门系列(三)的一些疑惑[求助]

2006-7-26 23:39
4739
原贴地址 http://bbs.pediy.com/showthread.php?s=&threadid=21308 这段内容在帖子的中后部
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         ; 不等则完蛋

以上代码中间  00403B43 |. 8B46 FC         MOV EAX,DWORD PTR DS:[ESI-4]        ; 用户名长度送EAX
这一句我不明白为什么DWORD PTR DS:[ESI-4] 的内容会是用户名长度 ?DS:不是指数据段吗 ,我对这句的理解是先把 esi内容减4 然后 把数据段中以这个减的结果作为偏移地址的地址中的内容送至EAX 不知这样理解对不对? 还有 后面的这句
00403B55 |> 8B0E            MOV ECX,DWORD PTR DS:[ESI]          ; 把我们输入的用户名送到ECX
我不明白为什么DWORD PTR DS:[ESI] 的内容会是用户名 ?
疑问很多 希望版主以及各位高手不吝赐教 感激不尽
原贴地址 http://bbs.pediy.com/showthread.php?s=&threadid=21308 这段内容在帖子的中后部

还有就是关于汇编语言中关于传送指令怎么区分传送的是十六进制数还是ascii码

我是新手,才学破解几天,问的不对的地方希望大家不要笑话 \^0^/

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 184
活跃值: (108)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
2
你这个学习态度值得嘉奖,有了基本的crack的韧劲,看样子后生可畏.
作为cracker的基本功就是读通语句的功能.

在windows32位操作系统中,空间是平坦的,不需要划分段地址了,段地址是老的操作系统DOS下由于寄存器寻址空间不够造成必须要用段地址+偏移来寻址.这些段地址对于现在来说,可以是跳过学习了,过时的寻址技术.

从基本理解上,你的单句理解是对的,但就像你看英文不能只看字母,要全面的组合看字母看你才能理解它.这里的放着用户名长度是程序其它地方的函数生成的,放在这个位置.至于为什么这个地方CCDebuger能一眼看过去就知道是用户名长度,这个是他通盘读了程序
明白这个地方和用户名的长度相关联.加油,当你有了足够的经验的时候,你也能一眼看过去,就知道它这里放的大致的是什么东西.

至于mov指令传送的是什么内容,需要具体问题具体分析,还是我说的哪样一句话,它传送什么是有意义的,你需要更加上下文来读懂它传送的是什么内容.

祝你愉快!!!
2006-7-27 01:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢你对我提问的关注及对我的鼓励 我会好好加油的!
2006-7-27 02:14
0
雪    币: 2506
活跃值: (1000)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
4
感谢hnhuqiong的解释!hnhuqiong兄解释过了,我就可以偷懒不用回了
祝楼主学习愉快!
2006-7-27 09:13
0
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
我来斗胆回答一下另一个问题吧:“为什么DWORD PTR DS:[ESI] 的内容会是用户名”,实际上DWORD PTR DS:[ESI]并不是用户名,而是用户名中的某4个字符,我想是版主为了省事偷了一点懒呵呵(CCDebuger表打小弟啊)。
下面是接下来的代码,我加了一些注释:
00403B55  |> /8B0E          /MOV ECX,DWORD PTR DS:[ESI]              ;  把我们输入的用户名的首4位送到ECX
00403B57  |. |8B1F          |MOV EBX,DWORD PTR DS:[EDI]              ;  把“Registered User”的首4位送到EBX
00403B59  |. |39D9          |CMP ECX,EBX                             ;  比较
00403B5B  |. |75 58         |JNZ SHORT CrackMe3.00403BB5             ;  不等则完蛋
00403B5D  |. |4A            |DEC EDX                                 ;  计数器减1
00403B5E  |. |74 15         |JE SHORT CrackMe3.00403B75              ;  计数器为0则跳出
00403B60  |. |8B4E 04       |MOV ECX,DWORD PTR DS:[ESI+4]            ;  把我们输入的用户名的5-8位送到ECX
00403B63  |. |8B5F 04       |MOV EBX,DWORD PTR DS:[EDI+4]            ;  把“Registered User”的5-8位送到EBX
00403B66  |. |39D9          |CMP ECX,EBX                             ;  比较
00403B68  |. |75 4B         |JNZ SHORT CrackMe3.00403BB5             ;  不等则跳出
00403B6A  |. |83C6 08       |ADD ESI,8                               ;  将原来指向输入的用户名的偏移地址加8
00403B6D  |. |83C7 08       |ADD EDI,8                               ;  将原来指向“Registered User”的偏移地址加8
00403B70  |. |4A            |DEC EDX                                 ;  计数器减1
00403B71  |.^\75 E2         \JNZ SHORT CrackMe3.00403B55             ;  计数器不为0则跳回去循环比较(因为ESI,EDI都已经加8,这时比较9-12位)

说明一下,上面的注释适用于首轮循环。实际上这里采用的方式是每次比较8个位,这8位分成两个4字节用WORD(4字节)形式比较,相同则偏移加8,不相同则跳出。本人菜鸟,说得不对的请指教呵呵。
2006-7-27 10:13
0
雪    币: 2506
活跃值: (1000)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
6
都给你们绕昏了,刚才看了一下,这是OllyDBG入门系列(二)里面的吧?我还跑去翻入门(三)里的内容,愣是没找到这段代码
楼上分析完全正确
2006-7-27 10:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
啊不好意思是我一时疏忽搞错了 确实应该是 OllyDBG入门系列(二) 谢谢ccdebuger大哥的热心   刚才我又跟着ccdebuger大哥的教程走了一边 确实如五楼兄弟分析的一样 前两天可能看的有点粗 真是不好意思
我还有一点疑问希望能得到各位的指导 还是在OllyDBG入门系列(二)里面 就是中间这一段

(我们在上图中地址 00440F2C 处按 F2 键设个断点,现在我们按 F9 键,程序已运行起来了。我在上面那个编辑框中随便输入一下,如 CCDebuger,下面那个编辑框我还保留为原来的“754-GFX-IER-954”,我们点一下那个“Register now !”按钮,呵,OllyDBG 跳了出来,暂停在我们下的断点处。我们看一下信息窗口,你应该发现了你刚才输入的内容了吧?我这里显示是这样:

堆栈 SS:[0012F9AC]=00D44DB4, (ASCII "CCDebuger")
EAX=00000009)

按理说以SS:[0012F9AC]开头的九个单元应该是ASCII "CCDebuger"的ascii码值啊算起来也应该站九个单元 可谓什么这里却是00D44DB4,这个问题已经困扰我几天了希望哪位高手能解释一下,谢谢啦
2006-7-27 11:35
0
雪    币: 2506
活跃值: (1000)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
8
长时间不看这个,我也记不大清了。这个00D44DB4应该是个地址,里面的内容是"CCDebuger",并不是说00D44DB4是"CCDebuger"的ASCII字串。
2006-7-27 11:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不是啊 你看代码 堆栈 SS:[0012F9AC]=00D44DB4, (ASCII "CCDebuger")

0012F9AC才是地址 ss代表此地址是指向堆栈段的 我同时查了堆栈段和数据段的0012F9AC这个地址内容都是0012F9AC 所以我才不明白
2006-7-27 12:13
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
10
[0012F9AC]=00D44DB4, (ASCII "CCDebuger")
[0012F9AC]是一个指针的指针,它保存着00D44DB4指针。
00D44DB4才是指向"CCDebuger"的ASCII码的指针。你查一下数据段的00D44DB4地址就清楚了。
2006-7-27 12:29
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
谢谢小虾版主的指导 我刚才用od重新载入一边看了一下果然是那样的 但是我又不明白了 既然00D44DB4是指向"CCDebuger"的ASCII码的指针,那么请看这段代码
00440F2C |. 8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
00440F2F |. BA 14104400     MOV EDX,CrackMe3.00441014             ; ASCII "Registered User"
00440F34 |. E8 F32BFCFF     CALL CrackMe3.00403B2C                ; 关键,要用F7跟进去  
00440F39 |. 75 51           JNZ SHORT CrackMe3.00440F8C           ; 这里跳走就完蛋

从上面00440F34的关键call跟进去了后出现下面的代码:
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                ; 相同则跳

上面00403B33处却CMP EAX,EDX,也就是把指向"CCDebuger"的指针和指向“Registered User”的指针相比较,两个指针比较有什么意义呢,而且我把
00403b35处的je改成jmp后发现跳转后(也既如果两个指针相等)既走向死亡 不太明白这段的意思
2006-7-27 13:13
0
雪    币: 2506
活跃值: (1000)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
12
这里比较的是操作数,也就是用EAX和EDX中的内容比较,CMP执行减法操作,再判断标志位。建议你再熟悉一下相关的汇编指令。
2006-7-27 13:41
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
13
判断两个指针是否相同,如果相同的话,那么程序可以肯定给人修改过。这主要是防止暴破手修改比较函数的两个参数指针所作一的个小判断。
2006-7-27 14:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
原来如此 谢谢小虾大侠 呵呵
通过这个帖子内容的研究又让我掌握了不少知识 在这里强烈谢谢所有回复了本帖的兄弟!!!
2006-7-27 14:26
0
游客
登录 | 注册 方可回帖
返回
//