
window系统内核编程
文章平均质量分 86
zacklin
这个作者很懒,什么都没留下…
展开
-
window 核心编程
http://www.cnblogs.com/mydomain/category/264964.html原创 2012-04-05 14:53:47 · 1337 阅读 · 0 评论 -
ReadProcessMemory函数的分析
ReadProcessMemory函数用于读取其他进程的数据。我们知道自远古时代结束后,user模式下的进程都有自己的地址空间,进程与进程间互不干扰,这叫私有财产神圣不可侵犯。但windows里还真就提供了那么一个机制,让你可以合法的获取别人的私有财产,这就是ReadProcessMemory和WriteProcessMemory。为什么一个进程居然可以访问另一个进程的地址空间呢?因为独立的只是低原创 2012-04-06 16:29:39 · 1529 阅读 · 0 评论 -
Windows平台字符透明编程大总结
Windows平台有用Unicode和不用的区分:WinNT到Windows2003一直使用Unicode;WindowsCE也是如此;Win95和Win98就非如此。Windows编程对于字符使用也有各种情况:Windows API的处理方式、MFC的处理方式、VC++的处理方式、COM的处理方式。本文对所有这些方式作了一个总结,期望程序员能够以本文为引子,找到各种情况下处理字符透明编程的方法。原创 2012-04-09 10:56:36 · 1199 阅读 · 0 评论 -
Windows 自旋锁分析(一)
自旋锁是一种在内核定义,只能在内核态下使用的同步机制。自旋锁用来保护共享数据或者资源,使得并发执行的程序或者在高优先级IRQL的对称多处理器的程序能够正确访问这些数据。分析Windows自旋锁,首先需要介绍Windows的IRQL。 1 Interrupt Request Level(IRQL)介绍IRQL是Interrupt RequestLevel,中断请求级别。一个由window原创 2012-04-10 14:25:16 · 3877 阅读 · 0 评论 -
Windows 自旋锁分析(二)
3 KeAcquireSpinLockAtDpcLevel的实现机制MSDN上说明调用KeAcquireSpinLockAtDpcLevel的程序必须运行在DISPATCH_LEVEL上。在多核处理器(Windows2003)下先来查看一下KeAcquireSpinLockAtDpcLevel的汇编代码nt!KeAcquireSpinLockAtDpcLevel: mov原创 2012-04-10 14:26:14 · 1432 阅读 · 0 评论 -
Windows 自旋锁分析(三)
4,KeAcquireSpinLockRaiseToDpc的实现机制在MSDN上是这么说的:调用KeAcquireSpinLockRaiseToDpc的程序必须运行在IRQLKeAcquireSpinLockRaiseToDpc和KeAcquireSpinLock具有同样的功能,但是比KeAcquireSpinLock具有更高的效率。下面将着重关注KeAcquireSpinLo原创 2012-04-10 14:26:45 · 1086 阅读 · 0 评论 -
Windows 自旋锁分析(四)
5,KeAcquireInStackQueuedSpinLock的实现机制 在单核处理器(WindowsXP)下观察KeAcquireInStackQueuedSpinLock的实现hal!KeAcquireInStackQueuedSpinLock: mov eax,dword ptr ds:[FFFE0080h] shr eax,4 mo原创 2012-04-10 15:27:27 · 1521 阅读 · 0 评论 -
城里城外看SSDT
引子2006年,中国互联网上的斗争硝烟弥漫。这时的战场上,先前颇为流行的窗口挂钩、API挂钩、进程注入等技术已然成为昨日黄花,大有逐渐淡出之势;取而代之的,则是更狠毒、更为赤裸裸的词汇:驱动、隐藏进程、Rootkit……前不久,我不经意翻出自己2005年9月写下的一篇文章《DLL的远程注入技术》,在下面看到了一位名叫L4bm0s的网友说这种技术已经过时了。虽然我也曾想过拟出若干辩解之词转载 2012-04-11 16:04:34 · 1205 阅读 · 0 评论 -
NTSYSAPI NTSTATUS NTAPI
NTSYSAPINTSTATUS PsLookupProcessByProcessId(IN ULONG ulProcId, OUT PEPROCESS * pEProcess);Winnt.h里有 #define NTSYSAPI DECLSPEC_IMPORT 。对于这么一个NativeAPI,我们使用前必须声明。使用NTSYSAPI表明P原创 2012-04-12 13:26:24 · 2056 阅读 · 0 评论 -
EnumProcesses函数
当你开发的软件在用户那里运行出错了,想怎么办呢?当然是希望把出错时候的运行环境信息生成报表,然后再Email回来查看了。这里就介绍一个函数可以把当时运行环境的进程全部找到,然后可以输出每个进程的信息。当然,这个函数也可以使用到杀病毒软件里,用来查看可疑的进程信息。函数EnumProcesses声明如下:BOOLWINAPIEnumProcesses ( DWORD原创 2012-04-12 16:00:11 · 4951 阅读 · 0 评论 -
C语言中extern关键字详解
内容清单:1. 用extern声明外部变量(1)在一个文件内声明的外部变量(2)在多个文件中声明外部变量(3)在多个文件中声明外部结构体变量2. 用extern声明外部函数3. 总结 1. 用extern声明外部变量定义:外部变量是指在函数或者文件外部定义的全局变量。外部变量定义必须在所有的函数之外,且只能定义一次。(1) 在一个文件内声明的外转载 2012-04-11 17:34:29 · 786 阅读 · 0 评论 -
x86的控制寄存器CR0,CR1,CR2,CR3
状态和控制寄存器组除了EFLAGS、EIP ,还有四个32位的控制寄存器,它们是CR0,CR1,CR2和CR3。这几个寄存器中保存全局性和任务无关的机器状态。CR0中包含了6个预定义标志,0位是保护允许位PE(Protedted Enable),用于启动保护模式,如果PE位置1,则保护模式启动,如果PE=0,则在实模式下运行。1位是监控协处理位MP(Moniter coproc原创 2012-04-12 10:29:34 · 1370 阅读 · 0 评论 -
GetCurrentProcessID、OpenProcessToken、LookupPrivilegeValue、Adj...
GetCurrentProcessID 得到当前进程的ID OpenProcessToken 得到进程的令牌句柄LookupPrivilegeValue 查询进程的权限AdjustTokenPrivileges 判断令牌权限 要对一个任意进程(包括系统安全进程和服务进程)进原创 2012-04-12 16:37:09 · 925 阅读 · 0 评论 -
MFC中GetDlgItemText与GetDlgItemInt函数 -
GetDlgItemText 函数 用于获取对话框中指定控件的标题或文本。 UINT GetDlgItemText(HWND hDlg, int nIDDlgItem, LPTSTR lpString, int nMaxCount);hDlg 窗口的句柄。 nIDDlgItem 指定控件的标识符(ID)。 lpString 指向用于接收获取结果的缓冲区的指针。转载 2012-04-12 17:17:37 · 20941 阅读 · 0 评论 -
汇编指令sysenter 和sysexit这两条新汇编的解释
简单说来就是User模式向System模式的一种调用。做过Native API编程的话应该就知道,即使是看起来像内核的NTDLL.dll也只不过是Ring3级的,最终的系统调用是由ntoskrnl.exe程序向内核发送IO请求,然后内核与驱动程序返回执行结果。这个调用的中间步骤就是用SYSENTER和SYSEXIT来实现,以达到保护模式的作用。以下是转自优快云的一篇详细一点的文章。SY原创 2012-04-11 16:37:06 · 8652 阅读 · 0 评论 -
cli/sti 用法
cli 禁止中断发生sti 允许中断发生在对 ss 和sp操作的时候, 如果有中断发生,中断的保存现场的操作是将相关寄存器值保存到ss:sp指向的地址.如果ss 或者sp没有完成赋值操作, 这时候ss:sp指向的地址则是不期望的地方. 如果将系统或者其他应用的数据覆盖,会导致系统/应用崩溃. 下面是两条规则: 1)在改变ss:sp之前,必须用cli指令屏蔽中断原创 2012-04-12 10:34:04 · 1186 阅读 · 0 评论 -
内核函数系列
如果我们了解系统调用表有关知识,也已知道如何拦截系统调用表中的函数,那么下面,我们再来了解一下我们要钩取的函数:目标函数。这方面,如果我们不仅了解系统调用表中有哪些函数,还知道这些函数的工作机制就最好了。但实际上,ntdll.dll 中的导出函数有好几百个,别说一个一个的探究,就是把它们都列出来,看着看着头都大了。幸运的是,我们不必了解每个函数,只要了解其所在的系列就行了。为什么这么说?因为微软已原创 2012-04-12 11:46:55 · 1278 阅读 · 0 评论 -
wcslen与lstrlen如何区别
size_t strlen( const char *string ); size_t wcslen( const wchar_t *string ); int lstrlen( LPCTSTR lpString // string to count ); strlen()返回ANSI字符串长度; wcslen()返回宽字符串长度; lstrlen()依据字符转载 2012-04-13 11:06:42 · 1875 阅读 · 0 评论 -
Sleep、SleepEx
Sleep和 SleepEx函数的功能是在指定的执行时间内中止所在线程的执行。SleepEx扩展了Sleep的功能,在最短超时时间间隔已到的情况下恢复线程执行外,在以下两种情况下发生时也可以恢复执行:I/O完成回调函数被调用、异步过程调用(APC)被安排进入线程中。函数原型:VOID WINAPI Sleep( DWORD dwMillseconds);DWORD WIN原创 2012-04-13 13:27:52 · 7637 阅读 · 0 评论 -
#ifdef __cplusplus 倒底是什么意思?
时常在cpp的代码之中看到这样的代码: #ifdef __cplusplus extern "C" { #endif //一段代码 #ifdef __cplusplus } #endif 这样的代码到底是什么意思呢?首先,__cplusplus是cpp中的自定义宏,那么定义了这个宏的话表示这是一段cpp的代码,也就是说,上面的代码的含义是:如果这是一段cpp的代原创 2012-04-13 14:01:33 · 503 阅读 · 0 评论 -
一个简单的NT驱动之创建设备对象函数(CreateDevice)
/***************************************************************** 函数名称:CreateDrivce* 功能描述:初始化设备对象* 参数列表: pDriverObject:从I/O管理器中传进来的驱动对象* 返回值:返回初始化状态*************************************原创 2012-04-13 17:16:43 · 1970 阅读 · 0 评论 -
RemoveHeadList 宏定义
如果查看DDK头文件,会发现有几个内核函数是以宏的方式实现的。这种宏中有几个宏的定义是相当糟糕的。例如,我们看到RemoveHeadList的定义如下:#define RemoveHeadList(ListHead) (ListHead)->Flink; {RemoveEntryList((ListHead)->Flink)}如果以以下方式调用Rem原创 2012-04-13 15:20:47 · 1869 阅读 · 0 评论 -
用C语言编写复杂的中断干扰处理器
当从外部的硬件或者处理器向CPU发出异常信号的时候,中断就会发生了。CPU通过传递执行流来响应中断服务程序,其中CPU响应的过程是这样的:首先对事件进行处理,处理之后再返回中断代码。ISR本质上是一个不设任何参数和不返回任何值得函数。但是,和一般的规则函数不一样,你几乎可以在任何情况下调用ISR函数,因此在调用的时候要特别小心,特别是登陆和退出ISR函数时,要严格按照特定的执行规则和执行顺序来原创 2012-04-13 17:41:02 · 1007 阅读 · 0 评论 -
PE文件格式与API HOOK
对于windows低层编程来说,进行API拦截始终是一件让人激动的事,用自己的代码来改变其它程序的行为,还有比这个更有趣吗?而且,在实现API拦截的过程中我们还有机会去熟悉许多在RAD编程环境中很少接触的东西,如DLL远程注入、内存管理,PE文件格式等知识。许多商业软件,如金山词霸等词典软件,各种即时汉化软件、甚至一些网络游戏的外挂中都用到了这种技术,各种调试工具中多多少少也要用到这种技术。实原创 2012-04-27 10:15:25 · 604 阅读 · 0 评论 -
IoGetDeviceObjectPointer
从名字获得设备对象在知道一个设备名字的情况下,使用函数IoGetDeviceObjectPointer可以获得这个设备对象的指针。这个函数的原型如下:NTSTATUS IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName,IN ACCESS_MASK DesiredAccess,OUT PFILE_OBJE原创 2012-04-16 16:33:51 · 6462 阅读 · 0 评论 -
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 · 7015 阅读 · 0 评论 -
关于MDL的一些事情
微软的文档里对MDL的描述感觉语焉不详,这两天在找工作的间隙逆向+黑盒测试了一下MmBuildMdlForNonPagedPool,把得到的一些理解描述下来。一.MDL数据结构 MDL是用来建立一块虚拟地址空间与物理页面之间的映射,结构定义如下: [cpp] view plaincopytypedef struct _MDL { struc原创 2012-04-16 17:31:03 · 5420 阅读 · 0 评论 -
入门笔记 - IoCallDriver
分层驱动概念略。设备挂载指的是将一个设备A挂载到一个设备栈中的顶层设备B上面,从而使得发向原来设备栈中顶层设备B的IRP,会先发到A中,在A里面可以过滤一些IRP数据,达到过滤的目的。[详细见驱动开发详解12章]当应用程序发向原先的设备的IRP,会先发向过滤设备里,在过滤设备处理IRP时1、可以调用IoCompleteRequest函数,直接结束IRP请求,这样就会使得IRP不能到达底层驱原创 2012-04-16 18:07:44 · 2145 阅读 · 0 评论 -
驱动杂记1:对驱动对象,设备对象,设备栈的理解
Windows内核采用的是面向对象的编程方式,但使用的确是C语言。Windows内核认为许多东西都是“对象”,比如一个驱动一个文件一个设备,“对象”相当于一个基类。 一个驱动对象代表了一个驱动程序,或者说一个内核模块。驱动对象结构如下:typedef struct _DRIVER_OBJECT{//结构的类型和大小CSHORT Type;CSHORT Size;..原创 2012-04-16 18:18:09 · 1615 阅读 · 0 评论 -
通俗解析IRP和I/O设备栈在内核程序中的作用(转自看雪)
正文:言归正传,所有的I/O请求都是以IRP(I/O请求包)的形式来提交的,同时内核程序的所有分发函数(Dispatch Function)的第二个参数都是PIRP(也即是指向IRP的指针)。为了说明问题,防止跳跃性太大,先解释几个名词(都按自己理解的),可以帮助会的人复习,不会的人学习1:DRIVER_OBJECT:驱动对象,由即插即用管理创建和传递到DriverEntr原创 2012-04-16 18:16:20 · 3288 阅读 · 1 评论 -
驱动杂记2:分层驱动,IRP ,I/O堆栈初步印象
分层驱动是指两个或者两个以上的驱动程序,他们分别创建设备对象,并且形成一个由高到低的设备对象栈。IRP请求一般会被传送到设备栈的最顶层设备对象,顶层设备对象可以选择直接结束IRP请求,也可以选择将IRP请求向下层设备转发。如果是向下层设备转发,当IRP请求结束时,IRP会顺着设备栈的反方向原路返回。当得知下层驱动程序已经结束IRP请求时,本层设备对象可以选择继续向上返回,也可以重新原创 2012-04-16 18:18:53 · 1719 阅读 · 0 评论 -
内核API笔记之IoBuildPartialMdl
IoBuildPartialMdlVOID IoBuildPartialMdl( __in PMDL SourceMdl, __inout PMDL TargetMdl, __in PVOID VirtualAddress, __in ULONG Length );驱动程序可以使用IoBuildPartialMdl来把一个IR原创 2012-04-17 10:31:18 · 1646 阅读 · 0 评论 -
内核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 · 603 阅读 · 0 评论 -
IoCopyCurrentIrpStackLocationToNext
关于将本层的IO_STACK_LOCATION拷贝到下一层的两种方法 方法一:调用MS提供的标准方法IoCopyCurrentIrpStackLocationToNext(...) 方法二:C++代码PIO_STACK_LOCATION IrpSp; PIO_STACK_LOCATION NextIrpSp; IrpSp = IoGet转载 2012-04-17 10:51:21 · 1675 阅读 · 0 评论 -
深入理解 ZwCreateFile
前言:任何编码的东西必须充分的了解规则!我试探性的搜索了下关于这个native api的相关的问题,很郁闷的发现,这些问题90%都是没有真正理解了这个函数导致的!有的人连函数干嘛的都不知道就着急的写驱动,真是不可一世!所谓兼收并蓄为的是厚积薄发,其间如履薄冰。说的很贴切!对此我一直支持achills师傅的思想!搞明白了最基本的和必须的东西,一切后续的东西迎刃而解!这个文章我没有原创 2012-04-16 11:20:48 · 8379 阅读 · 0 评论 -
内核编程笔记
1,字符串操作UNICODE_STRING //UNICODE_STRING结构体ANSII_STRINGRTL_CONSTANT_STRING(); //UNICODE_STRING初始化RtlCopyUnicodeString() //UNICODE_STRING复制RtlxxxUnicodeString(); //UNICODE_STRING操作NTSTATUS; /原创 2012-04-16 14:03:08 · 1308 阅读 · 0 评论 -
高手进阶windows内核定时器之一
谈到定时器在ring3下有一个,启动和关闭都比较简单,通过两个api函数SetTimer和KillTimer来完成的。对于ring0中的定时器,稍微复杂一些。Ring0 下的定时器有两个,今天我们先看一个。即:利用I/O定时器例程实现的。用于进行固定的1秒时间间隔的操作定时。对应的函数有三个。 在IoInitializeTimer 函数中,我们设置回调函数,回调函数定原创 2012-04-16 14:07:04 · 1839 阅读 · 0 评论 -
高手进阶windows内核定时器之一
windows内核定时器,定时最小单位为100ns. 比ring3的定时器要精准得多,并且使用它,稳定性高,系统开销小,无需消息队列,且功能强大,是作为数据采集绝好的定时器。( ,有点像高钙片的广告词)这个内核定时器,涉及到三个函数,分别是KeInitializeTimerEx,KeCancelTimer和KeSetTimerEx。下面我们使用windbg这个工具,来进一步看看这三个函数的原创 2012-04-16 14:10:08 · 3769 阅读 · 1 评论 -
IoCallDriver函数与PoCallDriver函数
今天看书的时候看到了这两个函数,开始还没在意,以为是同一个,功能应该一样。后来想想一样的干嘛还弄两个呢,于是就查了一下,发现这两个函数差别还蛮大的。首先来看这两个函数的原型:[cpp] view plaincopyNTSTATUS IoCallDriver( IN PDEVICE_OBJECT DeviceObject, IN OUT原创 2012-04-16 16:11:30 · 1735 阅读 · 0 评论 -
MDL 数据结构
《Windows驱动开发技术详解》中说在使用直接方式来读写设备的时候,操作系统会将用户模式下的缓冲区锁住,然后操作系统将这段缓冲区在内核模式地址再次映射一遍。这样,用户模式的缓冲区和内核模式的缓冲区都使用的是同一块物理内存,无论操作系统如果切换进程,内核模式的地址都保持不变。操作系统先将用户模式的地址锁定后会使用MDL来记录这片内存。被记录的内存在物理内存上可能是离散的,但是在虚拟内存上一原创 2012-04-16 17:23:43 · 3045 阅读 · 0 评论