关于作者

姓名:天之流

性别:男

出生日期:1984-10-03

地区:北京

联系电话:

QQ:3882372婚否:保密
用户名:icelord
笔名:icelord
地区: 北京
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



访问统计:
文章个数:13
评论个数:8
留言条数:2




Powered by BlogDriver 2.1

icelord的博客

 

方寸间,历数世上桑田沧海

时空里,细问人间暑来秋往

是爱人,星移斗转情不改

是朋友,海角天涯记心怀

天凉了,别忘了披张狼皮

欢迎访问icelord的博客

文章

awdBIOS 镜像结构简单分析
摘要:dump awd biso image from 4G-ROM_Size,简单分析一下 错误难免... 查看全文

- 作者: icelord 2007年05月11日, 星期五 09:23  回复(2) |  引用(0) 加入博采

DrvHlpLib 下载地址

demo:

download

DrvHlpLIB:

download

DrvHlpLib(Src):

download

注:下载的文件都为.jpg后缀。

下载后去掉.jpg RAR解压即可。

关于编译失败的问题:

需要将代码中的库文件(如ntoskrnl.lib,hal.lib)拷贝到vc的include目录

您完全可以自己按需要重写一下

实质就是进入ring0将自己拷贝到内核空间,然后根据拷贝的地址进行重定位

使用延时加载是为了防止在exe启动时内核自动填写导入表出错

而且延时加载的GetProcAddress需要自己重写(应为在内核空间运行的限制...)

说的很明白了

over!

- 作者: icelord 2007年05月11日, 星期五 09:15  回复(0) |  引用(0) 加入博采

在EXE中创建、加载内核驱动
摘要:在EXE中创建、加载内核驱动 查看全文

- 作者: icelord 2006年10月8日, 星期日 14:00  回复(8) |  引用(0) 加入博采

〈------------------以此为界------------------〉

好好学习、天天向上!


好久没有关注这里了,因为没有....

只有在......的时候...

才会想到......


......墙内墙外,在重复上演着......

我也身在其中......


                                   活着便精彩...!!!

- 作者: icelord 2006年01月10日, 星期二 22:24  回复(0) |  引用(0) 加入博采

再看nt下无驱执行ring0代码

再看nt下无驱执行ring0代码

(在不考虑正误的前提下,胡说八道一番有点罗嗦没办法。。。)

Author:icelord@ustb@05/11/19

(这仅是一篇日记而已

大二时看网上的“无驱执行ring0代码”看得我一头雾水,今天重新拿起来看了几遍,有点收获,将想法记录一下….

X86平台上,cpu可以工作在三个特权级别下,ring0—ring3,其中ring0具有最高权限,可以执行任何指令而无限制,ring3受到cpu保护机制限制,只能执行非特权指令。当在ring3下执行特权指令如lgdtiret等时,会触发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;

//};

这里糊涂啊….有待研究….

到这里,你应该基本了解了为什么“无驱执行ring0了,流程图如下:

到这里问题因该很简单了,代码我就不贴了,老早以前的东西了…..

本次只是更新一下本人对这这些的认识,上面有很多错误,暂时摆到这里,以后有时间再修改吧,懒啊….

需要代码在百度查:无驱执行ring0代码就可以查到…..


 

 

 

 

 

 

- 作者: icelord 2005年11月19日, 星期六 03:45  回复(0) |  引用(0) 加入博采

iXplorer体系结构(下)
 iXplorer体系结构()

Author:SongYuan@ustb.02@2005/11/12

[文件系统]

下面是ixplorer使用的文件系统示意图

使用了类似对象的方法来组织数据

由于每个对象都保留了底层对象的指针(也就是分层设计),这样可以方便的实现分层调用和抽象

 文件系统模型

这里使用了部分抽象机制(也许吧,个人认识还不够,说说而已….

所有设备都抽象为文件。当对设备进行操作时,只需要操作代表设备的文件即可。对文件的操作在内核被重定向到设备驱动程序,由驱动服务例程来完成操作。

       所以,可以创建一个虚拟的设备,并且为它注册驱动对象,这样就可以像普通文件那样来操作这个虚拟设备了iXplorer的虚拟磁盘vfat12就是使用的这种方法.

驱动对象通过id来引用其它驱动的服务,以此来实现驱动的分层。。。。这里的设计有问题。都是为了快速实现才这样设计的…..

不知道该怎样表达想法,不多说了….

[进程管理]

设计要求:

0)  多线程

1)  实现进程的创建,调度,关闭

2)  进程间通信

设计结果:-_-!

0 不使用jmp TSS方式切换,用软件进行切换(就是指使用一个TSS的那种方法)

1)      创建进程使用全新的地址空间,不使用fork()那样的方法(懒,就想快点结束)

2)      使用时间片轮转方法调度,以线程为单元(简单)

3)      线程上下文保存到线程内核,同一个进程内的线程直接切换,当发现进程改变时,切换地址空间

4)      每个线程分配一个内核堆栈(一页大小),用户态堆栈在用户进程堆里面分配,可以自定大小

5)      每个进程一个堆

6)      还有很多,画图解释吧

地址空间

进程模型

上面就是进程/线程的基本框架,具体细节就啰嗦了……

[GUI框架]

iXplorergui驱动使用了最简单的点判断法,没有使用剪切,不好意思多说,这里只是介绍一下消息驱动的gui框架

 gui模型

上面的流程很简单吧,废话我就不说了

以后有时间重新设计一下

 

 

