摘要:
就是缺页中断的处理。在虚拟内存二级映射表PTE中相应位置为0,说明对应虚拟内存需要文件(非swap文件)支持。windows在对应地址所属的管理虚拟内存的数据结构中取出相应文件句柄和偏移,并将该页面读入物理内存。同时修改二级映射表。文件相对应也有一个二级映射表与物理内存产生联系。对于没有指定文件句柄情况,windows只是简单的使用swap文件。 阅读全文
posted @ 2014-03-05 13:51
foo__hack
阅读(211)
评论(0)
推荐(0)
摘要:
注意返回时得使用iretd。通过sidt取得idtr,找到里面的基址和limit。遍历所有的表项,找到一个p位没有置位的,添加一个调用门。和使用call gate没什么大差别。看了下,我机器里的第一个空白项是0x20,就懒得写和ring3通信的东西了。ring3:#include int main(){__asm int 0x20return 1;}ring0:#include #pragma pack(1)typedef struct _IDTR{USHORT limit;ULONG base;}IDTR, *PIDTR;typedef struct _IDT_ENTRY{USH... 阅读全文
posted @ 2014-03-05 13:50
foo__hack
阅读(357)
评论(0)
推荐(0)
摘要:
要注意gdt的第一项是0,不能使用。然后看gdt中那一项的p位没有置位,再添加一个调用门描述符。描述符的offset指向需要被ring3程序调用的ring0函数地址。DPL为3。当然selector权限也需要是3。描述符中的selector应是0x8,说明是ring0下code段。驱动通过DeviceIoControl传递给ring3程序调用门的selector,当然也可以通过文件注册表之类的。不过这里我有点不解,使用了调用门之后,system("pause");就不起作用了。。有知道的请说一声。由于调用门是段间转移,所以用ret返回是错误的,会蓝屏。得用retf。至于怎么 阅读全文
posted @ 2014-03-05 13:48
foo__hack
阅读(572)
评论(0)
推荐(0)
摘要:
先用随便哪个PE文件信息查看工具查看驱动加载的基址,一般来说是0x10000,当然你也可以用IDA看。然后用IDA打开驱动,看DriverEntry的偏移,然后用这个偏移减去基址,得到a。用windbg的时候,下断点bu xxxx(模块名)+a。比方说,TesSafe.sys中基址为0x01001000,DriverEntry偏移为0x01001005,偏移就是5,可以下断点 bu TesSafe+5。就可以动态调试了。 阅读全文
posted @ 2014-03-05 13:47
foo__hack
阅读(367)
评论(0)
推荐(0)
摘要:
通常我们所知IoCallDriver是把irp传递给下一层设备,传递到底是什么意思呢?IoCallDriver中实际调用了IopfCallDriver,其代码如下:NTSTATUSFORCEINLINEIopfCallDriver(IN PDEVICE_OBJECT DeviceObject,IN OUT PIRP Irp)/*++Routine Description:This routine is invoked to pass an I/O Request Packet (IRP) to anotherdriver at its dispatch routine.Arguments:De 阅读全文
posted @ 2014-03-05 13:45
foo__hack
阅读(876)
评论(0)
推荐(0)
摘要:
欢玩玩二进制技巧挺好的,也确实有助于对实现干的那些事的理解。但须注意,莫走入歧途与其只关注某几种特定的二进制布局,等在认识达到一定程度后,回归到标准学习、ABI等规范的学习上去,这才能从更高层面认识一些问题(研究100种情况下的编译器实现,也不代表第101种情况一定被涵盖在这其中)有些东西,只是“规定”,了解到就行了,没有什么神奇的原理性内容(换言之,规定成其他方式一样可行),兴趣盎然本身就体现出对这一问题认识不足别拘泥于VC的x86实现(即便是x86架构,intel64/amd64上的实现也将有显著不同,更别说其他架构(ARM)了),应适度探究。 阅读全文
posted @ 2014-03-05 13:42
foo__hack
阅读(390)
评论(0)
推荐(0)
摘要:
IoAttachDeviceToDeviceStack将Source Device附加到Target Device上。打开windbgkd> u IoAttachDeviceToDeviceStack l 10nt!IoAttachDeviceToDeviceStack:804f1aac 8bff mov edi,edi804f1aae 55 push ebp804f1aaf 8bec mov ebp,esp804f1ab1 6a00 push 0804f1ab3 ff750... 阅读全文
posted @ 2014-03-05 13:41
foo__hack
阅读(913)
评论(0)
推荐(0)
摘要:
前言经常有人说iostream的速度慢,IO流比stdio的慢多了。但是有人测试过的,iostream的速度是超过stdio的。测试结果/* C */#include int main(){FILE* stream;size_t num;size_t sum = 0;size_t i = 0;stream = fopen("random.data", "r");while(fscanf(stream, "%u", &num) != EOF){sum += num;}fclose(stream);printf("%u\ 阅读全文
posted @ 2014-03-05 13:38
foo__hack
阅读(890)
评论(0)
推荐(0)
摘要:
windows驱动开发中,感觉很多小问题都会导致一些比较麻烦的错误,很多不良习惯都可能会导致系统崩溃。原因是对内核原理的理解太欠缺了,因为驱动运行在RING0优先级,开发的时候必须相当注意细节,不然调试的时候会很麻烦(有些时候Dump文件分析出来是错误的)。原来我一直奇怪写驱动程序问什么要把有些例程放到非分页内存中,今天算是豁然开朗。只怪原来看内核原理的时候没太仔细。具体原因是这样的:因为windows的缺页中断处理程序是运行在DISPATCH_LEVEL的级别的。而我的驱动某些例程一般是等于DISPATCH_LEVEL这个中断级别。也就是说。。如果我把我的代码放到分页内存中。。那操作系统很可 阅读全文
posted @ 2014-03-05 13:37
foo__hack
阅读(2484)
评论(0)
推荐(0)
摘要:
是任意形式的递归,是化解的一般式。主题所谓的“递归调用化解为栈处理”,意思是,将递归函数调用化解为“一个由stack_push stack_pop stack_top等函数调用组成的循环式子”。这里的 stack_push, stack_pop, stack_top是指,程序员自己实现的一个ADT(Abstract Data Type)中的函数操作接口,这个ADT叫做栈。要知道,在C语言中,函数调用链本身就是栈处理的,处理C语言中函数调用链的是进程栈/线程栈,进程栈/线程栈是一个C语言程序运行环境的必备部件。将递归调用化解为栈处理的意义在于,大多数计算机系统,对进程栈/线程栈的大小都是有限制的 阅读全文
posted @ 2014-03-05 13:35
foo__hack
阅读(1553)
评论(0)
推荐(0)