摘要:
操作系统:windows XP调试器通过CreateProcess传入带有DEBUG_PROCESS和DEBUG_ONLY_THIS_PROCESS的dwCreationFlags创建被调试进程。这种情况下,进程创建的早期(执行NtCreateProcess或NtCreateProcessEx之前),调用DbgUiConnectToDbg()使调用线程和调试子系统建立连接。DbgUiConnectToDbg()内部调用ZwCreateDebugObject创建一个DEBUG_OBJECT内核对象,并将其句柄保存在当前线程环境块(TEB)的的DbgSsReserved[1]中。调试进程与被调试进 阅读全文
摘要:
注意返回时得使用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... 阅读全文
摘要:
要注意gdt的第一项是0,不能使用。然后看gdt中那一项的p位没有置位,再添加一个调用门描述符。描述符的offset指向需要被ring3程序调用的ring0函数地址。DPL为3。当然selector权限也需要是3。描述符中的selector应是0x8,说明是ring0下code段。驱动通过DeviceIoControl传递给ring3程序调用门的selector,当然也可以通过文件注册表之类的。不过这里我有点不解,使用了调用门之后,system("pause");就不起作用了。。有知道的请说一声。由于调用门是段间转移,所以用ret返回是错误的,会蓝屏。得用retf。至于怎么 阅读全文
摘要:
先用随便哪个PE文件信息查看工具查看驱动加载的基址,一般来说是0x10000,当然你也可以用IDA看。然后用IDA打开驱动,看DriverEntry的偏移,然后用这个偏移减去基址,得到a。用windbg的时候,下断点bu xxxx(模块名)+a。比方说,TesSafe.sys中基址为0x01001000,DriverEntry偏移为0x01001005,偏移就是5,可以下断点 bu TesSafe+5。就可以动态调试了。 阅读全文
摘要:
通常我们所知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 阅读全文
摘要:
欢玩玩二进制技巧挺好的,也确实有助于对实现干的那些事的理解。但须注意,莫走入歧途与其只关注某几种特定的二进制布局,等在认识达到一定程度后,回归到标准学习、ABI等规范的学习上去,这才能从更高层面认识一些问题(研究100种情况下的编译器实现,也不代表第101种情况一定被涵盖在这其中)有些东西,只是“规定”,了解到就行了,没有什么神奇的原理性内容(换言之,规定成其他方式一样可行),兴趣盎然本身就体现出对这一问题认识不足别拘泥于VC的x86实现(即便是x86架构,intel64/amd64上的实现也将有显著不同,更别说其他架构(ARM)了),应适度探究。 阅读全文
摘要:
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... 阅读全文
摘要:
前言经常有人说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\ 阅读全文
摘要:
windows驱动开发中,感觉很多小问题都会导致一些比较麻烦的错误,很多不良习惯都可能会导致系统崩溃。原因是对内核原理的理解太欠缺了,因为驱动运行在RING0优先级,开发的时候必须相当注意细节,不然调试的时候会很麻烦(有些时候Dump文件分析出来是错误的)。原来我一直奇怪写驱动程序问什么要把有些例程放到非分页内存中,今天算是豁然开朗。只怪原来看内核原理的时候没太仔细。具体原因是这样的:因为windows的缺页中断处理程序是运行在DISPATCH_LEVEL的级别的。而我的驱动某些例程一般是等于DISPATCH_LEVEL这个中断级别。也就是说。。如果我把我的代码放到分页内存中。。那操作系统很可 阅读全文
摘要:
[ISO C11 Clause 3]对象(object):执行环境中数据存储的一块区域,它的内容可以用来表示值。-注释:对象可以具有特定的类型。--值(value):确定类型的对象的内容的确切含义。--访问(access):读取或修改一个对象的值。-注释1:如果只适用其中一种含义,则直接用“读取”或“修改”。-注释2:“修改”包含新值和先前存储的旧的值相同的情况。-注释3:未被求值的表达式不访问对象。--行为(behavior):外部的表现或动作。--未定义行为(undefined behavior):通过使用不可移植、错误的程序构造或错误的数据导致的ISO C没有任何要求的行为。--未确定行 阅读全文