
学习笔记
文章平均质量分 73
aksnzhy
这个作者很懒,什么都没留下…
展开
-
<学习笔记>Windows驱动技术开发详解__驱动程序的基本结构
驱动程序中重要的数据结构驱动对象:DRIVER_OBJECT每个驱动程序都会有唯一的驱动对象与之相对应,这个驱动对象是在驱动加载的时候,被内核中对象管理程序创建的。DRIVER_OBJECT数据结构:typedef struct _原创 2011-09-11 23:10:25 · 2584 阅读 · 0 评论 -
<寒江独钓>Windows内核安全编程__传统键盘过滤程序
技术原理1.预备知识何为符号链接?符号链接其实就是设备的一个“别名”。在应用程序中想要访问设备一般要通过符号链接来完成,而不是设备名本身。ZwCreateFile是很重要的函数。同名的函数有两个:一个在内核中(ntknos.exe),一个在应用层(ntdll.dll)原创 2011-10-13 12:15:31 · 4717 阅读 · 0 评论 -
Windows核心编程__错误处理
文章内容1.定义自己的错误代码2.ErrorShow示例程序在深入讨论Windows提供的诸多特性之前,应该先理解各个Windows函数是如何进行错误处理的。调用Windows函数时,它会先验证我们传给它的参数,然后再开始执行任务。如果传入的参数无效,或者由于其他原创 2011-10-13 12:16:47 · 1145 阅读 · 0 评论 -
<寒江独钓>Windows内核安全编程__键盘过滤之内核级Hook(一)
Hook分发函数前一篇文章讲述了进行键盘过滤,截取用户输入的方法。本篇文章开始更加深入地讨论键盘的过滤与反过滤对抗。无论是过滤还是饭过滤,原理都是过滤,取胜的关键在于谁第一个得到信息。一种方发是Hook分发函数,即将键盘驱动的分发函数替换成自己的函数用来达到过滤的目的。原创 2011-10-14 20:03:46 · 5587 阅读 · 1 评论 -
<寒江独钓>Windows内核安全编程__键盘过滤之内核级Hook(二)
Windows内核安全编程__键盘过滤内核级Hook(二)如果不想让键盘过滤驱动程序或回调函数首先获得按键,则必须比端口驱动更加底层一些。早期版本的QQ反盗号驱动的原理是这样的:用户要输入密码时(比如把输入焦点移动到了密码框里),就注册一个中断服务来接管键盘中断,比如0x原创 2011-10-17 09:57:38 · 3805 阅读 · 0 评论 -
<学习笔记>Windows驱动开发技术详解__IRP的同步
对设备的任何操作都会最终转化为IRP请求,而IRP一般都是由操作系统异步发送的。异步处理IRP有助于提高效率,但是有时异步处理会带来逻辑上的错误,这时需要将异步的IRP同步化。将IRP同步化的方法有StartIO例程,使用中断服务例程等。应用程序对设备的同步异步操作原创 2011-10-08 16:58:49 · 4548 阅读 · 0 评论 -
<寒江独钓>Windows内核安全编程__一个简单的Windows串口过滤驱动程序的开发
在Windows系统上与安全软件相关的驱动开发过程中,“过滤(filter)”是极其重要的一个概念。过滤是在不影响上层和下层接口的情况下,在Windows系统内核中加入新的层,从而不需要修改上层的软件和下层的真实驱动,就加入了新的功能。 过滤的概念和基础 1.设备原创 2011-10-10 23:09:45 · 7921 阅读 · 2 评论 -
<寒江独钓>Windows内核安全编程__Ramdisk源码解读
这篇文章来介绍一下WDK中提供的一个案例源码--Ramdisk虚拟磁盘。这个例子实现了一个非分页内存做的磁盘储存空间,并将其以一个独立磁盘的形式暴露给用户,用户可以将它格式化成一个Windows能够使用卷,并且像操作一般的磁盘卷一样对它进行操作。由于使用了内存作为虚拟的存储介质,使这个磁盘具有一个显著的特点,性能的提高。这个例子所使用的微软WDF驱动框架。入口函数1.入口函数的定义任何原创 2011-10-20 11:58:09 · 4824 阅读 · 0 评论 -
如何获得当前运行模块在进程地址空间的位置
(w)WinMain的hInstanceExe参数实际值是一个内存基地址;系统将可执行文件的映像加载到进程地址空间中的这个位置。例如,系统打开可执行文件,并将它加载到地址0x00400000,则(w)WinMain的hInstanceExe参数值为0x00400000.为了知道一个可执行文件或DLL文件被加载到进程地址空间的什么位置,可以使用GetModuleHandle函数来返回一个原创 2011-11-17 11:12:12 · 1979 阅读 · 0 评论 -
<寒江独钓>Windows内核安全编程__具有还原功能的磁盘卷过滤驱动
磁盘过滤驱动的概念1.设备过滤和类过滤在之前的文章里,我们已经介绍过滤的概念,所谓过滤技术就是在本来已有的设备栈中加入自己的一个设备。由于Windows向任何一个设备发送IRP请求都会首先发送给这个设备所在设备栈的最上层设备,然后再依次传递下去,这就使得加入的设备在目标设备之前获取Irp请求称为可能,这时候就可以加入自己的处理流程。在这里把插入设备栈的用户设备叫做过滤设备,建立这个设备并使原创 2011-10-27 19:33:05 · 8269 阅读 · 2 评论 -
VS开发Windows应用程序建错工程后的几种解决方案
开发Windows应用程序的程序员经常会有建错工程的时候,例如开发人员可能选择一个新的Win32应用项目,但创建的入口点函数是main。生成应用程序时,编译器会报告一个链接错误,因为Win32应用程序会设置/SUBSYSTEM:WINDOWS链接器开关,但WinMain或wWinMain函数并不存在。此时,开发人员有以下4种选择。1.把main函数改为WinMain。这通常不是最佳方案原创 2011-11-17 10:26:54 · 1079 阅读 · 0 评论 -
C++反汇编之“认识启动函数,找到用户入口”
VC++开发的程序,在调试时总是从main或者WinMain开始的。初学编程时老师一定告诉过我们这是程序的入口,也就是程序的第一条指令执行处。这个认识其实是错误的,在他们之前还要更早的调用者。 在应用程序被加载时,操作系统会分析执行文件内的数据,分配相关资源,读取文件中的代码和数据适合的内存单元,然后才是执行入口代码,入口代码其实并不是main或WinMain,通常是mainCR原创 2012-01-28 16:35:04 · 2604 阅读 · 1 评论 -
8086/8088汇编指令系统剖析(一)
这篇文章详细介绍8086/8088指令集中的大部分重要指令。 指令集说明 1.分组 与早先的8位微处理器相比,8086/8088的指令系统丰富,而且指令功能强大。大多指令既能处理字数据,又能处理字节数据;算术运算和逻辑运算不局限于累加器,存储器操作数也可以直接参加算术逻辑运算。8086/8088的指令系统可以分为如下六个功能组:(1)数据传送(2)算数运算原创 2012-05-16 22:21:33 · 2972 阅读 · 0 评论 -
8086/8088汇编指令系统剖析(三)
乘除运算指令 8086/8088除了提供加减运算指令外,还提供乘除运算指令。乘除运算指令分为无符号数运算指令和有符号数运算指令,这点与加减指令不同。乘除运算指令对标志位的影响有些特别,不像加减运算指令对标志位的影响那样自然。 1.乘法指令 在乘法指令中,一个操作数总是隐含在寄存器AL(8位数相乘)或者AX(16位数相乘)中,另一个操作数可原创 2012-05-16 22:23:26 · 2864 阅读 · 0 评论 -
8086/8088汇编指令系统剖析(二)
标志操作指令 8086/8088指令集中,有一部分指令是专门对标志寄存器或标志位进行的。包括四条标志寄存器传送指令和七条专门用于设置或者清除某些标志位的指令。 1.标志传送指令 标志传送指令属于数据传送指令组。 (1)指令LAHF(Load AH with Flags) 指令LAHF采用固定寻址方式,其指令格式如下:原创 2012-05-16 22:24:21 · 2599 阅读 · 0 评论 -
<学习笔记>Windows驱动开发技术详解__驱动程序的同步处理
如果驱动程序没有很好地处理同步问题,操作系统的性能就会下降,甚至出现死锁等现象。基本概念1.问题的引出下面这段代码:int number;void Foo(){ number++; //做一些事情 number--原创 2011-09-28 18:32:08 · 6206 阅读 · 2 评论 -
<学习笔记>Windows驱动开发技术详解__派遣函数
派遣函数是Windows驱动程序中的重要概念。驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的。用户模式下所有对驱动程序的I/O请求,全部由操作系统转换为一个叫做IRP数据结构,不同的IRP会被“派遣”到不同的派遣函数中。IRP与派原创 2011-09-23 10:32:44 · 4509 阅读 · 2 评论 -
<学习笔记>王爽汇编语言__寄存器
对于一个汇编程序员来说,CPU中的主要部件是寄存器。寄存器是CPU中程序员可以用指令读写的部件。 不同的CPU,寄存器的个数,结构是不相同的。8086CPU有14个寄存器,每个寄存器都有一个名称:AX,BA,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES原创 2011-09-12 11:57:21 · 1608 阅读 · 0 评论 -
<学习笔记>王爽汇编语言__[BX]和loop指令
[bx]和[0]一样同样表示一个内存单元,它的偏移地址在bx中。loop英文单词“循环”的意思,显然这个指令和循环有关。[bx]下面这条指令:mov ax , [bx]功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的原创 2011-09-12 22:15:42 · 1818 阅读 · 0 评论 -
<学习笔记>王爽汇编语言__再论寄存器
在上篇文章中,我们主要从CPU的角度复习了8086CPU的逻辑结构,形成物理地址的方法和相关的一些寄存器。这篇文章我们一内存访问的角度来继续学习几个寄存器。内存中字的存储:CPU中,用16位寄存器来存储一个字。高8位存放高位字节,低8位存放低位字节。在内存中存储时原创 2011-09-12 18:15:46 · 1638 阅读 · 0 评论 -
<学习笔记>王爽汇编语言__包含多个段的程序
在前面的程序中,只有一个代码段。现在有一个问题是,如果程序需要其他空间来存放数据,使用哪里呢? 程序取得所需空间的方法有两种,一是在加载程序的时候为程序分配,再就是在程序执行的过程中向系统申请。我们若要一个程序在被加载的时候取得所需空间,则必须要在源程序中作出说明。我们通原创 2011-09-13 15:24:56 · 1593 阅读 · 0 评论 -
<学习笔记>王爽汇编语言__更加灵活的定位内存地址的方法
在之前的文章中,我们用[0],[bx]的方法定位内存单元的地址,我们现在将用一些具体问题来复习一些更灵活的定位地址内存的方法和相关的编程方法。 and和or指令:(1)and指令,逻辑与指令,按位进行与运算例如指令:mov al,01100011Band a原创 2011-09-14 11:17:42 · 1748 阅读 · 0 评论 -
<学习笔记>Windows驱动开发技术详解__Windows内存管理
作为开发Windows驱动程序的程序员,需要比普通程序员更多了解Windows内部的内存管理机制,并在驱动程序中有效地使用内存。在驱动程序的编写中,分配和管理内存不能使用熟知的Win32 API函数,取而代之的是DDK提供的高效内核函数。C语言和C++中大多数关于内存操作的运行时原创 2011-09-15 21:36:27 · 3895 阅读 · 0 评论 -
<学习笔记>Windows驱动开发技术详解__Windows内核函数
这篇文章主要复习Windows内核中字符串处理函数,文件读写函数,注册表读写函数。内核模式下的字符串操作:1.ASCII字符串和宽字符串在应用程序中,往往使用两种字符:一种是char型字符串,负责记录ANSI字符集。它是指向一个ch原创 2011-09-20 10:33:30 · 3051 阅读 · 0 评论 -
<学习笔记>王爽汇编语言__处理数据的两个基本问题
计算机进行数据的处理和运算,那么有两个基本的问题包含在其中:(1)处理的数据在什么地方(2)要处理的数据有多长1.关于bx , si,di,bp(1)在8086CPU中,只有这四个寄存器可以用在[...]中来进行内存单元的寻址。原创 2011-09-20 14:58:05 · 1776 阅读 · 0 评论 -
<学习笔记>王爽汇编语言__转移指令原理
可以修改IP,或者可以同时修改CS和IP的指令统称为转移指令。8086CPU的转移行为有以下几类:* 只修改IP时,称为段内转移,比如:jmp ax* 同时修改CS和IP时,称为段间转移,比如:jmp 1000:0由于转移指令对IP的修改范围不同,段内转移又分为:原创 2011-09-20 20:22:05 · 2003 阅读 · 0 评论 -
<学习笔记>王爽汇编语言__标志寄存器
CPU内部的寄存器中,有一种特殊的寄存器,具有以下3种作用。(1)用来存储相关指令的某些执行结果(2)用来为CPU执行相关指令提供行为依据(3)用来控制CPU的相关工作方式这种寄存器在8086CPU中被称为标志寄存器。8086CPU的标志寄存器有1原创 2011-09-22 12:12:23 · 2464 阅读 · 0 评论 -
<学习笔记>王爽汇编语言__CALL和RET指令
call和ret都是转移指令,他们都修改IP,或同时修改CS和IP。他们经常被共同用来实现子程序的设计。1.ret 和 retfret指令用栈中的数据,修改IP的内容,从而实现近转移。retf指令用栈中的数据,修改CS和IP的内容,从而实现远转原创 2011-09-21 16:45:53 · 6253 阅读 · 0 评论 -
8086/8088汇编指令系统剖析(四)
<!--@page {margin:2cm}p {margin-bottom:0.21cm}-->转移指令8086/8088提供了大量用于控制程序流程的指令,按功能分为如下四类:(1)无条件转移指令和条件转移指令;(2)循环指令;(3)过程调用和过程返回指令(4)软中断指令和中断返回指令由于程序代码可以分为多个段,原创 2012-05-18 23:03:39 · 2449 阅读 · 1 评论