|
|
用户名:icelord 笔名:icelord 地区: 北京 行业:其他 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
方寸间,历数世上桑田沧海
时空里,细问人间暑来秋往
是爱人,星移斗转情不改
是朋友,海角天涯记心怀
天凉了,别忘了披张狼皮
欢迎访问icelord的博客
awdBIOS 镜像结构简单分析
DrvHlpLib 下载地址
demo:
DrvHlpLIB:
DrvHlpLib(Src):
注:下载的文件都为.jpg后缀。
下载后去掉.jpg RAR解压即可。
关于编译失败的问题:
需要将代码中的库文件(如ntoskrnl.lib,hal.lib)拷贝到vc的include目录
您完全可以自己按需要重写一下
实质就是进入ring0将自己拷贝到内核空间,然后根据拷贝的地址进行重定位
使用延时加载是为了防止在exe启动时内核自动填写导入表出错
而且延时加载的GetProcAddress需要自己重写(应为在内核空间运行的限制...)
说的很明白了
over!
〈------------------以此为界------------------〉
好好学习、天天向上!
好久没有关注这里了,因为没有....
只有在......的时候...
才会想到......
......墙内墙外,在重复上演着......
我也身在其中......
活着便精彩...!!!
再看nt下无驱执行ring0代码
再看nt下无驱执行ring0代码
(在不考虑正误的前提下,胡说八道一番…有点罗嗦…没办法。。。)
Author:icelord@ustb@05/11/19
(这仅是一篇日记而已…)
大二时看网上的“无驱执行ring0代码”看得我一头雾水,今天重新拿起来看了几遍,有点收获,将想法记录一下….
X86平台上,cpu可以工作在三个特权级别下,ring0—ring3,其中ring0具有最高权限,可以执行任何指令而无限制,ring3受到cpu保护机制限制,只能执行非特权指令。当在ring3下执行特权指令如lgdt、iret等时,会触发general protection异常(也就是出错啦,跳转到相应得错误处理程序)。
在nt平台下,普通应用程序运行在ring3下,操作系统运行于ring0。如果在程序中需要执行一些特权指令的话,程序必须转入到ring0。由于用户程序执行特权指令可能会破坏系统资源,故出于保护和稳定的目的,操作系统通过“门”机制向用户态程序提供必要的服务。在x86种有四种门:中断门、陷阱门、调用门、任务门。
先描述一下门的概念,个人认为就是两种不同状态之间的通道,换句话说,也就是不同环(特权级)之间切换的通道。
一般在操作系统初始化时,由real mode进入保护模式(pmode)后,cpu就处于ring0状态,在完成各种初始化后,系统转入用户态并创建用户进程。用户程序需要特权服务时,通过系统调用进入ring0,由系统完成指定的、在提供的服务范围内的请求。这样可以避免恶意程序破坏系统。但是如果我们想执行一些“特殊的”操作时怎么办?
这个问题有几个解决方法,第一种方法是安装驱动;驱动程序作为内核的辅助模块为用户程序提供服务,它与操作系统一样工作在ring0,而且他是可以根据自己需编写。所以可以通过编写一个“自定义的”驱动程序来执行ring0代码,这种方法在nt下和linux下应该都可,(不好意思,本人没实践过,忙着“好好学习”,有时间再说)。第二种限定于nt平台,通过“自定义门”来实现执行ring0代码。
由于nt平台的特性,导致用户可以通过操作Section对象\\device\PhysicalMemory来操作物理内存。这样就可通过找到全局描述符表GDT或中断描述符表IDT并修改其内容来构造自己的“门”,甚至使用自定义代码来覆盖内核代码,。。。通过这些方法来达到执行ring0代码的目的。说得有点混乱…下面将一些预备知识,以便为后面理解作基础….


