自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(338)
  • 资源 (13)
  • 收藏
  • 关注

原创 操作符简介

1.注意"=" "==" "!="还能操作各种引用类型。而"+"除了可以操作包含Boolean类型以外的基本数据类型外,还可以操作string类型。  2.多数操作符都是从左到右运算的,但是赋值操作是从右到左。  3.整型操作符在计算表达式时,若一个操作元是long,那么结果也是long,否则不管操作元是byte还是short、char,运算结果都是int。  4.算术右移位操作符>>

2012-05-04 10:53:11 429

原创 PE文件格式与API HOOK

对于windows低层编程来说,进行API拦截始终是一件让人激动的事,用自己的代码来改变其它程序的行为,还有比这个更有趣吗?而且,在实现API拦截的过程中我们还有机会去熟悉许多在RAD编程环境中很少接触的东西,如DLL远程注入、内存管理,PE文件格式等知识。许多商业软件,如金山词霸等词典软件,各种即时汉化软件、甚至一些网络游戏的外挂中都用到了这种技术,各种调试工具中多多少少也要用到这种技术。实

2012-04-27 10:15:25 555

原创 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 443

原创 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 1830

原创 VirtualProtect函数

首先我们来看看MSDN上对VirtualProtect函数的说明。BOOL VirtualProtect(    LPVOID lpAddress,    DWORD dwSize,    DWORD flNewProtect,    PDWORD lpflOldProtect  );  各参数的意义为:lpAddress,要改变属性的内存起始地址。dwSize,要改变属性的内存区

2012-04-19 16:38:29 38438 2

原创 Inline Hook 之(监视任意函数)

前面已经写过两次inline hook的博文了,第一篇为:《C/C++ HOOK API(原理深入剖析之-LoadLibraryA)》,这篇博文的方法是通过修改任意函数的前面N个字节,实现跳转并进入到我们自定义的hook函数里,执行完毕我们的hook函数之后,再直接调用被hook的函数。第一篇的方法没有考虑多线程的情况,所以在多线程环境下会有问题。第二篇为:《 Inline HOOK API

2012-04-19 16:10:09 2238 1

原创 IoBuildDeviceIoControlRequest

重要函数学习:IoBuildDeviceIoControlRequest这个函数主要用来构造一个用于设备i/o控制请求的irp包,该irp包将被同步处理,其原型如下:  参数解释:       IoControlCode                     提供i/o控制请求所需的i/o控制码。这个i/o控制码可以在msdn中查询到。       DeviceO

2012-04-19 15:17:52 2109

原创 获取PCI设备并初始化

PCI有三个相互独立的物理地址空间:设备存储器地址空间、I/O地址空间和配置空间。配置空间是PCI所特有的一个物理空间。由于PCI支持设备即插即用,所以PCI设备不占用固定的内存地址空间或I/O地址空间,而是可以由操作系统决定映射的基址。系统加电时,BIOS检测PCI总线,确定所有连接在PCI总线上的设备以及它们配置要求,并进行系统配置。所以,所有PCI设备必须实现配置空间,从而能实现参数自动

2012-04-19 11:31:41 3104

原创 IRP_MN_START_DEVICE分发例程中的前进和等待IRP总结

当PnP管理器检测到硬件时,它首先参考注册表以了解有哪些过滤器驱动程序将管理该硬件。如果必要(某些驱动程序可能因为其它硬件的需要已经被系统装入)它将装入这些驱动程序,并调用它们的AddDevice函数。最后AddDevice函数创建设备对象并连入设备堆栈。此后,PnP管理器将为所有设备驱动程序分配I/O资源。一旦资源分配确定,PnP管理器通过向每个设备发送一个带IRP_MN_START_DEV

2012-04-19 10:57:29 1930

原创 WDM驱动程序的基本结构和实例

WDM驱动的基本结构:WDM驱动模型是建立在NT式驱动程序模型基础之上的。对于WDM驱动程序来说,一般都是基于分层的,即完成一个设备的操作,至少要由两个驱动设备共同完成。 1)物理设备对象和功能设备对象物理设备对象(Physical Device Object,PDO)和功能设备对象(Function Device Object,FDO)的关系是“附加”与“被附加”的关系。当P

