
windows内核
z6470975
这个作者很懒,什么都没留下…
展开
-
通俗解析IRP和I/O设备栈在内核程序中的作用(转自看雪)
正文:言归正传,所有的I/O请求都是以IRP(I/O请求包)的形式来提交的,同时内核程序的所有分发函数(Dispatch Function)的第二个参数都是PIRP(也即是指向IRP的指针)。为了说明问题,防止跳跃性太大,先解释几个名词(都按自己理解的),可以帮助会的人复习,不会的人学习1:DRIVER_OBJECT:驱动对象,由即插即用管理创建和传递到DriverEntr转载 2012-01-09 13:08:09 · 1854 阅读 · 0 评论 -
about EThread
kd> dt _eprocess 816d7170nt!_EPROCESS +0x000 Pcb : _KPROCESS +0x06c ProcessLock : _EX_PUSH_LOCK +0x070 CreateTime : _LARGE_INTEGER 0x1cd4774`9491b86e +0x078 E原创 2012-06-11 10:57:00 · 687 阅读 · 0 评论 -
缓冲区方式与IRP的关系
缓冲区方式与IRP的关系如下:在驱动层,依传输类型的不同,输入缓冲区的位置亦不同,见下表。传输类型 位置METHOD_IN_DIRECT irp->AssociatedIrp.SystemBufferMETHOD_OUT_DIRECT irp->AssociatedIrp.S转载 2012-07-09 10:03:07 · 807 阅读 · 0 评论 -
一些原子操作函数
FORCEINLINELONGFASTCALLInterlockedExchange( IN OUT LONG volatile *Target, IN LONG Value ){ __asm { mov eax, Value mov ecx, Target xchg [ecx], eax原创 2012-07-14 22:55:26 · 617 阅读 · 0 评论 -
MyMemCpy_NoPaged
_declspec (naked) void __stdcall MyMemCpy_NoPaged(PVOID pDst, PVOID pSrc, ULONG count) { __asm { pushfd; pushad; cld; mov edi, [esp + 0x4 + 0x24]; mov esi, [esp + 0x8 + 0x24]; mov ecx, [原创 2012-07-14 22:05:52 · 584 阅读 · 0 评论 -
KdDisableDebugger
NTSTATUS KdDisableDebugger(VOID){ ULONG cl = 2; ULONG uIrql = KfRaiseIrql(cl); KdpPortLock(); if(KdDisableCount == 0) { if(KdDebuggerEnabled != 0 ) { KdPreviouslyEnabled = 1; if(KdPi原创 2012-08-02 23:48:22 · 199 阅读 · 0 评论 -
关于CF的TP禁止双机调试的一点记录
周末忽然蛋疼,无聊想看看TP,然后手头只有CF这么一个TX的游戏,所以就有了这一点点记录。禁止双机调试,基本是 KdDisableDebugger 这个内核API,首先看一下函数定义NTSTATUS KdDisableDebugger(void);因为参数木有,直接改ret TesSafe+0x59dd: b15479dd 75b0原创 2012-07-21 22:21:16 · 3095 阅读 · 0 评论 -
通过驱动名字获取驱动基址和大小
//////////////////////////////////////////////////////////////////////////// 名称: GetDriverBaseInfo// 说明: 根据驱动名称获取驱动对象信息: 驱动基址,驱动的大小// 备注: // email: cppcoffee@gmail.com////////////////////////////转载 2012-08-31 09:53:09 · 2268 阅读 · 0 评论 -
内核遍历PEB下的LDR模块表
系统:XP SP2可以通过EPROCESS ---> PEB ---> _PRB_LDR_DATA kd> dt _eprocessntdll!_EPROCESS +0x000 Pcb : _KPROCESS +0x06c ProcessLock : _EX_PUSH_LOCK +0x070 CreateTime原创 2012-09-18 15:51:26 · 2472 阅读 · 0 评论 -
InlineHook与UnHook
分享一个多核下的InlineHook与UnHook。XP SP3测试通过。如有朋友有问题,欢迎提出共同解决。.h文件#ifndef _INLINEHOOK_H_#define _INLINEHOOK_H_#include #pragma pack(1)typedef struct _SERVICE_DESCRIPTOR_TABLE{ unsigned int *Servic原创 2012-11-14 14:49:43 · 1763 阅读 · 1 评论 -
Idle进程相关的一些东西
Idle进程相关的一些东西 Idle进程和System进程一样,也是系统中的一个特殊进程,严格讲它不算是一个进 程,但是它有自己的EPROCESS,并有一个IdleThread.若说它算一个进程,它的进程空间、句柄表、Token等却又和System进程一样,即共享了System的内核数据,所以不能以常理对待之.关于Idle进程的两个问题:一.活动进程链上为何找不到I转载 2012-05-16 13:07:36 · 599 阅读 · 0 评论 -
SSDT HOOK的框架
#include #include "HookManager.h"VOID UnloadDriver(PDRIVER_OBJECT Driver){ KdPrint(("Unload Driver!\n")); if (NewSystemCallTable) { //此处UN_HOOK MmUnmapLockedPages(NewSystemCallTable,Kernel原创 2012-05-28 16:05:28 · 908 阅读 · 0 评论 -
驱动加载。
正常加载驱动的步骤如下: 1、调用OpenSCManager,打开SCM管理器。如果返回NULL,则返回失败,否则继续下一步; 2、调用CreateService创建服务,如果用GetLastError获取的返回值为ERROR_IO_PENDING,说明服务已经创建过,此时用OpenService打开此服务. 3、调用StartService开启服务OpenSCManager——>转载 2012-01-09 18:33:25 · 536 阅读 · 0 评论 -
驱动卸载
一、卸载驱动流程 1、用OpenSCManager函数打开服务控制管理器,取得SCM句柄,如果返回NULL,则结束,否则继续 2、用OpenService打开相应的服务,如果返回NULL,则结束,否则继续 3、用ControlService停止驱动服务,如果返回NULL,只有重新启动才能,再动态加载。 4、用DeleteService动态卸载驱动程序,如果返回NULL,则转载 2012-01-09 18:49:59 · 672 阅读 · 0 评论 -
遍历SSDT,检测是否被hook
此方法只是遍历SSDT,判断是否在ntkrnlpa.exe模块里面。也就是寻找SSDT导出NT函数的原始地址。此方法不适合检测 inline Hook。typedef struct _SYSTEM_MODULE_INFORMATION { ULONG Reserved[2]; PVOID Base; ULONG Size; ULONG Flags; USHORT Index原创 2012-04-03 01:44:56 · 2866 阅读 · 0 评论 -
驱动框架
头文件:#ifndef _CHECKSSDT_H_#define _CHECKSSDT_H_#include typedef enum _SYSTEM_INFORMATION_CLASS { SystemBasicInformation, // 0 Y N SystemProcessorInformation,原创 2012-04-02 03:02:21 · 748 阅读 · 0 评论 -
SSDT inline hook
********************************************************标题:【原创】SSDT Hook的妙用-对抗ring0 inline hook **作者:堕落天才 **日期:2007年3月10号转载 2012-03-17 19:35:30 · 801 阅读 · 0 评论 -
通过ZwQuerySystemInformation获取EPROCESS
google一下,发现很多都是直接通过ZwQuerySystemInformation通过11号获取进程结构SYSTEM_PROCESS_INFORMATION,对于详细的进程信息表达不够。所以想要通过这个来查看详细的 EPROCESS 结构。方法可以通过 PsLookupProcessByProcessId 这个函数来获取。函数原型在下面给出。typedef struct _SYSTEM原创 2012-04-19 23:46:16 · 4439 阅读 · 0 评论 -
object hook
object是什么东西?光从名字上面不难看出,对象。这篇是关于内核对象的hook,为什么要hook他呢,额,这个嘛。因人而异。看雪上面有很详细的说明,本菜鸟算是抄袭过来而已。版权归看雪所有。objectHook简单介绍windbg截图为XP SP3系统。_OBJECT_HEADER结构:typedef struct _OBJECT_HEADER原创 2012-04-21 02:22:00 · 4708 阅读 · 0 评论 -
R0取进程路径
eprocess->Peb->ProcessParameters->ImagePathName 环境:XP SP3 EPROCESS 结构kd> dt _eprocessnt!_EPROCESS +0x000 Pcb : _KPROCESS +0x06c ProcessLock : _EX_PUSH_LOCK原创 2012-04-23 23:32:01 · 917 阅读 · 0 评论 -
改变进程名
改变进程名。VOID NewName(UNICODE_STRING ProcessName){ ANSI_STRING OldProcessName; PLIST_ENTRY ActivEProcessLinks; PUNICODE_STRING FindProcessName; ULONG EPROCESS,PEPROCESS,FirstEProcess;转载 2012-05-28 13:35:04 · 1049 阅读 · 0 评论 -
关于蓝屏错误IRQL_NOT_LESS_OR_EQUAL
有一个驱动出现很几率性的蓝屏,蓝屏错误提示IRQL_NOT_LESS_OR_EQUAL,错误码0xa。0xa错误码一般都是访问非法内存所致,而IRQL_NOT_LESS_OR_EQUAL单从字面上面来看不难看出——在IRQL级别高的地方访问了分页内存。在内核编程中,核心栈只有大概两个页的大小,所以DDK文档中特意标注出,内核中不宜使用递归调用。通过ExAllocatePoolW原创 2013-02-03 10:37:59 · 18441 阅读 · 0 评论