- 博客(338)
- 资源 (13)
- 收藏
- 关注
原创 操作符简介
1.注意"=" "==" "!="还能操作各种引用类型。而"+"除了可以操作包含Boolean类型以外的基本数据类型外,还可以操作string类型。 2.多数操作符都是从左到右运算的,但是赋值操作是从右到左。 3.整型操作符在计算表达式时,若一个操作元是long,那么结果也是long,否则不管操作元是byte还是short、char,运算结果都是int。 4.算术右移位操作符>>
2012-05-04 10:53:11 441
原创 PE文件格式与API HOOK
对于windows低层编程来说,进行API拦截始终是一件让人激动的事,用自己的代码来改变其它程序的行为,还有比这个更有趣吗?而且,在实现API拦截的过程中我们还有机会去熟悉许多在RAD编程环境中很少接触的东西,如DLL远程注入、内存管理,PE文件格式等知识。许多商业软件,如金山词霸等词典软件,各种即时汉化软件、甚至一些网络游戏的外挂中都用到了这种技术,各种调试工具中多多少少也要用到这种技术。实
2012-04-27 10:15:25 572
原创 C++模板使用介绍
1. 模板的概念。我们已经学过重载(Overloading),对重载函数而言,C++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函数。例如,为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(Overload)版本。//函数1.int max(int x,int y);{return(x>y)?x:y ;}//函数2.float
2012-04-20 11:32:10 457
原创 PUSHAD
汇编语言传送指令之一,与它相关的指令还有PUSHA,POPA/POPAD.它们配合使用用于8个16位/32位通用寄存器与堆栈之间的数据传送. PUSHAD指令压入32位寄存器,使他们按照EDI,ESI,EBP,ESP,EBX,EDX,ECX,最后是EAX的顺序出现在堆栈中。 要注意,PUSHA/PUSHAD,POPA/POPAD从80286处理器开始使用.执行PUSHA/PUSHAD,POPA
2012-04-19 17:38:04 1923
原创 VirtualProtect函数
首先我们来看看MSDN上对VirtualProtect函数的说明。BOOL VirtualProtect( LPVOID lpAddress, DWORD dwSize, DWORD flNewProtect, PDWORD lpflOldProtect ); 各参数的意义为:lpAddress,要改变属性的内存起始地址。dwSize,要改变属性的内存区
2012-04-19 16:38:29 39403 3
原创 Inline Hook 之(监视任意函数)
前面已经写过两次inline hook的博文了,第一篇为:《C/C++ HOOK API(原理深入剖析之-LoadLibraryA)》,这篇博文的方法是通过修改任意函数的前面N个字节,实现跳转并进入到我们自定义的hook函数里,执行完毕我们的hook函数之后,再直接调用被hook的函数。第一篇的方法没有考虑多线程的情况,所以在多线程环境下会有问题。第二篇为:《 Inline HOOK API
2012-04-19 16:10:09 2262 1
原创 IoBuildDeviceIoControlRequest
重要函数学习:IoBuildDeviceIoControlRequest这个函数主要用来构造一个用于设备i/o控制请求的irp包,该irp包将被同步处理,其原型如下: 参数解释: IoControlCode 提供i/o控制请求所需的i/o控制码。这个i/o控制码可以在msdn中查询到。 DeviceO
2012-04-19 15:17:52 2300
原创 获取PCI设备并初始化
PCI有三个相互独立的物理地址空间:设备存储器地址空间、I/O地址空间和配置空间。配置空间是PCI所特有的一个物理空间。由于PCI支持设备即插即用,所以PCI设备不占用固定的内存地址空间或I/O地址空间,而是可以由操作系统决定映射的基址。系统加电时,BIOS检测PCI总线,确定所有连接在PCI总线上的设备以及它们配置要求,并进行系统配置。所以,所有PCI设备必须实现配置空间,从而能实现参数自动
2012-04-19 11:31:41 3133
原创 IRP_MN_START_DEVICE分发例程中的前进和等待IRP总结
当PnP管理器检测到硬件时,它首先参考注册表以了解有哪些过滤器驱动程序将管理该硬件。如果必要(某些驱动程序可能因为其它硬件的需要已经被系统装入)它将装入这些驱动程序,并调用它们的AddDevice函数。最后AddDevice函数创建设备对象并连入设备堆栈。此后,PnP管理器将为所有设备驱动程序分配I/O资源。一旦资源分配确定,PnP管理器通过向每个设备发送一个带IRP_MN_START_DEV
2012-04-19 10:57:29 1960
原创 WDM驱动程序的基本结构和实例
WDM驱动的基本结构:WDM驱动模型是建立在NT式驱动程序模型基础之上的。对于WDM驱动程序来说,一般都是基于分层的,即完成一个设备的操作,至少要由两个驱动设备共同完成。 1)物理设备对象和功能设备对象物理设备对象(Physical Device Object,PDO)和功能设备对象(Function Device Object,FDO)的关系是“附加”与“被附加”的关系。当P
2012-04-19 10:36:23 4439 1
原创 MmMapIoSpace函数
MmMapIoSpace函数 是用来把wince中的物理地址转换成虚拟地址的一个函数。这个函数在ceddk.h和ceddk.lib中有详细的定义。PVOID MmMapIoSpace( PHYSICAL_ADDRESS PhysicalAddress,ULONG NumberOfBytes, BOOLEAN CacheEnable); xDBO#w "} 如果参数Phys
2012-04-18 14:37:03 4693
原创 给应用程序加装“看门狗”
相信大多数的程序员或用户,在Windows中见到类似于下面的亲切而又温馨的提示信息,都不会感到陌生:“XXX执行了非法操作,将被关闭。要终止程序,请单击;要调试程序,请单击。”或者,“是否向Microsoft发送错误报告?,。”如果这个程序运行在无人值守、需要保持连续工作状态的场合,而其中的bug又一时难以排除,就需要采取应急措施,消除或减少程序出错造成的影响。本文讨论解决这个问题的办法。
2012-04-18 10:06:16 498
原创 实战DeviceIoControl 之一:通过API访问设备驱动程序
Q 在NT/2000/XP中,我想用VC编写应用程序访问硬件设备,如获取磁盘参数、读写绝对扇区数据、测试光驱实际速度等,该从哪里入手呢?A 在NT/2000/XP中,应用程序可以通过API函数DeviceIoControl来实现对设备的访问—获取信息,发送命令,交换数据等。利用该接口函数向指定的设备驱动发送正确的控制码及数据,然后分析它的响应,就可以达到我们的目的。DeviceIoCont
2012-04-18 10:03:19 411
原创 PCI设备驱动开发
1. PCI 简介PCI 总线标准是一种将系统外部设备连接起来的总线标准,是 PC 中最重要的总线,实际上是系统的各个部分如何交互的接口。传输速率可达到 133MB/s。在当前的 PC 体系结构中,几乎所有的外部设备采用的各种各样的接口总线,均是通过桥接电路挂接到 PCI 系统上。在这种 PCI 系统中, Host/PCI 桥称为北桥,连接主处理器总线到基础 PCI 局部总线。 PCI 与其他
2012-04-17 17:47:14 804
原创 PCI设备驱动开发
1. PCI 简介PCI 总线标准是一种将系统外部设备连接起来的总线标准,是 PC 中最重要的总线,实际上是系统的各个部分如何交互的接口。传输速率可达到 133MB/s。在当前的 PC 体系结构中,几乎所有的外部设备采用的各种各样的接口总线,均是通过桥接电路挂接到 PCI 系统上。在这种 PCI 系统中, Host/PCI 桥称为北桥,连接主处理器总线到基础 PCI 局部总线。 PCI 与其他
2012-04-17 17:40:58 602
原创 详解CTL_CODE宏
CTL_CODE:用于创建一个唯一的32位系统I/O控制代码,这个控制代码包括4部分组成:DeviceType(设备类型,高16位(16-31位)),Access(访问限制,14-15位),Function(功能2-13 位),Method(I/O访问内存使用方式)。 This macro creates a unique system I/O control code (IO
2012-04-17 17:14:36 857
原创 函数指针及函数指针数组的妙用
笔者在开发某软件过程中遇到这样一个问题,前级模块传给我二进制数据,输入参数为 char* buffer和 int length,buffer是数据的首地址,length表示这批数据的长度。数据的特点是:长度不定,类型不定,由第一个字节(buffer[0])标识该数据的类型,共有256(28 )种可能性。我的任务是必须对每一种可能出现的数据类型都要作处理,并且我的模块包含若干个函数,在每个函数里面都
2012-04-17 16:16:06 327
原创 函数指针,函数指针数组,函数指针数组的指针
函数指针的使用先看如下例子:#include #include char * fun(char * p1,char * p2){int i = 0;i = strcmp(p1,p2);if (0 == i){return p1;//返回值为指针类型,所以函数也要为指针型}else{return p2;}}int main(){
2012-04-17 15:40:55 326
转载 WDM驱动程序的基本结构和实例
WDM驱动的基本结构:WDM驱动模型是建立在NT式驱动程序模型基础之上的。对于WDM驱动程序来说,一般都是基于分层的,即完成一个设备的操作,至少要由两个驱动设备共同完成。 1)物理设备对象和功能设备对象物理设备对象(Physical Device Object,PDO)和功能设备对象(Function Device Object,FDO)的关系是“附加”与“被附加”的关系。当P
2012-04-17 14:37:01 898
原创 分层驱动的概念
#pragma INITCODEextern "C" NTSTATUS DriverEntry ( INPDRIVER_OBJECT pDriverObject, INPUNICODE_STRING pRegistryPath ){ NTSTATUS ntStatus; KdPrint(("DriverB:Enter B DriverEntry\n")); //
2012-04-17 11:24:02 1302
原创 将IRP分解成多个IRP
#pragma PAGEDCODENTSTATUS HelloDDKRead(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp){ KdPrint(("DriverA:Enter AHelloDDKRead\n")); NTSTATUS status = STATUS_SUCCESS; PIO_STACK_LOCATION sta
2012-04-17 11:22:17 1181
转载 IoCopyCurrentIrpStackLocationToNext
关于将本层的IO_STACK_LOCATION拷贝到下一层的两种方法 方法一:调用MS提供的标准方法IoCopyCurrentIrpStackLocationToNext(...) 方法二:C++代码PIO_STACK_LOCATION IrpSp; PIO_STACK_LOCATION NextIrpSp; IrpSp = IoGet
2012-04-17 10:51:21 1642
原创 内核API之IoAllocateMdl
IoAllocateMdl IoAllocateMdl 函数分配足够映射一块缓存的MDL,给定缓存的起始地址和长度.PMDL IoAllocateMdl( __in_opt PVOID VirtualAddress, __in ULONG Length, __in BOOLEAN SecondaryBuffer, __in BOOLEAN
2012-04-17 10:38:47 582
原创 内核API笔记之IoBuildPartialMdl
IoBuildPartialMdlVOID IoBuildPartialMdl( __in PMDL SourceMdl, __inout PMDL TargetMdl, __in PVOID VirtualAddress, __in ULONG Length );驱动程序可以使用IoBuildPartialMdl来把一个IR
2012-04-17 10:31:18 1636
原创 驱动杂记2:分层驱动,IRP ,I/O堆栈初步印象
分层驱动是指两个或者两个以上的驱动程序,他们分别创建设备对象,并且形成一个由高到低的设备对象栈。IRP请求一般会被传送到设备栈的最顶层设备对象,顶层设备对象可以选择直接结束IRP请求,也可以选择将IRP请求向下层设备转发。如果是向下层设备转发,当IRP请求结束时,IRP会顺着设备栈的反方向原路返回。当得知下层驱动程序已经结束IRP请求时,本层设备对象可以选择继续向上返回,也可以重新
2012-04-16 18:18:53 1678
原创 驱动杂记1:对驱动对象,设备对象,设备栈的理解
Windows内核采用的是面向对象的编程方式,但使用的确是C语言。Windows内核认为许多东西都是“对象”,比如一个驱动一个文件一个设备,“对象”相当于一个基类。 一个驱动对象代表了一个驱动程序,或者说一个内核模块。驱动对象结构如下:typedef struct _DRIVER_OBJECT{//结构的类型和大小CSHORT Type;CSHORT Size;..
2012-04-16 18:18:09 1573
原创 通俗解析IRP和I/O设备栈在内核程序中的作用(转自看雪)
正文:言归正传,所有的I/O请求都是以IRP(I/O请求包)的形式来提交的,同时内核程序的所有分发函数(Dispatch Function)的第二个参数都是PIRP(也即是指向IRP的指针)。为了说明问题,防止跳跃性太大,先解释几个名词(都按自己理解的),可以帮助会的人复习,不会的人学习1:DRIVER_OBJECT:驱动对象,由即插即用管理创建和传递到DriverEntr
2012-04-16 18:16:20 3257 1
原创 入门笔记 - IoCallDriver
分层驱动概念略。设备挂载指的是将一个设备A挂载到一个设备栈中的顶层设备B上面,从而使得发向原来设备栈中顶层设备B的IRP,会先发到A中,在A里面可以过滤一些IRP数据,达到过滤的目的。[详细见驱动开发详解12章]当应用程序发向原先的设备的IRP,会先发向过滤设备里,在过滤设备处理IRP时1、可以调用IoCompleteRequest函数,直接结束IRP请求,这样就会使得IRP不能到达底层驱
2012-04-16 18:07:44 2053
原创 关于MDL的一些事情
微软的文档里对MDL的描述感觉语焉不详,这两天在找工作的间隙逆向+黑盒测试了一下MmBuildMdlForNonPagedPool,把得到的一些理解描述下来。一.MDL数据结构 MDL是用来建立一块虚拟地址空间与物理页面之间的映射,结构定义如下: [cpp] view plaincopytypedef struct _MDL { struc
2012-04-16 17:31:03 5291
原创 MDL 数据结构
《Windows驱动开发技术详解》中说在使用直接方式来读写设备的时候,操作系统会将用户模式下的缓冲区锁住,然后操作系统将这段缓冲区在内核模式地址再次映射一遍。这样,用户模式的缓冲区和内核模式的缓冲区都使用的是同一块物理内存,无论操作系统如果切换进程,内核模式的地址都保持不变。操作系统先将用户模式的地址锁定后会使用MDL来记录这片内存。被记录的内存在物理内存上可能是离散的,但是在虚拟内存上一
2012-04-16 17:23:43 2975
原创 IoGetDeviceObjectPointer
从名字获得设备对象在知道一个设备名字的情况下,使用函数IoGetDeviceObjectPointer可以获得这个设备对象的指针。这个函数的原型如下:NTSTATUS IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName,IN ACCESS_MASK DesiredAccess,OUT PFILE_OBJE
2012-04-16 16:33:51 6361
原创 IoCallDriver函数与PoCallDriver函数
今天看书的时候看到了这两个函数,开始还没在意,以为是同一个,功能应该一样。后来想想一样的干嘛还弄两个呢,于是就查了一下,发现这两个函数差别还蛮大的。首先来看这两个函数的原型:[cpp] view plaincopyNTSTATUS IoCallDriver( IN PDEVICE_OBJECT DeviceObject, IN OUT
2012-04-16 16:11:30 1701
原创 高手进阶windows内核定时器之一
windows内核定时器,定时最小单位为100ns. 比ring3的定时器要精准得多,并且使用它,稳定性高,系统开销小,无需消息队列,且功能强大,是作为数据采集绝好的定时器。( ,有点像高钙片的广告词)这个内核定时器,涉及到三个函数,分别是KeInitializeTimerEx,KeCancelTimer和KeSetTimerEx。下面我们使用windbg这个工具,来进一步看看这三个函数的
2012-04-16 14:10:08 3652 1
原创 高手进阶windows内核定时器之一
谈到定时器在ring3下有一个,启动和关闭都比较简单,通过两个api函数SetTimer和KillTimer来完成的。对于ring0中的定时器,稍微复杂一些。Ring0 下的定时器有两个,今天我们先看一个。即:利用I/O定时器例程实现的。用于进行固定的1秒时间间隔的操作定时。对应的函数有三个。 在IoInitializeTimer 函数中,我们设置回调函数,回调函数定
2012-04-16 14:07:04 1797
原创 内核编程笔记
1,字符串操作UNICODE_STRING //UNICODE_STRING结构体ANSII_STRINGRTL_CONSTANT_STRING(); //UNICODE_STRING初始化RtlCopyUnicodeString() //UNICODE_STRING复制RtlxxxUnicodeString(); //UNICODE_STRING操作NTSTATUS; /
2012-04-16 14:03:08 1283
原创 Windows驱动编程 文件读写 以及注册表操作
3.3 文件的读写操作打开文件之后,最重要的操作是对文件的读写。读与写的方法是对称的。只是参数输入与输出的方向不同。读取文件内容一般用ZwReadFile,写文件一般使用ZwWriteFile。C++代码NTSTATUS ZwReadFile( IN HANDLE FileHandle, IN HANDLE Event OPTIONAL, IN PIO_APC_ROU
2012-04-16 11:34:34 6906
原创 深入理解 ZwCreateFile
前言:任何编码的东西必须充分的了解规则!我试探性的搜索了下关于这个native api的相关的问题,很郁闷的发现,这些问题90%都是没有真正理解了这个函数导致的!有的人连函数干嘛的都不知道就着急的写驱动,真是不可一世!所谓兼收并蓄为的是厚积薄发,其间如履薄冰。说的很贴切!对此我一直支持achills师傅的思想!搞明白了最基本的和必须的东西,一切后续的东西迎刃而解!这个文章我没有
2012-04-16 11:20:48 8306
原创 PHP漏洞全解(九)-文件上传漏洞
一套web应用程序,一般都会提供文件上传的功能,方便来访者上传一些文件。下面是一个简单的文件上传表单form action="upload.php" method="post" enctype="multipart/form-data" name="form1"> input type="file" name="file1" />br /> input type="submit" valu
2012-04-16 09:42:11 604
原创 PHP漏洞全解(八)-HTTP响应拆分
HTTP请求的格式1)请求信息:例如“Get /index.php HTTP/1.1”,请求index.php文件2)表头:例如“Host: localhost”,表示服务器地址3)空白行4)信息正文“请求信息”和“表头”都必须使用换行字符(CRLF)来结尾,空白行只能包含换行符,不可以有其他空格符。下面例子发送HTTP请求给服务器www.yhsafe.comGET /
2012-04-16 09:41:34 1822
原创 PHP漏洞全解(七)-Session劫持
服务端和客户端之间是通过session(会话)来连接沟通。当客户端的浏览器连接到服务器后,服务器就会建立一个该用户的session。每个用户的session都是独立的,并且由服务器来维护。每个用户的session是由一个独特的字符串来识别,成为session id。用户发出请求时,所发送的http表头内包含session id 的值。服务器使用http表头内的session id来识别时哪个用户提
2012-04-16 09:40:57 1553
TensorFlow技术解析与实战 带书签 高清
2019-02-20
深度学习框架PyTorch:入门与实践(陈云)
2019-02-19
深度强化学习原理入门
2019-01-25
spark 源码分析
2019-01-25
深入理解Java虚拟机高清PDF
2018-12-18
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人