还有几个寄存器,这里就不乱说了….下面给出相应得结构:
/* 中断描述符结构 */
typedef struct IDT_ITEM__
{
unsigned short offset_low ; // 偏移量的0~15位
unsigned short seg_selector ; // 段选择符
unsigned char reserved1 ; // 未使用,须设为全零
unsigned char saved_1_1_0 : 3 ; // 类型/中断门14/陷阱门15
unsigned char d : 1 ; // D 位
unsigned char reserved2 : 1 ; // 保留,需设为0
unsigned char dpl : 2 ; // 特权ring3
unsigned char p : 1 ; // P 位存在/有效
unsigned short offset_high ; // 偏移量的16~31位
}IDT_ITEM ;
/* 调用门结构 */
typedef struct InvokeGate__
{
unsigned short Offset_0_15 ;/* 偏移量的 0~15 位 */
unsigned short SegSelector ;/* 段选择符 */
unsigned char reserved1;
unsigned char Type : 4 ; /* 类型字段,调用门需为 1100 ( 0xC ) */
unsigned char DT_0 : 1 ; /* 需为 0 , 以表明这是一个系统用的描述符 */
unsigned char DPL : 2 ; /* 特权级 */ ring3
unsigned char P : 1 ; /* 存在位 */
unsigned short Offset_16_31 ; /* 偏移量的 16~31 位 */
}INT_GATE;
讲到这里,问题好像还没解决的样子….
预备知识:
1) Windows NT将开始512MB物理内存连续映射到0x8000 0000 开始到0xa000 0000处(暂时不考虑大于/小于512MB)//这里在暂时对winnt 5.0 和 5.1
2) ZwMapViewOfSection()函数可以将物理内存映射到当前进程地址空间,并返回映射的虚拟地址
3) Sidt指令和sgdt指令是非特权及指令,用户态可执行
4) Windows Nt使用平坦模式的内存段,即段基址为0
说到这里,问题的基本可以解决了,这就是网上流传的“无驱执行ring0代码” 的基础。
预备知识:

预备知识:
在ring3“使用”门要求门的描述符特权级=3,这样这个门才能被用户态程序所使用,
也就是上面结构中DPL域的值=3
构造中断门:
将中断描述符指向你的中断处理程序,里面填写你的ring0代码,至于参数可以通过寄存器eax/ebx/ecx…/esi/edi传递,就跟linux系统调用类似
调用时:
Mov eax,param1
Mov ebx,param2
…..
Int 中断向量号
构造陷阱门与中断门类似。。。。。
构造调用门:
将描述符指向你的ring0要执行的函数
word sel[3];
Sel[0]=sel[1]=0;
Sel[2]=调用门选择子
_Asm call fword ptr [sel] //调用调用门,进入ring0
//这里没有试验过
//估计 ushort[3]è
//struct
//{
// Ulong offset;
// Ushort selector;
//};
这里糊涂啊….有待研究….
到这里,你应该基本了解了为什么“无驱执行ring

到这里问题因该很简单了,代码我就不贴了,老早以前的东西了…..
本次只是更新一下本人对这这些的认识,上面有很多错误,暂时摆到这里,以后有时间再修改吧,懒啊….
需要代码在百度查:无驱执行ring0代码就可以查到…..
iXplorer体系结构(下)
Author:SongYuan@ustb.计02@
[文件系统]
下面是ixplorer使用的文件系统示意图
使用了类似对象的方法来组织数据
由于每个对象都保留了底层对象的指针(也就是分层设计),这样可以方便的实现分层调用和抽象

这里使用了部分抽象机制(也许吧,个人认识还不够,说说而已….)
所有设备都抽象为文件。当对设备进行操作时,只需要操作代表设备的文件即可。对文件的操作在内核被重定向到设备驱动程序,由驱动服务例程来完成操作。
所以,可以创建一个虚拟的设备,并且为它注册驱动对象,这样就可以像普通文件那样来操作这个虚拟设备了iXplorer的虚拟磁盘vfat12就是使用的这种方法.
驱动对象通过id来引用其它驱动的服务,以此来实现驱动的分层。。。。这里的设计有问题。都是为了快速实现才这样设计的…..
不知道该怎样表达想法,不多说了….
[进程管理]
设计要求:
0) 多线程
1) 实现进程的创建,调度,关闭
2) 进程间通信
设计结果:-_-!
0) 不使用jmp TSS方式切换,用软件进行切换(就是指使用一个TSS的那种方法)
1) 创建进程使用全新的地址空间,不使用fork()那样的方法(懒,就想快点结束)
2) 使用时间片轮转方法调度,以线程为单元(简单)
3) 线程上下文保存到线程内核栈,同一个进程内的线程直接切换,当发现进程改变时,切换地址空间
4) 每个线程分配一个内核堆栈(一页大小),用户态堆栈在用户进程堆里面分配,可以自定大小
5) 每个进程一个堆
6) 还有很多,画图解释吧…