2012-04-19 10:36:23 4395 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 4643

原创 给应用程序加装“看门狗”

相信大多数的程序员或用户,在Windows中见到类似于下面的亲切而又温馨的提示信息,都不会感到陌生:“XXX执行了非法操作,将被关闭。要终止程序,请单击;要调试程序,请单击。”或者,“是否向Microsoft发送错误报告?,。”如果这个程序运行在无人值守、需要保持连续工作状态的场合,而其中的bug又一时难以排除,就需要采取应急措施,消除或减少程序出错造成的影响。本文讨论解决这个问题的办法。

2012-04-18 10:06:16 493

原创 实战DeviceIoControl 之一:通过API访问设备驱动程序

Q 在NT/2000/XP中,我想用VC编写应用程序访问硬件设备,如获取磁盘参数、读写绝对扇区数据、测试光驱实际速度等,该从哪里入手呢?A 在NT/2000/XP中,应用程序可以通过API函数DeviceIoControl来实现对设备的访问—获取信息,发送命令,交换数据等。利用该接口函数向指定的设备驱动发送正确的控制码及数据,然后分析它的响应,就可以达到我们的目的。DeviceIoCont

2012-04-18 10:03:19 404

原创 PCI设备驱动开发

1. PCI 简介PCI 总线标准是一种将系统外部设备连接起来的总线标准,是 PC 中最重要的总线,实际上是系统的各个部分如何交互的接口。传输速率可达到 133MB/s。在当前的 PC 体系结构中,几乎所有的外部设备采用的各种各样的接口总线,均是通过桥接电路挂接到 PCI 系统上。在这种 PCI 系统中, Host/PCI 桥称为北桥,连接主处理器总线到基础 PCI 局部总线。 PCI 与其他

2012-04-17 17:47:14 791

原创 PCI设备驱动开发

1. PCI 简介PCI 总线标准是一种将系统外部设备连接起来的总线标准,是 PC 中最重要的总线,实际上是系统的各个部分如何交互的接口。传输速率可达到 133MB/s。在当前的 PC 体系结构中,几乎所有的外部设备采用的各种各样的接口总线,均是通过桥接电路挂接到 PCI 系统上。在这种 PCI 系统中, Host/PCI 桥称为北桥,连接主处理器总线到基础 PCI 局部总线。 PCI 与其他

2012-04-17 17:40:58 586

原创 详解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 830

原创 函数指针及函数指针数组的妙用

笔者在开发某软件过程中遇到这样一个问题,前级模块传给我二进制数据,输入参数为 char* buffer和 int length,buffer是数据的首地址,length表示这批数据的长度。数据的特点是:长度不定,类型不定,由第一个字节(buffer[0])标识该数据的类型,共有256(28 )种可能性。我的任务是必须对每一种可能出现的数据类型都要作处理,并且我的模块包含若干个函数,在每个函数里面都

2012-04-17 16:16:06 316

原创 函数指针,函数指针数组,函数指针数组的指针

函数指针的使用先看如下例子:#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 320

转载 WDM驱动程序的基本结构和实例

WDM驱动的基本结构:WDM驱动模型是建立在NT式驱动程序模型基础之上的。对于WDM驱动程序来说,一般都是基于分层的,即完成一个设备的操作,至少要由两个驱动设备共同完成。 1)物理设备对象和功能设备对象物理设备对象(Physical Device Object,PDO)和功能设备对象(Function Device Object,FDO)的关系是“附加”与“被附加”的关系。当P

2012-04-17 14:37:01 872

原创 分层驱动的概念

#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 1292

原创 将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 1168

转载 IoCopyCurrentIrpStackLocationToNext

关于将本层的IO_STACK_LOCATION拷贝到下一层的两种方法    方法一:调用MS提供的标准方法IoCopyCurrentIrpStackLocationToNext(...)    方法二:C++代码PIO_STACK_LOCATION IrpSp;    PIO_STACK_LOCATION NextIrpSp;       IrpSp = IoGet

