2009年2月16日星期一

2008年4月的牢骚

www.rootkit.com完成迁移了,和我开blog时间差不多,纪念一下。Hoglund发文《IRP hooking and Deivice Chains》。
IoCreateDevice简单分析
函数原型为:
NTSTATUS
IoCreateDevice(
IN PDRIVER_OBJECT DriverObject,
IN ULONG DeviceExtensionSize,
IN PUNICODE_STRING DeviceName OPTIONAL,
IN DEVICE_TYPE DeviceType,
IN ULONG DeviceCharacteristics,
IN BOOLEAN Exclusive,
OUT PDEVICE_OBJECT *DeviceObject
);
1、先查看DeviceCharacteristics参数中的FILE_AUTOGENERATED_DEVICE_NAME属性如果存在,则要自动生成一个设备名字。IopUniqueDeviceObjectNumber用来保存最大数字,每次使用都会加1。调用IopCreateDefaultDeviceSecurityDescriptor产生默认的设备安全描述符。根据DeviceType设置SectorSize的数值,主要看文件系统相关的类型。CDROM被设置为2048,其它的被设置为512。
2、初始化对象属性,设置Attributes字段为OBJ_EXCLUSIVE、OBJ_PERMANENT属性。再计算好设备对象和设备扩展大小的8字节对齐后,用IoDeviceObjectType参数调用ObCreateObject,如果返回名字冲突STATUS_OBJECT_NAME_COLLISION,那么重新执行以上操作。
3、填充设备对象的数据。设备对象定义如下:
typedef struct _DEVICE_OBJECT {
CSHORT Type; //IO_TYPE_DEVICE
USHORT Size; //sizeof( DEVICE_OBJECT ) + DeviceExtensionSize
LONG ReferenceCount;
struct _DRIVER_OBJECT *DriverObject;
struct _DEVICE_OBJECT *NextDevice;
struct _DEVICE_OBJECT *AttachedDevice;
struct _IRP *CurrentIrp;
PIO_TIMER Timer;
ULONG Flags; //DO_EXCLUSIVE DO_DEVICE_HAS_NAME
ULONG Characteristics; //参数DeviceCharacteristics
PVPB Vpb;
PVOID DeviceExtension;
DEVICE_TYPE DeviceType; //参数DeviceType
CCHAR StackSize; // 1
union {
LIST_ENTRY ListEntry;
WAIT_CONTEXT_BLOCK Wcb;
} Queue; //文件系统列队
ULONG AlignmentRequirement; //视硬件平台而定 HalGetDmaAlignmentRequirement() - 1
KDEVICE_QUEUE DeviceQueue; //非文件系统驱动列队
KDPC Dpc;
ULONG ActiveThreadCount;
PSECURITY_DESCRIPTOR SecurityDescriptor;
KEVENT DeviceLock;
USHORT SectorSize; //CDROM为2048,DISK为512
USHORT Spare1;
struct _DEVOBJ_EXTENSION *DeviceObjectExtension;
PVOID Reserved;
} DEVICE_OBJECT;
4、如果设备是磁盘类的,需要调用IopCreateVpb创建vpb。Vpb->RealDevice会指回DeviceObject。vpb是卷、文件系统和磁盘驱动之间的桥梁。
5、调用ObInsertObject得到HANDLE之后,再NtClose关闭。调用 IopInsertRemoveDevice把设备对象和驱动对象联系起来。DriverObject->DeviceObject -->> DeviceObject DeviceObject->NextDevice -->> 同一driver创建的设备。 DeviceObject->DriverObject -->> Driver,这样设备和驱动也联系起来了。
IoDetachDevice也不是那么容易,下面是它的流程。
1、先看看Flags中DO_SHUTDOWN_REGISTERED是否注册关机通知。
2、然后去掉Timer中的时间设置。
3、如果Flags中设置DO_DEVICE_HAS_NAME,那么去掉对象的名字使它变成临时对象。
4、用IopCompleteUnloadOrDelete删掉设备栈。



磁盘在逻辑上很好理解,可以简单的把它看做是上厕所用的卷纸。这样就有了所谓的Cylinders、Heads、Sector。
磁盘区可以分为:MBR、DBR、FAT、FDA、DATA。
MBR(Master Boot Record):位于0柱面0磁道1扇面,保存系统引导代码和磁盘分区表。代码占用446字节,DPT(Disk Partition Table)占用64字节,最后两字节是55AA。MBR占用63扇面,但只使用1扇面。
DBR(DOS Boot Record):位于0柱面1磁道1扇面,保存操作系统引导代码和BPB(BIOS Parameter Block)数据。
FAT(File Allocation Table):FAT有12、16、32三种,FAT之后是FAT的复本。
FDT(File Directory Table):FAT32中FDT被融合进DATA区了。



