自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(23)
  • 资源 (12)
  • 收藏
  • 关注

原创 缓冲区方式读写操作

驱动程序创建设备对象一共有三种读写方式,分别是缓冲区读写、直接方式读写和其他方式读写。这三种方式对应的设备对象的Flags子域分别是DO_BUFFERED_IO、DO_DIRECT_IO和0。为什么要设置缓冲区读写方式?读写操作一般由WriteFile或ReadFile函数引起,以WriteFile为例,该函数要求用户提供一段缓冲区,并且说明缓冲区大小,然后WriteFile将这段内存的数据传入到驱动程序中。由于这段缓冲区内存是用户模式的内存地址,因此如果驱动程序直接引用该段内存是十分危险的。因此,就产生了

2010-09-05 11:02:00 2485

原创 irp

<br />驱动程序中IRP处理机制类似Windows应用程序中的"消息处理"机制。在Windows内核中,有个复杂的数据结构IRP,这是与输入输出相关的数据结构。上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求,操作系统将I/O请求转化成相应的IRP数据,不同类型的IRP会根据类型传递到不同的派遣函数内。<br />IRP有两个基本的属性,MajorFunction和MinorFunction,分别记录IRP的主类型和子类型。操作系统根据MajorFunction将IRP"派遣"到不同的派遣函数

2010-07-19 10:31:00 821

原创 内核模式下的字符串

<br />在应用程序中,经常使用的有两钟字符:char型和wchar_t型。char型的字符串,记录ANSI字符集,它指向一个char数组的指针,每个char型变量的大小为一个字节,字符串是以0标志字符串结束。wchar_t型是宽字符串,描述unicode字符集的字符串,它指向一个wchar_t数组的指针,大小为两个字节,字符串以0结束。内核模式下,并不鼓励使用这样的字符串,主要是因为容易导致缓冲区溢出的漏洞。DDK自定义了字符串,描述ASCII字符串的格式如下:<br />typedef struct

2010-07-16 11:00:00 611

原创 分页和非分页内存

<br />Windows规定有些虚拟内存页面是可以交换到磁盘的文件中的,这类内存被称为分页内存,而有些虚拟内存是不能被交换到磁盘的文件中,这些内存被称为非分页内存。当程序的中断请求在DISPATCH_LEVEL之上时,包括DISPATCH_LEVEL,程序只能使用非分页内存。<br />在编译DDK提供的例程时,可以指定某个例程和某个全局变量是载入分页内存还是非分页内存,需要做如下定义:<br />#define PAGEDCODE code_seg("PAGE")<br />#define LOCKED

2010-07-05 21:10:00 3262

原创 windows内存管理

<br />32位平台下,CPU的寻址能力为4GB,PC中有些设备(如显卡)都提供自己的设备内存,这部分内存会映射到PC的物理内存上,也就是读写这段物理内存地址,其实是在读写设备内存地址,而不会读写物理内存地址。虽然提供了4GB的寻址能力,但是实际可能没有这么大的物理内存,这样就引入了虚拟内存。Windows的所有程序(包括Ring3和Ring0的程序)实际操作的都是虚拟内存。对虚拟内存的操作,最终都会变成对实际物理内存的操作。由于Windwos是个多任务操作系统,到此,我们碰到了几个问题:一是,虚拟内存和

2010-07-05 19:45:00 675

原创 驱动程序的层次结构

<br />一、驱动程序的垂直层次结构<br />WDM驱动和NT驱动都可以看作分层结构。设备的创建顺序是,先创建底层PDO,再创建高层的FDO,这也是设备堆栈的生长方向,即从底层设备到高层设备。在PDO和FDO之间夹着很多不同驱动程序创建的过滤驱动。底层设备对象寻找上一层的设备对象,是依靠底层设备对象的AttachedDevice来寻找的,如果某一设备的AttachedDevice为空,则说明已经到了设备堆栈的顶部。而高层设备寻找低一层的设备对象,设备对象没有相关的子域可以使用。可以通过自定义的设备扩展来

2010-07-04 19:01:00 1233

原创 WDM驱动程序

