首页
社区
课程
招聘
[已解决]保护模式与DS
发表于: 2009-1-20 03:38 5451

[已解决]保护模式与DS

2009-1-20 03:38
5451
已解决, 答案见9楼。

005C4DAE     00             DB 00
005C4DAF     00             DB 00
005C4DB0   . 00000000       DD 00000000
005C4DB4     00             DB 00
005C4DB5     00             DB 00
005C4DB6     00             DB 00
005C4DB7     00             DB 00
005C4DB8     00             DB 00
005C4DB9     00             DB 00
005C4DBA     00             DB 00
005C4DBB     00             DB 00
005C4DBC     00             DB 00
005C4DBD     00             DB 00
005C4DBE     00             DB 00
005C4DBF     00             DB 00
005C4DC0   > 52             PUSH EDX
005C4DC1   . A1 B04D5C00    MOV EAX,DWORD PTR DS:[5C4DB0]
005C4DC6   . 83F8 00        CMP EAX,0
005C4DC9   . 75 26          JNZ SHORT Babylon.005C4DF1
005C4DCB   . 68 904D5C00    PUSH Babylon.005C4D90                    ; /FileName = "ttd.dll"
005C4DD0   . FF15 04545C00  CALL DWORD PTR DS:[<&KERNEL32.LoadLibrar>; \LoadLibraryW
005C4DD6   . 83F8 00        CMP EAX,0
005C4DD9   . 74 1A          JE SHORT Babylon.005C4DF5
005C4DDB   . 68 A04D5C00    PUSH Babylon.005C4DA0                    ; /ProcNameOrOrdinal = "speakw"
005C4DE0   . 50             PUSH EAX                                 ; |hModule
005C4DE1   . FF15 00545C00  CALL DWORD PTR DS:[<&KERNEL32.GetProcAdd>; \GetProcAddress
005C4DE7   . A3 B04D5C00    MOV DWORD PTR DS:[5C4DB0],EAX
005C4DEC   . 83F8 00        CMP EAX,0
005C4DEF   . 74 04          JE SHORT Babylon.005C4DF5
005C4DF1   > FFD0           CALL EAX
005C4DF3   . EB 01          JMP SHORT Babylon.005C4DF6
005C4DF5   > 5A             POP EDX
005C4DF6   >^E9 8957F3FF    JMP Babylon.004FA584
005C4DFB     00             DB 00
005C4DFC     00             DB 00


上面是一段为babylon添加语音接口的代码 (Credit: 跳跳狗)

请教
DS:[5C4DB0]             (line 17)

其中的DS到底是什么意思?

读了一些关于386 Protected Mode Memory Addressing 的简介,但不是很明白:

DS是data segment 的selector, 但5C4DB0属于PE中.code的部分,为什么不能用CS:[5C4DB0]?

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

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶一下,

请牛人讲一讲PE中的section (code, data), 与实际上CS, DS register 的关系究竟是怎样的?
2009-1-21 13:10
0
雪    币: 71
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
看看保护模式的全局和局部描述表吧
这章比较难。我到现在也没理解透彻。
2009-1-21 13:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
飞云~```飞云~``
2009-1-22 09:08
0
雪    币: 8209
活跃值: (4458)
能力值: ( LV15,RANK:2459 )
在线值:
发帖
回帖
粉丝
5
PE中section name可以随意定义的,和进程执行期间的段寄存器没有关系
2009-1-22 09:55
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢楼上几位的答复。

以下是我能找到唯一提到PE与DS/CS关系的资料。


http://www.thehackerslibrary.com/?p=377
20 4 BaseOfCode The address that is relative to the image base of the beginning-of-code section when it is loaded into memory. The value at that location in file is loaded into memory, and that memory location is loaded as the CS
24 4 BaseOfData The address that is relative to the image base of the beginning-of-data section when it is loaded into memory. When the data at the section is loaded into memory, that memory location is loaded into the DS


我的理解是PE文件中code section与data section由BaseOfCode和BaseOfData决定, 载入内存后分别与CS和DS相关。

那么看一下babylon.exe:

BaseOfCode=1000
BaseOfData=1C5000

ImageBase=400000

data section 难道不应该从5C5000开始吗?5C4DB0应属code section吧?  

那DS:[5C4DB0] 用的是data segment的register/selector 去获取code section 内存的一个值,这是什么原理?

(实践证明这确实可行,而CS:[5C4DB0]是错误的。)

我想我不明白的是:DS 对应的descriptor所描述的memory segment中载入的到底是什么?Base Address对应的是PE文件中的哪里?

还有个问题就是DS在程序的执行中会变化吗?如果它不变,那它对应的GDT中descriptor 的base address 会不会变?
2009-1-22 11:31
0
雪    币: 1596
活跃值: (25)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
7
一个菜鸟的分析,不一定对!
--------------------------------------------------------------------------------------
005C4DC1   . A1 B04D5C00    MOV EAX,DWORD PTR DS:[5C4DB0]
005C4DC6   . 83F8 00        CMP EAX,0
005C4DC9   . 75 26          JNZ SHORT Babylon.005C4DF1
005C4DCB   . 68 904D5C00    PUSH Babylon.005C4D90  ; /FileName = "ttd.dll"
005C4DD0   . FF15 04545C00  CALL DWORD PTR DS:[<&KERNEL32.LoadLibrar>; \LoadLibraryW
-------------------------------------------------
MOV EAX,DWORD PTR DS:[5C4DB0]可能是把存在“内存”中的数据传给EAX,这个数据应该用于KERNEL32.LoadLibrar这个API,这个“内存”中的数据应该是之前就从寄存器传过来的,从临时存放用。
如果这个数据为0就不加载"ttd.dll"。
LoadLibrar:
说明
载入指定的动态链接库,并将它映射到当前进程使用的地址空间。一旦载入,即可访问库内保存的资源
返回值
Long,成功则返回库模块的句柄,零表示失败。会设置GetLastError
2009-1-23 08:07
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
感谢你的分析。这段代码的作用我是明白的,不明白的是DS在保护模式中的工作的机理。

再简单点说,

ollydbg 中显示:

P 1  CS 001B 32bit 0(FFFFFFFF)
A 0  SS 0023 32bit 0(FFFFFFFF)
Z 1  DS 0023 32bit 0(FFFFFFFF)


据说0(FFFFFFFF) 代表 base address为0, limit 为 FFFFFFFF. (https://www.openrce.org/forums/posts/897)

不理解:
1. 既然0~FFFFFFFF全部可以access, 何来"保护“?
2. CS base address 同样为0, 为什么不行?

(注:我对保护模式的理解:
见图:
http://www.viralpatel.net/taj/tutorial/protectedmode.php
http://www.ece.unm.edu/faculty/jimp/310/slides/micro_arch2.html
2009-1-25 11:17
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
9
关于保护模式的内存模型和寻址模式,对操作系统而言是必要的,对用户应用程序,操作系统都已经给设置好了,应用程序完全不用关心CS、DS等东西,只是在Windows下,FS有特殊作用,也仅仅是汇编程序员以及编译器和库例程开发人员才需要涉及,普通的高级语言开发的应用程序不用去顾及这些。

在Windows及其它大部分的现代操作系统中,是不使用Intel的“段”保护机制的,或仅使用极其有限的保护(比如特权级检查,而不是地址有效性检查),所使用的内存模型被称为flat模型(过去16位时代由于分段的使用,内存模型有TINY、SMALL、LARGE等多种模型)。现代的体系结构趋向于使用纯粹的“页”保护。

自从计算机进入32位时代,程序有了4G线性地址空间,分段内存这种体系就逐渐被淘汰,很少使用的。运行在intel平台上的各种操作系统,几乎全部选择“绕过”段保护这个机制,使用flat内存模型。

在flat模式,CS、DS、ES、SS的基都为0,限都是FFFFFFFF,互相之间完全重叠。所以程序中,mov eax, ds:[0x12345678]和mov eax,cs:[0x12345678]所访问到的是同一个内存单元。

至于PE文件的section、BaseOfCode等,完全是在线性地址(或虚拟地址)空间里进行描述的,是逻辑上的概念,与intel的段基址没有关系。
2009-1-25 12:51
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
怎没出版社找书呆彭?
2009-1-25 13:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
听君一席话,胜读十年书。

再用CS试了下确实可行,效果是一样的。上次没试成,是因为初学汇编没把代码改完全的缘故。

感谢书呆彭和各位的帮助,祝大家新年快乐!
2009-1-25 15:13
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
按现在的理解,这段的解释很有问题。
2009-1-25 15:28
0
游客
登录 | 注册 方可回帖
返回
//