| -------->\Device\volsnap (volsnap) |
|irp | | |
| | |irp |
FSD(NTFS) | | |
vpb->realdevice ----|------->\Device\HarddiskX\VolumeX (ftdisk) vpb ---->
|irp | |
| | |
MED irp | |irp
vpb->device---------- |
|
\Device\partmgr (partmgr)
|
|irp
|
\Device\HarddiskX\DRX (disk)
|
|irp
|
\Device\ide\ideportX (atapi)


Windows NT和传奇人物的故事见如下连接:
自己写的东西就不拿出来现丑了。
Gary Kimura是华盛顿大学教授和微软员工(也是我心里偶像=_=!)。
现在可以得到的FAT代码都是他的大作。
不知道他在学校给学生上课的时候会不会透露NTFS的内幕给他的学生(一一!)。
和我一样崇拜的人可以在这看看他的照片:
http://www.cs.washington.edu/homes/garyki/

如果问IRP是什么,那么就不得不说起Darryl Havens。
如果你被这个东西搞的迷迷糊糊又十分佩服其高深,那你一定想看看设计者吧?
他的这张照片比较帅,嘿嘿。

http://www.msblog.org/ 关注微软,应该常去看看。
http://www.isjfk.org/ 看看搞Java的人都在忙什么 :-)。
http://www.joelonsoftware.com/ 如何理解软件。
http://www.joelonsoftware.com/articles/fog0000000339.html 打开编辑器就OK了。

进入IT教育行业可以使我获得较高收入,为此我也困惑了很久。不过,一个故事改变了我。见记录片《默格勒先生的礼物》。
学习的道理是相通的。就象练武,有的人喜欢练内功,有的人喜欢练外功。
刚开始学习的人,总是喜欢花架子。不过随着对学习理解的不断深入,有的人会把功夫下在打基础上而提高自己的修养。但也有的人仍然浮于表面而无法 入门。这个过程不只是知识的积累过程,也是一个心态调整的过程。心态好的人由于基础好而更容易学习新的知识,尽管这些人开始的时候表现为学习很慢。
不可否认,中国大多数从业者还处在行业低端。水平不够,自然心态不好。而且想要入行的人,在入行之前接受了太多的误导信息。他们的心态更加糟 糕。很多从教育机构出来的人结果也并不好。天下没有免费的午餐,他们想要入行,还是要把功夫补上的。也许有人会说这是老师的问题,不过我在给学生上过课之 后并不这么觉得。更让人忧虑的是在各种更加方便、傻瓜的编程方式、工具开发出来以后,更多的人沉迷其中,找不到方向。这就象我们即使可以使用智能ABC书 写汉字,但也要苦练书法一样。编程高手们还是喜欢用vi(m)、emacs、ultraedit、甚至是记事本。工具只是工具,我们不应该被工具束缚住。
所以几年内我不大会去教育机构。如果觉得自己该干什么就动手去干什么。如果真想做点什么,未必一定身在其中。
最近看VISTA DDK 6000文档,和一年前一样。一年前看的是2003的SDK、IFS DDK。那时候只有一个感觉:windows的设计确实先进。可看了Vista的文档,我还是觉得眼前一亮非常精彩。我建议想学windows朋友也来看 看MSDN。如果你找不到好书,反而耽误时间。我们总骂微软如何如何,但看看人家的文档,再比较下我们的教材,就剩惭愧二字。
至于说分享代码,我只知道Richard stallman 没有过后悔的言论。对于热爱软件而又有深厚功底的程序员来说,分享代码是一件享受的事情。
文化如下:
http://www.aka.org.cn/Docs/hacker-howto_2001.html


非常羡慕数学好的同学。
值得关注:
https://www.xfocus.net/bbs/index.php?act=ST&f=2&t=66683

学计算机已经有些年头了,虽然有点长进,但远远谈不上深入。
周末同事问我Linux方面的事情。我们交谈开始时还很自信。可渐渐的信心一点点消失,直到脑袋里一片空白。更加惭愧的是对TCP/IP详解2提到的路由算法和Linux kernel 2.6的文件缓存算法radix tree一点印象都没有。

binary search tree:
http://www.cs.fiu.edu/~weiss/dsaa_c2e/tree.c
压缩方面的应用见:
https://www.xfocus.net/bbs/index.php?act=ST&f=3&t=66431

AVL tree:
http://www.cs.fiu.edu/~weiss/dsaa_c2e/avltree.c

AVL tree要求任何节点的左右子数高度差最多为1。而RB tree要比AVL的条件宽,在特殊情况下就变成AVL tree。Windows Server 2003的虚拟内存管理使用AVL tree。

单旋可以平衡外侧插入的情况。而双旋可以平衡内侧插入的情况。叫双旋的原因是经过了两次单旋。根据平衡树一边大一边小的特点,旋转(改变)根节点会平衡子树的长度差距。

radix tree:
http://www.gelato.unsw.edu.au/lxr/source/lib/radix-tree.c
Linux Cache:
http://www.ibm.com/developerworks/cn/linux/l-cache/
FreeBSD Route:
http://blog.chinaunix.net/u/9831/showart_58142.html