<br />先说下关于WDM驱动程序一些原理。Windows2000后,微软加入了新的驱动程序模型,就是WDM。在WDM中,完成一个设备的操作,至少有两个设备共同完成。其中,一个是物理设备对象PDO,另一个是功能设备对象FDO。两者的关系是"附加"和"被附加"的关系。当PC插入某个设备时,总线驱动程序创建PDO,而设备的驱动程序创建FDO,并附加到PDO上。当FDO附加到PDO上时,PDO设备对象的子域AttachedDevice会记录FDO的位置,而FDO可以通过定义设备扩展来记录FDO下层设备,如PDO

2010-07-01 21:20:00 992

原创 NT式驱动程序

<br />对于NT式驱动程序,主要的函数是DriverEntry例程、卸载程序以及各个IRP的派遣函数,基本结构如下:<br /> <br />#include "Driver.h"<br /> <br />#pragma INITCODE<br />extern "C" NTSTATUS DriverEntry (IN PDRIVER_OBJECT pDriverObject<br />                                                      IN PU

2010-07-01 19:55:00 1745

原创 HelloWDM驱动程序代码,HelloWDM.cpp

<br /><br />#include "HelloWDM.h"<br />/************************************************************************<br />* 函数名称:DriverEntry<br />*************************************************************************/<br />#pragma INITCODE <br />extern "C"

2010-06-28 21:34:00 1229

原创 WDM驱动程序头文件HelloWDM.h

<br />/*******************************<br />*文件名:HelloWDM.h<br />******************************/<br />#ifdef __cplusplus<br />extern "C"<br />{<br />#endif<br />#include <wdm.h><br />#ifdef __cplusplus<br />}<br />#endif<br />typedef struct _DEVICE_EXTENSI

2010-06-28 13:33:00 2658 1

原创 一个驱动程序的源代码Driver.cpp,接上篇

/****************************文件名称:Driver.cpp***************************/#include #pragma INITCODEextern "C" NTSTATUS DriverEntry(IN PDERIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath){ NTSTATUS status; KdPrint(("Enter DriverEntry/n")); //注册其他的驱

2010-06-27 21:59:00 1921

原创 一个驱动程序头文件Driver.h

/**********************文件名:Driver.h**********************/#pragma once#ifdef __cplusplusextern "C"{#endif#include #ifdef __cplusplus}#endif#define PAGEDCODE code_seg("PAGE")#define LOCKEDCODE code_seg()#define INITCODE code_seg("INIT")#define PAGEDDATA dat

2010-06-27 20:45:00 3440 1

原创 NT式驱动程序的helloworld

驱动程序的HelloWorld:/*first.c*/#include VOID DriverUnload(PDRIVER_OBJECT driver){DbgPrint("first: Our driver is unloading/r/n");}NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg_path){DbgPrint("first: hello my future!");driver->DriverUnload=Drive

2010-06-23 20:49:00 1320 1

原创 win32汇编代码的屏幕截屏程序

这个程序是我学习win32汇编后独立编写的第一个较大的程序,中间出现了不少错误,幸好在csdn朋友的帮助下,现在终于完成了。感谢csdn汇编版下的各位,给了我指导和建议,非常感谢大家!

2010-05-21 22:11:00 1016 2

原创 wiretefile和sizeof

最近在空余时间用win32汇编改写前面那个截屏程序,一直不成功。总觉得问题出在writefile中,于是在VC下写了个test,在C盘下建立一个11.txt文件,写入某个字符串,最初的代码如下:#include "stdafx.h"#include int main(int argc, char* argv[]){ DWORD          dwWritten;//写入文件字节数   

2010-05-15 10:58:00 409

原创 关于win32汇编的调试

在VC6环境下的win32汇编的调试,网上找的一篇文章,照着试了试,蛮不错的,特别是习惯VC编程的人来说,这种调试方法使用起来得心应手。用VC6调试器源码级调试win32汇编程序  使用一个好的调试器无疑对学习win32汇编是至关重要的,本人更偏爱VC的强大调试环境, 不要makefile文件。编程环境:VC6.0,Masm32v8 方法如下:1、 使用VC6新建一

2010-05-13 07:44:00 812

原创 一个截屏程序,最后以BMP文件的形式保存,VC代码

截屏程序,最后在C盘保存11.bmp文件。程序的主要难度在要自己构建位图文件头、位图文件信息头等结构,就好像在写伪IP数据包时,自己构建IP头和TCP头一样。代码有所简化,打算用win32汇编再写一次。#include #include int main(){ HBITMAP   hBmp;  HDC     hDC, MemDC,hDCC; //设备描述表       BYTE*   D