上面就是进程/线程的基本框架,具体细节就不啰嗦了……
[GUI框架]
iXplorer的gui驱动使用了最简单的点判断法,没有使用剪切,不好意思多说,这里只是介绍一下消息驱动的gui框架

上面的流程很简单吧,废话我就不说了
以后有时间重新设计一下
iXplorer体系结构(上)
Author:SongYuan@ustb.计算机系02@
语文水平不过关……
对高手来说,这很幼稚,不过本人是菜鸟,自愚而已,莫怪。。。
我只是做个简单的示意,至于真确以否,我不在乎,haha
个人设计,第一次写,错误难免
[这个操作系统中途停止…]
[为了在短期内除结果,在设计上做了重大修剪,下面就是修剪后的面目…惨不忍睹啊…]
[强调:本操作系统只是为了实践所学…]
------------------
内核模块之间的关系如下:
问题定义:
本来设计并不是这样简单
1) 考虑到问题的可行性(对自己而言….-_-!)
2) 控制工程的复杂度
结果如下:
Typedef Struct SimpleOperationSystem_
{
Void *MemManager;
Void *FileSystem;
Void *IntManager;
Void *Extension;
} SimpleOperationSystem;
简单操作系统==〉内存管理+文件系统+中断管理+进程管理…(扩展)
示意图:
[内存管理]
对于一个操作系统来讲,内存管理是它首要要解决的问题…(后面省去某书2000字。。。。。)
iXplorer的内存管理示意图如下:
[为了简单起见,好多设计都被否决…晕]
[首先,要保证模块能实现,而且能运行…所以…]
<一>。内核物理内存管理:
功能要求:分配、回收物理页,记录页引用计数
a. 页引用计数:
使用char类型数组实现
b. 页分配、回收
使用free链表方式分配物理页(其实也就是堆栈方式分配),使用unsigned long数组来实现,数组索引对应页地址(分页区丛一个固定的地址开始),数组内容对应下一个空闲页索引。简单吧…haha
<二>。内核内存管理器:
功能要求:分配指定大小的(内核)内存,释放内存
结构设计:
a. 采用首次时配算法,简单快捷…
b. 使用桶式结构分配
最终结构:a方法太简单,对于长时间运行的内核来讲不适用,b个人认为它的描述符页在大量内存分配后不会释放,这对长时间运行的内核也是个威胁
个人修改b方法如下:
详细细节不多说了,这样的设计有问题。。。。。。
中断管理
这里略过,只是个简单的中断处理,本来打算使用终端对象来管理,后来时间问题没做…我是懒人啊….
这里来个简单的示意图,可能有助于理解列出几个基本的中断源和它们与cpu之间请求的示意图,这个图有问题,示意图而已。。。。。。