至于思想嘛:hashtable + searchtree


还在Neusoft的同事给了我三本书。其中有一本季羡林的著作合集《季羡林谈人生》。随手翻了三篇就已经爱不释手了。虽然成文多年,但文章还是给了我强烈的震撼。书中随处可以看到一些被谈论过无数遍的话题被重新赋予新的观点和见解。

可自己又何时可以随意扮演
完美者、给予者、实践者、浪漫者、观察者、质问者、享乐者、支配者、媒介者
不同的角色切换
完美型、全爱型、成就型、艺术型、智能型、忠诚型、丰富型、能力型、和平型
不同类型
驾御自己的性格,改变自己的命运。

乱糟糟的写了一堆,说点实际的。
Addylee 和我聊过网卡负载平衡的问题。这方面的软件早就有了,比如NICExpress。但我们聊的问题本应该是miniport driver,但这家伙却有新的想法。他想在网络连接里隐藏真实的网卡只显示虚拟网卡。我的反应是双击网络连接图标时一定调用了API GetInterfacesInfo。然后去找GetInterfacesInfo的代码,发现和SYSTEM\CurrentControlSet\ Control\Network下的键值有关。不过,DDK里好象没有提到这个东西。那是谁把“本地连接”写进去的呢?
晚上终于忍不住了,用 RegMon找到了“真凶”。Network Connection,以svchost为宿主的服务。如果miniport driver的inf指出驱动是实际网卡,那么网络连接里就是“本地连接N”,否则就是显示驱动描述字符。那么接下来,Interface系列API再向 \Device\Tcp里发送查询信息Irp就可以得到接口参数了。不过,要想达到老兄说的目的还是不大好办,要两边一起骗。

今天更新了TDI挂接的那篇博客,在看之前不妨回顾下Addylee关于NDIS驱动的文章:
http://www.xfocus.net/articles/200605/865.html


题目有点大。如果Vista真的广泛使用.net提供的WPF,而通过DirectX技术访问显卡,那么我还
要有很长的路要走。现在我有两个问题需要确定:一、终端服务能否截获DX,二、UltraVNC在Vista下的表现究竟怎么样。在看了《探究windows 2003终端服务实现内幕》后,我找到了
这本《Windows Graphics Programming Win32 GDI and DirectDraw》。以前对Win32的研究确实
很少,没想到这已经是八年前的书了,而且众多windows kernel剖析书籍也没有提供相应的知
识。在网络中搜索了很久似乎也没有结果,很多人都私藏等着卖钱。当然我知道这条路并不好
走,眼下有几个不是资料的“资料”要去分析。Vista Xp DDK、UltraVNC的驱动、高效截屏的
代码、Feng Yuan和WebCrazy的研究成果。


看到项目里的代码使用了ObQueryObjectName心里一凉。细一看,还好。不是文件,只是普通
的设备。如果文件是用同步打开,那么这次Query可能要使你的代码睡到关机。
在UltraVNC里找了一大堆驱动,还不知道哪个是需要看的,还有终端服务的两个rdpdd.dll和
rdpcdd.sys驱动。如果没有Ctrl+F5的强大能力,事情真是不敢想象。
PnP也不是省油的灯。IoRegisterPlugPlayNotification貌似是在设备安装成功以后才起作用
的。不过,使用Device Interface Class是很方便的事。最后还是选择在它之前的IRP_MN_START_DEVICE里做坏事吧。


最近对图形方面的东西很有兴趣。我记得给我留下深刻印象的3D特技是29A病毒杂志的封面。
虽然以前看过游戏开发方面的书,但都不怎么深入。mirror驱动的理论部分已经调研得差不多
了,下周可以开发了。本来应该进行知识梳理,但考虑到现在的非常时期,还是不能停下脚
步。再过一个月,应该可以确定我一两年内的工作和发展了。

《微软和开源》里提到了DirectX和OpenGL的故事。
http://chrishecker.com/OpenGL
http://www.directx.com/home.htm
http://www.mesa3d.org

John Carmack对它们的看法:http://www.directx.com/carmack.htm

入门教程:
http://www.euclideanspace.com/

书:
《3D Math Primer for Graphics and Game Development》

游戏:
http://www.gamedev.net/
http://www.gamasutra.com/


ZwCreateFile不厚道。FILE_NO_INTERMEDIATE_BUFFERING给了我点提示,要不然不知道要卡我多久。 IoBuildSynchronousFsdRequest还是比较厚道的,在介绍Length的时候提了一句,可他的把兄弟 IoBuildAsynchronousFsdRequest却守口如瓶。ZwReadFile应该是有问题的,我以为他会帮我对齐长度和地址,可他却没 有,太伤我心了。
最近磁盘玩的比较多,看看这个吧:
http://blog.csdn.net/hotsolaris/archive/2007/10/20/1834162.aspx

没有评论:

发表评论