2010-05-05 21:04:00 825

原创 SEH的注册回调函数

我第一次知道SEH是在学习缓冲区溢出时,就知道这是windows的一个异常处理机制。SEH是基于线程的,使用SEH可以为每个线程设置不同的异常处理程序,而且可以为每个线程设置多个异常处理程序;SEH是硬件平台相关的,因为使用了与硬件平台相关的数据指针。win32为每个线程定义了一个线程信息块(TIB),其中保存了线程的一些属性数据,TIB的格式被定义为NT_TIB结构:NT_TIB STR

2010-03-28 16:32:00 1234

原创 关于代码重定位问题

在远程线程注入中,由于编程和实际运行处于不同的内存空间,势必会出现API内存地址不一致的情况,导致某些包含绝对地址的指令无法正常运行。解决这个问题的办法是代码重定位方法,具体代码如下:dwVar dd ?           call @F           @@:           pop ebx           sub ebx,offset @B        

2010-03-25 12:59:00 619

原创 函数调用时,栈里到底发生了什么?

今天看书时,看到代码重定位时,对EBP、ESP寄存器的使用特模糊,产生两个疑问,一是栈的最小的分配单位是什么?程序?进程还是线程?二是函数调用时,到底栈里发生了什么?为什么要那么做?于是翻阅了相关的资料加上自己的理解,整理如下。关于第一个问题,首先搞清楚程序、进程和线程之间的关系和区别。这个网上有太多的资料,最后的结论是,操作系统为每个线程保存单独的寄存器环境和单独的堆栈,但是它们共享进程的地

2010-03-20 11:04:00 1957

原创 关于进程创建,CreateProcess

进程创建用的最多的函数是CreateProcess。在这里我们必须要分清楚进程和可执行文件的区别。开始我一直以为CreateProcess就是创建一个新的可执行文件。事实上并非如此,该函数确切的功能是,用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。换句话讲,该函数用来启动已经存在的可执行文件,而不是创建新的可执行文件。函数的原型如下:BOOL CreateProcess( 

2010-03-17 08:45:00 790

原创 键盘记录程序

这是一个《windows环境下32位汇编语言程序设计》中的例子,在动态链接库和钩子那章,作为一个钩子的示例程序。原理很简单,装个全局钩子,然后钩住所有的键盘信息即可。但是这里存在两个问题,一是装什么类型的全局钩子才能钩住所有进程的键盘信息,二是钩住的键盘信息的翻译。大家都知道,钩子函数钩住的信息是以扫描码和虚拟码,不是我们现实中看到的键盘信息,因此如何翻译也是个问题。当然,说穿了一点都不稀奇,第一

2010-03-07 21:12:00 703

原创 线程远程注入

线程远程注入的技术并不复杂,主要用到CreateRemoteThread这个API。难点有个地方,由于要注入其他进程的空间,因此,注入用的那个线程中的代码必须使用和被注入进程的内存空间一致。换句话讲,就是需要找到线程中使用的函数在远程进程中的地址。明白这个,问题就没有了。下面是一个完整的线程注入的代码,在XP+SP3下运行成功。很简单的代码。 #include #include "WTYP

2010-02-24 21:25:00 483

Web安全测试

Web安全测试,PDF格式,涵盖各种web安全类型。

2013-01-11

罗云彬关于汇编和保护模式方面的资料

罗云彬关于汇编和保护模式方面的资料,chm格式

2010-05-13

OllyDbg入门资料

本人收集的OllyDbg入门资料,多个文档

2010-01-01

OllyDbg调试器

OllyDbg,一款windows下的调试器,我就不废话了

2010-01-01

ARP地址解析协议详解及其漏洞分析

ARP地址解析协议详解及其漏洞分析,讲解ARP协议的代码实现及其漏洞描述和利用

2009-09-29

Art.of.Software.Security.Assessment

Art.of.Software.Security.Assessment,E文版

2009-09-29

blue port scan for windows

windows环境下速度很快的一款端口扫描

2008-09-30

DOS命令全集

DOS命令全集,现在DOS几乎只在实验室里出现了

2008-06-03

Win2000驱动程序设计

Windows2000驱动程序设计

2008-06-03

Windows程序设计

Windows程序设计经典书籍

2008-06-03

Windows环境下设备驱动程序设计

Windows环境下设备驱动程序设计

2008-06-03

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除