注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

NtOpenProcess  

2012-03-18 13:50:07|  分类: window驱动学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
/***************************************************************************************
* AUTHOR : pandazheng
* DATE   : 2012-3-18
* MODULE : NtOpenProcess.C
* Command: 
* Source of IOCTRL Sample Driver
*
* Description:
* Demonstrates communications between USER and KERNEL.
*
****************************************************************************************
* Copyright (C) 2010 pandazheng.
****************************************************************************************/
#include <ntddk.h>
#include <windef.h>
#include <ntstatus.h>
ULONG CROVALUE;
BYTE OriginalBytes[5] = {0}; //保存原来五个字节
BYTE JmpAddress[5] = {0xE9,0,0,0,0}; //跳转到HOOK函数的地址
extern POBJECT_TYPE *PsProcessType;

typedef NTSTATUS (__stdcall *NTOPENPROCESS)(
OUT PHANDLE,
IN ACCESS_MASK AccessMask,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId);

/*Hook函数*/
NTSTATUS __stdcall MyNtOpenProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK AccessMask,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId);

NTSTATUS __stdcall OriginalNtOpenProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK AccessMask,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId)
{
return STATUS_SUCCESS;
}

NTSTATUS MyNtOpenProcess(
OUT PHANDLE ProcessHandle, 
IN ACCESS_MASK AccessMask, 
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId)
{
NTSTATUS ntStatus;
ULONG PID;

DbgPrint("NtOpenProcess Called...\n");

ntStatus = (NTSTATUS)OriginalNtOpenProcess(
ProcessHandle,
AccessMask,
ObjectAttributes,
ClientId);

if (ClientId != NULL)
{
PID = (ULONG)ClientId->UniqueProcess;

//如果进程PID是1124,直接返回权限不足,并将句柄设置为空
if (PID == 1124)
{

ProcessHandle = NULL;

ntStatus = STATUS_ACCESS_DENIED;
}
}

return ntStatus;
}

VOID HookNtOpenProcess()
{
//赋值前面定义的数组
KIRQL Irql;
DbgPrint("[NtOpenProcess:0x%x",NtOpenProcess);
DbgPrint("[MyNtOpenProcess:0x%x",MyNtOpenProcess);

//保存函数前五个字节内容
RtlCopyMemory(OriginalBytes,(BYTE*)NtOpenProcess,5);
//保存新函数前五个字节后偏移
*(ULONG*)(JmpAddress+1) = (ULONG)MyNtOpenProcess - ((ULONG)NtOpenProcess+5);

//开始HOOK
__asm
{
cli
mov eax,cr0
and eax,0fffeffffh
mov cr0,eax
}

/*提升IRQL中断级*/
Irql = KeRaiseIrqlToDpcLevel();

/*函数开头五个字节写JMP*/
RtlCopyMemory((BYTE*)NtOpenProcess,JmpAddress,5);

DbgPrint("JmpAddress:0x%x",JmpAddress);
DbgPrint("[MyNtOpenProcess]:0X%x",MyNtOpenProcess);


/*恢复IRQL中断级*/
KeLowerIrql(Irql);

__asm
{
mov eax,cr0
or eax,10000h
mov cr0,eax
sti
}
}

VOID UnHookNtOpenProcess()
{
/*把五个字节再写回到原函数*/
KIRQL Irql;

__asm
{
cli
mov eax,cr0
and eax,0fffeffffh
mov cr0,eax
}

/*提升IRQL中断级*/
Irql = KeRaiseIrqlToDpcLevel();

RtlCopyMemory((BYTE*)NtOpenProcess,OriginalBytes,5);

/*恢复IRQL*/
KeLowerIrql(Irql);

__asm
{
mov eax,cr0
or eax,10000h
mov cr0,eax
sti
}
}

VOID DriverUnload(IN PDRIVER_OBJECT pDriverObject)
{
UnHookNtOpenProcess();
DbgPrint("DriverUnload...\n");
}

NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath)
{
pDriverObject->DriverUnload = DriverUnload;

HookNtOpenProcess();
return STATUS_SUCCESS;
}
  评论这张
 
阅读(216)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017