- 作者: icelord 2005年11月13日, 星期日 11:00  回复(0) |  引用(0) 加入博采

iXplorer体系结构(上)

Author:SongYuan@ustb.计算机系02@2005/11/12

语文水平不过关……

对高手来说,这很幼稚,不过本人是菜鸟,自愚而已,莫怪。。。

我只是做个简单的示意,至于真确以否,我不在乎,haha

个人设计,第一次写,错误难免

[这个操作系统中途停止…]

[为了在短期内除结果,在设计上做了重大修剪,下面就是修剪后的面目惨不忍睹啊…]

[强调:本操作系统只是为了实践所学…]

              ------------------ 

内核模块之间的关系如下

问题定义:

本来设计并不是这样简单

1)      考虑到问题的可行性(对自己而言….-_-!

2)      控制工程的复杂度

结果如下:

Typedef Struct SimpleOperationSystem_

{

       Void *MemManager;

       Void *FileSystem;

       Void *IntManager;

       Void *Extension;

} SimpleOperationSystem;

简单操作系统==〉内存管理+文件系统+中断管理+进程管理…(扩展)

示意图:

 总体框架

[内存管理]

对于一个操作系统来讲,内存管理是它首要要解决的问题…(后面省去某书2000字。。。。。)

iXplorer的内存管理示意图如下:

[为了简单起见,好多设计都被否决]

[首先,要保证模块能实现,而且能运行所以…]

 mem-0

<>内核物理内存管理

      

功能要求:分配、回收物理页,记录页引用计数

a.       页引用计数:

使用char类型数组实现

b.       页分配、回收

使用free链表方式分配物理页(其实也就是堆栈方式分配),使用unsigned long数组来实现,数组索引对应页地址(分页区丛一个固定的地址开始),数组内容对应下一个空闲页索引。简单吧…haha

<>内核内存管理器

功能要求:分配指定大小的(内核)内存,释放内存

结构设计:

a.         采用首次时配算法,简单快捷

b.         使用桶式结构分配

最终结构:a方法太简单,对于长时间运行的内核来讲不适用,b个人认为它的描述符页在大量内存分配后不会释放,这对长时间运行的内核也是个威胁

个人修改b方法如下:

详细细节不多说了,这样的设计有问题。。。。。。

中断管理

这里略过,只是个简单的中断处理,本来打算使用终端对象来管理,后来时间问题没做我是懒人啊….

这里来个简单的示意图,可能有助于理解列出几个基本的中断源和它们与cpu之间请求的示意图,这个图有问题,示意图而已。。。。。。

以上仅为个人看法,有很多错误地方,不过没关系,时间和实践会自动修正的,哈哈...

 

 

 

 

 

 

 

 

 

 声明:仅为实践,正误与我无关

- 作者: icelord 2005年11月12日, 星期六 03:39  回复(0) |  引用(0) 加入博采

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两个版本样品的截图,就当作纪念吧...

 iXplorer v 0.54截图

 iXplorer[v 0.60]截图

8点了

好好学习

上自习去...

bye ,iXplorer....

for (;;)

{

        if (date<=2006_01_14)     /*&&(IamAlive)*/

         {

                   //The_Story_Will_Go_On();

                   //Sleep((ULONG)1000*60*60*10)

                   Study(上午+下午+晚上/*为考研...*/);

         }

}

//广告:拒绝使用非自己设计的杀毒软件....

- 作者: icelord 2005年11月10日, 星期四 08:55  回复(0) |  引用(0) 加入博采

计划中指@延迟...

今天决定,停止对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....

就算安慰一下自己吧.....

- 作者: icelord 2005年11月10日, 星期四 07:28  回复(0) |  引用(0) 加入博采

为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

- 作者: icelord 2005年11月9日, 星期三 23:10  回复(1) |  引用(0) 加入博采

今天的任务基本完成....

任务列表:

(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...

- 作者: icelord 2005年11月9日, 星期三 21:02  回复(1) |  引用(0) 加入博采

iXplorer0.59昨天的任务没完成...

晕,每次都在第二天早上写日志

晚上网速太慢.....等n久....

昨天的任务,完成cmdshell

无奈,文件系统驱动在v0.53以后作了一次重大修改,本来可以直接使用的(v0.53就已经完成cmdshell了...)

还有,为了能让它在无硬盘的环境中启动,现在决定加入虚拟磁盘...

今天就把这些作完吧....

昨天的截图

  iXplorerv0.59截图

- 作者: icelord 2005年11月9日, 星期三 09:01  回复(0) |  引用(0) 加入博采

昨天的成果...

花了好久,测试界面

昨天的结果,写出了开始菜单和程序菜单

由于低层设计的问题

全部采用单窗口,没有使用窗口类、控件...

着急,必在两个星期内结束,自己给自己下的命令

都是考研惹的祸

如果没有考研的压力的话,问题应该早已解决.....

今天的任务是写出VConsole,提供基本的操作,ps  cd  dir  start  ...

昨天考虑了这个问题,麻烦,低层体系结构要修改才能象windows/linux那样支持多进程的控制台

输出...输入...

暂时使用简单的方法做个demo吧,有时间重新写...

 简单界面

- 作者: icelord 2005年11月8日, 星期二 08:53  回复(0) |  引用(0) 加入博采

今天开始使用.....

  今天,申请成功

以后就以这里作为网上的窝了....

test...

- 作者: icelord 2005年11月7日, 星期一 16:41  回复(0) |  引用(0) 加入博采