以上仅为个人看法,有很多错误地方,不过没关系,时间和实践会自动修正的,哈哈...
声明:仅为实践,正误与我无关
iXplorer操作系统简介
iXplorer操作系统简介:
设计开发者:SongYuan@北京科技大学@计算机02级
当前版本 :iXplorer [version 0.60]
开发时间 :05/09/**----05/11/09
[原始目标]
{初期当作...,后期当作任务、作业来做了...}
1。32位分时多进程多线程
2。段页式内存管理,4Gb虚存空间,内核3Gb++
3。支持多种文件系统,fat为默认文件系统
4。支持键盘、鼠标、usb
5。拥有console和gui界面(采用客户/服务器模型)
6。支持网络
[已经实现部分]
1。采用分时的进程/线程轮转调度
2。内核内存分配采用类似桶式分配算法的分配策略,自己加入了新的想法,用户态使用首次适配算法
3。使用面向对象设计方法,实现了一个简单的'vfs'(也许不算吧),默认支持fat12/fat16/fat32
4。支持键盘、鼠标操作
5。实现了类似cmd的shell;实现了类似windows的gui界面和引擎(效率太低,以后整体修改或者使用double buffer来提升一下)
6。线程通信采用消息方式,管道没有实现,如果有时间的话。。。呵呵,找个借口
7。支持内核进程和内核线程(本来不应该使用内核进程的...以后在修改吧...)
[开发时间段]
起始时间:这学期开始,2005/09/0*
终止时间:今天,2005/11/10
中间经历24个版本(从v0.2正式命名到v0.60)
走了好多弯路,仅文件系统就用了一大把时间,写了四次,最终写了一个蹩脚的驱动....
痛苦啊....
[教训]
1。要有目的、有计划的Carry Out Something...
2。软件工程要再看看
3。这里用来以后升级扩展...{靠,我中毒了...而且中毒不浅啊....}
[开发过程]
每天花费一定的时间
(解释:分时进行,每项占用一定的时间片,视优先级而定;切换时保存上下文...)
初期:上下午上自习,晚上写代码
{自习上可以研究问题,哈哈...}
中期:上午上自习、下午写代码、晚上自习
后期:不堪回首啊......
现在=后期+(hour)24:不写代码,只上自习......
[参考资料]
{这里表示万分感谢,对以下无私公布资料的同学、老师...}
1 。>>>FireXOS(hd driver)
2 。>>>Pyos(入门老师...)
3 。linux0.01/0.11/2.4内核
4 。warmOS(boot from floppy)
5 。n多书籍,特别是linux源代码注释
6 。null
7 。这里留下以备扩展
其他的我不想多说了、下面是v0.54 和 v0.60两个版本样品的截图,就当作纪念吧...
8点了
好好学习
上自习去...
bye ,iXplorer....
for (;;)
{
if (date<=2006_01_14) /*&&(IamAlive)*/
{
//The_Story_Will_Go_On();
//Sleep((ULONG)1000*60*60*10)
Study(上午+下午+晚上/*为考研...*/);
}
}
//广告:拒绝使用非自己设计的杀毒软件....
计划中指@延迟...
今天决定,停止对iXplorer的开发
原因:
1。设计成果与预定目标相差太远
2。由于时间和外部原因(考研),导致无法再进行下去....
3。暂时没找到好的理由(反正有n多理由...)
今后慢慢的写一些相关的文档来纪念这个中途流产的作品吧...
难受ing.......
oh baby i'm missing you
we used to love so strong
tell me where did we go wrong....
就算安慰一下自己吧.....

为iXplorer添加了桌面...
在11点之前添加了桌面
看起来好一点了....
也许吧....
这个中历时2个月的作品不可能做得让人满意....
晕
第一阶段即将结束
下星期开始好好复习、考研
一想到考研......
唉,日子还真难混啊...
找工作,难
考研,难上难...
靠,废话不说了
stop here
I wanna heal, I wanna feel like I’m close to something real
I wanna find something I’ve wanted all along
Somewhere I belong
今天的任务基本完成....
任务列表:
(1)虚拟磁盘读写 [okay]
(2)cmd.guishell [okay--]
(3)太多了........
(4)这星期内结束 [to be continue...] hehe...
今天成果截图:
支持命令:
dir path
dir
cd path
cd ..
pslist
reboot
cls
help....
实在没信心写了
我愁啊...
bye ,我的操作系统
bye,我的....我不知道该说什么了...
day afer day, time pass away...
and i just can't get you off my mind...
iXplorer0.59昨天的任务没完成...
晕,每次都在第二天早上写日志
晚上网速太慢.....等n久....
昨天的任务,完成cmdshell
无奈,文件系统驱动在v0.53以后作了一次重大修改,本来可以直接使用的(v0.53就已经完成cmdshell了...)
还有,为了能让它在无硬盘的环境中启动,现在决定加入虚拟磁盘...
今天就把这些作完吧....
昨天的截图
昨天的成果...