2012-04-17 10:51:21 1612

原创 内核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 570

原创 内核API笔记之IoBuildPartialMdl

IoBuildPartialMdlVOID IoBuildPartialMdl(     __in PMDL SourceMdl,     __inout PMDL TargetMdl,     __in PVOID VirtualAddress,     __in ULONG Length     );驱动程序可以使用IoBuildPartialMdl来把一个IR

2012-04-17 10:31:18 1614

原创 驱动杂记2:分层驱动,IRP ,I/O堆栈初步印象

分层驱动是指两个或者两个以上的驱动程序,他们分别创建设备对象,并且形成一个由高到低的设备对象栈。IRP请求一般会被传送到设备栈的最顶层设备对象,顶层设备对象可以选择直接结束IRP请求,也可以选择将IRP请求向下层设备转发。如果是向下层设备转发,当IRP请求结束时,IRP会顺着设备栈的反方向原路返回。当得知下层驱动程序已经结束IRP请求时,本层设备对象可以选择继续向上返回,也可以重新

2012-04-16 18:18:53 1655

原创 驱动杂记1:对驱动对象,设备对象,设备栈的理解

Windows内核采用的是面向对象的编程方式,但使用的确是C语言。Windows内核认为许多东西都是“对象”,比如一个驱动一个文件一个设备,“对象”相当于一个基类。   一个驱动对象代表了一个驱动程序,或者说一个内核模块。驱动对象结构如下:typedef struct _DRIVER_OBJECT{//结构的类型和大小CSHORT Type;CSHORT Size;..

2012-04-16 18:18:09 1543

原创 通俗解析IRP和I/O设备栈在内核程序中的作用(转自看雪)

正文:言归正传,所有的I/O请求都是以IRP(I/O请求包)的形式来提交的,同时内核程序的所有分发函数(Dispatch Function)的第二个参数都是PIRP(也即是指向IRP的指针)。为了说明问题,防止跳跃性太大,先解释几个名词(都按自己理解的),可以帮助会的人复习,不会的人学习1:DRIVER_OBJECT:驱动对象,由即插即用管理创建和传递到DriverEntr

2012-04-16 18:16:20 3238 1

原创 入门笔记 - IoCallDriver

分层驱动概念略。设备挂载指的是将一个设备A挂载到一个设备栈中的顶层设备B上面,从而使得发向原来设备栈中顶层设备B的IRP,会先发到A中,在A里面可以过滤一些IRP数据,达到过滤的目的。[详细见驱动开发详解12章]当应用程序发向原先的设备的IRP,会先发向过滤设备里,在过滤设备处理IRP时1、可以调用IoCompleteRequest函数,直接结束IRP请求,这样就会使得IRP不能到达底层驱

2012-04-16 18:07:44 1987

原创 关于MDL的一些事情

微软的文档里对MDL的描述感觉语焉不详,这两天在找工作的间隙逆向+黑盒测试了一下MmBuildMdlForNonPagedPool,把得到的一些理解描述下来。一.MDL数据结构    MDL是用来建立一块虚拟地址空间与物理页面之间的映射,结构定义如下:    [cpp] view plaincopytypedef struct _MDL {    struc

2012-04-16 17:31:03 5104

原创 MDL 数据结构

《Windows驱动开发技术详解》中说在使用直接方式来读写设备的时候,操作系统会将用户模式下的缓冲区锁住,然后操作系统将这段缓冲区在内核模式地址再次映射一遍。这样,用户模式的缓冲区和内核模式的缓冲区都使用的是同一块物理内存,无论操作系统如果切换进程,内核模式的地址都保持不变。操作系统先将用户模式的地址锁定后会使用MDL来记录这片内存。被记录的内存在物理内存上可能是离散的,但是在虚拟内存上一

2012-04-16 17:23:43 2923

原创 IoGetDeviceObjectPointer

从名字获得设备对象在知道一个设备名字的情况下,使用函数IoGetDeviceObjectPointer可以获得这个设备对象的指针。这个函数的原型如下:NTSTATUS IoGetDeviceObjectPointer(IN PUNICODE_STRING  ObjectName,IN ACCESS_MASK  DesiredAccess,OUT PFILE_OBJE

2012-04-16 16:33:51 6284

原创 IoCallDriver函数与PoCallDriver函数

今天看书的时候看到了这两个函数,开始还没在意,以为是同一个,功能应该一样。后来想想一样的干嘛还弄两个呢,于是就查了一下,发现这两个函数差别还蛮大的。首先来看这两个函数的原型:[cpp] view plaincopyNTSTATUS     IoCallDriver(      IN PDEVICE_OBJECT  DeviceObject,      IN OUT

2012-04-16 16:11:30 1675

原创 高手进阶windows内核定时器之一

windows内核定时器,定时最小单位为100ns. 比ring3的定时器要精准得多,并且使用它,稳定性高,系统开销小,无需消息队列,且功能强大,是作为数据采集绝好的定时器。( ,有点像高钙片的广告词)这个内核定时器,涉及到三个函数,分别是KeInitializeTimerEx,KeCancelTimer和KeSetTimerEx。下面我们使用windbg这个工具,来进一步看看这三个函数的

2012-04-16 14:10:08 3584 1

原创 高手进阶windows内核定时器之一

谈到定时器在ring3下有一个,启动和关闭都比较简单,通过两个api函数SetTimer和KillTimer来完成的。对于ring0中的定时器,稍微复杂一些。Ring0 下的定时器有两个,今天我们先看一个。即:利用I/O定时器例程实现的。用于进行固定的1秒时间间隔的操作定时。对应的函数有三个。  在IoInitializeTimer 函数中,我们设置回调函数,回调函数定

2012-04-16 14:07:04 1768

原创 内核编程笔记

1,字符串操作UNICODE_STRING //UNICODE_STRING结构体ANSII_STRINGRTL_CONSTANT_STRING(); //UNICODE_STRING初始化RtlCopyUnicodeString() //UNICODE_STRING复制RtlxxxUnicodeString(); //UNICODE_STRING操作NTSTATUS; /

2012-04-16 14:03:08 1269

原创 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 6836

原创 深入理解 ZwCreateFile

前言:任何编码的东西必须充分的了解规则!我试探性的搜索了下关于这个native api的相关的问题,很郁闷的发现,这些问题90%都是没有真正理解了这个函数导致的!有的人连函数干嘛的都不知道就着急的写驱动,真是不可一世!所谓兼收并蓄为的是厚积薄发,其间如履薄冰。说的很贴切!对此我一直支持achills师傅的思想!搞明白了最基本的和必须的东西,一切后续的东西迎刃而解!这个文章我没有

2012-04-16 11:20:48 8257

原创 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 584

原创 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 1787

原创 PHP漏洞全解(七)-Session劫持

服务端和客户端之间是通过session(会话)来连接沟通。当客户端的浏览器连接到服务器后,服务器就会建立一个该用户的session。每个用户的session都是独立的,并且由服务器来维护。每个用户的session是由一个独特的字符串来识别,成为session id。用户发出请求时,所发送的http表头内包含session id 的值。服务器使用http表头内的session id来识别时哪个用户提

2012-04-16 09:40:57 1505

TensorFlow技术解析与实战 带书签 高清

本章主要介绍了人工智能、机器学习、深度学习的关系,以及深度学习的学习步骤,分析了这个领域的相关人群,以及这个领域的重要赛事。然后,全面介绍了 TensorFlow 的作用、特性,并介绍了国内做人工智能的公司,讲述了目前在产业界进行的探索,和提供给开发者的一些基础平台。

2019-02-20

深度学习框架PyTorch:入门与实践(陈云)

书从多维数组Tensor开始,循序渐进地带领读者了解PyTorch各方面的基础知识,并结合基础知识和前沿研究,带领读者从零开始完成几个经典有趣的深度学习小目,包括GAN 生成动漫头像、AI滤镜、AI 写诗等。本书没有简单机械地介绍各个函数接口的使用,而是尝试分门别类、循序渐进地向读者介绍PyTorch的知识,希望读者对PyTorch有一个完整的认识。本书内容由浅入深,无论是深度学习的初学者,还是第一次接触PyTorch的研究人员,都能在学习本书的过程中快速掌握PyTorch。即使是有一定PyTorch使用经验的用户,也能够从本书中获得对PyTorch 不一样的理解。 [1] 该书由浅入深,利用Jupyter notebook帮助读者快速学习PyTorch,并带领读者从零开始完成Kaggle比赛、GAN生成动漫头像、AI滤镜、RNN写诗、图像描述等深度有趣的应用。

2019-02-19

王晋东博士迁移学习系列

“看了王晋东同学的“迁移学习小册子”, 点三个赞! 迁移学习被认为是机器学习的下一个爆点,但介绍迁移学习的文章却很有限。 这个册子深入浅出,既回顾了迁移学习的发展历史,又囊括了迁移学习的最新进展。 语言流畅,简明通透。 应该对机器学习的入门和提高都有很大帮助!”

2019-02-17

深度学习原理与应用实践OCR(带有书签)

介绍了行业现状, 以及一些常用网络和算法。 比较好的入门资料。

2019-01-27

apache kylin权威指南

: 前  言 “麒麟出没,必有祥瑞。” ——中国古谚语 “于我而言,与Apache Kylin团队一起合作使Kylin通过孵化成为顶级项目是非常激动人心的,诚然,Kylin在技术方面非常振奋人心,但同样令人兴奋的是Kylin代表了亚洲国家,特别是中国,在开源社区中越来越高的参与度。

2019-01-27

深度强化学习原理入门

去年,DeepMind 的 AlphaGo 以 4-1 的比分打败了世界围棋冠军李世乭。超过 2 亿的观众就这样看着强化学习(reinforce learning)走上了世界舞台。几年前,DeepMind 制作了一个可以玩 Atari 游戏的机器人,引发轩然大波。此后这个公司很快被谷歌收购。 很多研究者相信,强化学习是我们创造通用人工智能(Artificial General Intelligence)的最佳手段。这是一个令人兴奋的领域,有着许多未解决的挑战和巨大的潜能。

2019-01-25

spark 源码分析

《Apache Spark源码剖析》以Spark 1.02版本源码为切入点,着力于探寻Spark所要解决的主要问题及其解决办法,通过一系列精心设计的小实验来分析每一步背后的处理逻辑。 《Apache Spark源码剖析》第3~5章详细介绍了Spark Core中作业的提交与执行,对容错处理也进行了详细分析,有助读者深刻把握Spark实现机理。第6~9章对Spark Lib库进行了初步的探索。在对源码有了一定的分析之后,读者可尽快掌握Spark技术。

2019-01-25

深入理解Java虚拟机高清PDF

《深入理解Java虚拟机:JVM高级特性与最佳实践》共分为五大部分,围绕内存管理、执行子系统、程序编译与优化、高效并发等核心主题对JVM进行了全面而深入的分析,深刻揭示了JVM的工作原理。第一部分从宏观的角度介绍了整个Java技术体系、Java和JVM的发展历程、模块化,以及JDK的编译,这对理解本书后面内容有重要帮助。第二部分讲解了JVM的自动内存管理,包括虚拟机内存区域的划分原理以及各种内存溢出异常产生的原因;常见的垃圾收集算法以及垃圾收集器的特点和工作原理;常见虚拟机监

2018-12-18

docker 高清

docker高清教程 。简洁实用

2018-09-13

Windows内核原理与实现

关于windowNT内核介绍的很详细。驱动开发。内核核心数据结构等等

2012-11-26

黑客反汇编

超级无敌黑客反汇编,黑客必备。各种手法。linux window 系统反汇编。

2012-03-27

极好的c++精华笔记

C++ 极好的c++精华笔记,学c++的同学很值得一看

2012-03-27

linux内核驱动编写

极好的 linux 内核驱动 资料 学习linux的同学看啊

2011-10-18

空空如也

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

TA关注的人

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