驱动课件1.rtf

上传人:11****ws 文档编号:2405357 上传时间:2019-05-11 格式:RTF 页数:55 大小:181.07KB
下载 相关 举报
驱动课件1.rtf_第1页
第1页 / 共55页
驱动课件1.rtf_第2页
第2页 / 共55页
驱动课件1.rtf_第3页
第3页 / 共55页
驱动课件1.rtf_第4页
第4页 / 共55页
驱动课件1.rtf_第5页
第5页 / 共55页
点击查看更多>>
资源描述

1、2.5、再谈SSDT HOOK驱动保护原理-31课A、初识内核进程相关结构B、内核函数PsGetCurrentProcessC、进程保护原理D、实例测试dd nt!KeServiceDescriptorTableNTSTATUS NtOpenProcess(_out PHANDLE ProcessHandle, /回传参数。_in ACCESS_MASK DesiredAccess, /访问权限_in POBJECT_ATTRIBUTES ObjectAttributes, /属性描述符_in_opt PCLIENT_ID ClientId /是一个结构 包含 一个_CLIENT_ID 结构)

2、;HANDLE OpenProcess( /回传参数 对应此项 out DWORD dwDesiredAccess, / access flag /访问权限 对应此项BOOL bInheritHandle, / handle inheritance option /属性描述符 对应用户层此项DWORD dwProcessId / process identifier );typedef struct _CLIENT_ID HANDLE UniqueProcess;/进程PIDHANDLE UniqueThread; /线程PID CLIENT_ID;dt_CLIENT_IDdt _eproce

3、ss /此结构未公开无法查看具体内容可以通过双机调试器 查看: 命令 dt _ERROCESS 可以看到里面很多属项dt _CLIENT_ID 即可看到结构内容 不过这个只有两项;dt _CLIENT_IDdt _eprocess /此结构为公开无法查看具体内容;可以 过双机调试查看 命令:dt _ERROCESS dt -v -r _eprocess ( -v -r 结构)MyNtOpenProcess() 开进程是 保护 ProcessHandle=NULL:传 用户层OpenProcess参数为 N LL 即无法 开对 不是 :调用 实 NtOpenProcess 函数 ProcessH

4、andle=NtOpenProcess()/HANDLE hProcess#pragma once#ifdef _cplusplusextern “C“#endif#include /这里包含 用C #ifdef _cplusplus#endif #include bool ssdthook_flag=false;extern “C“ extern PServiceDescriptorTable KeServiceDescriptorTable;/extern “C“ NTSTATUS _stdcall PsLookupProcessByProcessId( IN ULONG ulProcId

5、, OUT PEPROCESS *pEProcess ); / 面 不:/ 一 NtOpenProcess 原结构 extern “C“ typedef NTSTATUS (_stdcall NTOPENPROCESS)( OUT PHANDLE ProcessHandle, IN ACCESS_MASK AccessMask, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId );NTOPENPROCESS * RealNtOpenProcess; /一个currency1“ 实 NtOpenProcess函数 PE

6、PROCESS EP;/ 实 函数 ULONG RealServiceAddress; HANDLE MyPID; / 保护 进程ID/ NtOpenProcess函数 #pragma PAGECODE/*/这里是 fiflHOOK 函数 。extern “C“ NTSTATUS _stdcall MyNtOpenProcess( OUT PHANDLE ProcessHandle, IN ACCESS_MASKDesiredAccess, IN POBJECT_ATTRIBUTESObjectAttributes, IN PCLIENT_ID ClientId ) NTSTATUS rc;

7、HANDLE PID; KdPrint(“+Entry MyNtOpenProcess int +n“);rc = (NTSTATUS)RealNtOpenProcess( ProcessHandle, DesiredAccess, ObjectAttributes, ClientId ); / rc里“ 实 NtOpenProcess函数;/ 面i PID 是不是 保护 是: rc STAT S_ACCESS_DENIED / 不是: 不rc 回 ”是 实 NtOpenProcess函数;if( (ClientId != NULL) ) /查PID 不为N LL PID = ClientId

8、-UniqueProcess; / 程 fi 开 PID 面 查这个PID 是不是 fi 保护 PIDKdPrint( “- PID=%d-n“,(int*)PID );/ 是保护 PID 回权限不 为 if(PID = MyPID) / 是 保护 PID 面” 函数回 ProcessHandle 传 为N LL KdPrint( “+保护进程 MyPID=%d+n“,MyPID );ProcessHandle = NULL; /这个是关rc = STATUS_ACCESS_DENIED; /rc 不回 实 NtOpenProcess函数、 到HOOK /PsLookupProcessByPr

9、ocessId(ULONG)PID,EP=PsGetCurrentProcess(); KdPrint(“AAAAAAAAAAAAAAAAAAAAAAAAAAAAA ACESS Process Name -:%s- AAAAAAAAAAAAAAAAAA n“,(PTSTR)(ULONG)EP+0x174);KdPrint( “+=+n“ ); return rc; #pragma PAGECODEVOID Hook() KdPrint(“+HOOK START +-n“);LONG *SSDT_Adr,SSDT_NtOpenProcess_Cur_Addr,t_addr; KdPrint(“驱

10、动 .n“);/ SSDT 为0x7A 函数/poi(poi(KeServiceDescriptorTable)+0x7a*4)t_addr=(LONG)KeServiceDescriptorTable-ServiceTableBase;KdPrint(“ ServiceTableBase为%x n“,t_addr);SSDT_Adr=(PLONG)(t_addr+0x7A*4);KdPrint(“ t_addr+0x7A*4=%x n“,SSDT_Adr); SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr; RealServiceAddress = *SSDT_A

11、dr; RealNtOpenProcess = ( NTOPENPROCESS *)RealServiceAddress; KdPrint( “ 实 NtOpenProcess: %xn“,(int) RealServiceAddress ); KdPrint(“ NTOpenProcess: %xn“, (int)MyNtOpenProcess ); _asm / 面保护climov eax,cr0and eax,not 10000h /and eax,0FFFEFFFFhmov cr0,eax*SSDT_Adr= (ULONG)MyNtOpenProcess; /这 关 是 fl 函数 S

12、SDT 原 函数 “/ 程 进 SSDT 对应 函数”进到 fifl 函数 到HOOK 用 _asm mov eax, cr0 or eax, 10000h mov cr0, eax sti return; / #pragma PAGECODEVOID UnHook() ULONG Old_ssdt; Old_ssdt = (ULONG)KeServiceDescriptorTable-ServiceTableBase + 0x7A * 4; if (ssdthook_flag) ssdthook_flag=false;_asm cli mov eax, cr0 and eax, not 10

13、000h mov cr0, eax / 原SSDT *(ULONG*)Old_ssdt) = (ULONG)RealServiceAddress; _asm mov eax, cr0 or eax, 10000h mov cr0, eax sti KdPrint(“UnHook 原SSDT OK n“); return;de ine oo_code CTL_CODE ILE_DEICE_ NKNO N 2 ETHOD_NEITHER ILE_AN _ACCESS de ine unoo_code CTL_CODE ILE_DEICE_ NKNO N 3 ETHOD_NEITHER ILE_AN

14、 _ACCESS 2. 、fl驱动保护 进程 HOOK SSDT -32课A、构 内核函数 用 对应 内核函数 C、Hoo nHoo函数构D、E ES S对应 实 fi 保护E、测试 一、以2 课 为例 一个oo. 元#pragma once#ifdef _cplusplusextern “C“#endif#include /这里包含 用C #ifdef _cplusplus#endif /#include bool ssdthook_flag=false;ULONG RealNtOpenAddress; HANDLE MyPID; /局变量 保护 PID 是 过用户层传过 / A、构 内核函

15、数 用 对应 内核函数 / 一 NtOpenProcess 原/了预 个函数结构 typedef extern “C“ typedef NTSTATUS _stdcall NTOPENPROCESS ( OUT PHANDLE ProcessHandle, IN ACCESS_MASK AccessMask, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId );/一个函数 currency1NTOPENPROCESS * RealNtOpenProcess; PEPROCESS EP;/ NtOpenProcess函

16、数 原:ZwOpenProcess#pragma PAGECODEextern “C“ NTSTATUS _stdcall MyNtOpenProcess( OUT PHANDLE ProcessHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId ) NTSTATUS rc; HANDLE PID; KdPrint(“+Entry MyNtOpenProcess int +n“); /RealNtOpenProcess 面了函数结构 面可以这用;

17、rc = (NTSTATUS)RealNtOpenProcess( ProcessHandle, DesiredAccess, ObjectAttributes, ClientId ); /RealNtOpenProcess 是*SSDT_Adr保 一个 ”是 NtOpenProcess在SSDT里 ;/ProcessHandle回传 是一个:/rc 回传 是一个访问权限if( (ClientId != NULL) ) PID = ClientId-UniqueProcess; /传进 PID 是NtOpenProcess第四个参数KdPrint( “- PID=%d-n“,(int*)PID

18、 );/ 是保护 PID 拒绝访问 为 if(PID = MyPID) /MyPID 局变量 保护 程 PID 通过用户层传过 KdPrint(“保护进程 MyPID=%d n“,(int)MyPID);/调试输出 类似C语言 PrintfProcessHandle = NULL; /这个是关 进程 rc = STATUS_ACCESS_DENIED; /这个回 STATUS_ACCESS_DENIED 拒绝访问/PsLookupProcessByProcessId(ULONG)PID,EP=PsGetCurrentProcess();/ 这个函数 能是 调用NtOpenProcess函数进程

19、 一个结构/而这个结构 + 174 ”是进程名KdPrint(“ ACESS Process Name -:%s- n“,(PTSTR)(ULONG)EP+0x174);/ 面两”是 印出 访问 保护进程 进程名字; return rc; /HOOK 函数构#pragma PAGECODEVOID Hook() ssdthook_flag=true;/ HOOK标志KdPrint(“+HOOK START +-n“);LONG *SSDT_Adr,SSDT_NtOpenProcess_Cur_Addr,t_addr; KdPrint(“驱动 .n“);/ SSDT 为0x7A 函数/poi(p

20、oi(KeServiceDescriptorTable)+0x7a*4)t_addr=(LONG)KeServiceDescriptorTable-ServiceTableBase;SSDT_Adr=(PLONG)(t_addr+0x7A*4);SSDT_NtOpenProcess_Cur_Addr=*SSDT_Adr; RealNtOpenAddress = *SSDT_Adr; RealNtOpenProcess = ( NTOPENPROCESS *)RealNtOpenAddress; KdPrint( “ 实 NtOpenProcess: %xn“,(int) RealNtOpenA

21、ddress ); KdPrint(“ NTOpenProcess: %xn“, (int)MyNtOpenProcess ); _asm / 面保护climov eax,cr0and eax,not 10000h /and eax,0FFFEFFFFhmov cr0,eax/ fl 函数 fl人到 HOOK * SSDT_Adr是SSDT NtOpenProcess 在 面;*SSDT_Adr= (ULONG)MyNtOpenProcess; /SSDT HOOK 以 用 是JP 跳转到HOOK 称为内联HOOK/这种称为IAT HOOK是通过SSDT _asm mov eax, cr0 o

22、r eax, 10000h mov cr0, eax sti return; /UnHook函数构/ / 面是 原HOOK 是通过另种 ;注意比较两种 不 ;#pragma PAGECODEVOID UnHook() ULONG Old_ssdt; Old_ssdt = (ULONG)KeServiceDescriptorTable-ServiceTableBase + 0x7A * 4; if (ssdthook_flag) /ssdthook_flag HOOK标志 很 预防没有HOOK 反而调用了 面 会出问题 者 蓝屏; ssdthook_flag=false;_asm cli mov

23、 eax, cr0 and eax, not 10000h mov cr0, eax / 原SSDT *(ULONG*)Old_ssdt) = (ULONG)RealNtOpenAddress; _asm mov eax, cr0 or eax, 10000h mov cr0, eax sti KdPrint(“UnHook 原SSDT OK n“); return;二、ctl_code.h /ctl_code.h :/郁金香灬外挂技术 QQ150330575/ 面是第3 课 :#ifndef CTL_CODE#pragma message(“n n-EXE模 Include winioct

24、l.h “)#include /CTL_CODE ntddk.h wdm.h#else #pragma message(“-n n-SYS模 NO Include winioctl.h “)#endif#define add_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800,METHOD_BUFFERED,FILE_ANY_ACCESS)#define sub_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801,METHOD_BUFFERED,FILE_ANY_ACCESS)#define hook_code CTL_CODE(FI

25、LE_DEVICE_UNKNOWN, 0x802,METHOD_BUFFERED,FILE_ANY_ACCESS)#define unhook_code CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803,METHOD_BUFFERED,FILE_ANY_ACCESS)/在.CPP CASE :case oo_code:/这里用做用户层 数据传到驱动 局变量:/从bu er yPid 缓冲区数据 InputBu er 向驱动 输数据int * InputBu er int * pIrp-AssociatedIrp.SystemBu er;_asmmov ea InputBu

26、 ermov eb ea mov yPID eb /yPID 是驱动 局变量 ”是传 PID 在HOOK里保护 PID做比较int * OutPutBu er int * pIrp-AssociatedIrp.SystemBu er;_asmmov ea 1mov eb OutPutBu ermov eb ea /这里” 回了”回 1;in o 4 ;Hoo ;brea;case unoo_code:nHoo ;/在退出 时候没用调用 nHoo ; 在DDK_ nload 函数 nHoo 函数;brea;三、EXE部分 四、SYS部分 2. 、内管理相关内核API-34课A、RtlCopyem

27、ory RtlCopyBytesRtloveemoryC、RtlZeroemoryRtlillemoryD、RtlEqualemoryE、E AllocatePool E reePool、 newdelete操 符RtlCopyemory/把Source开始 长度为Length这块内数据 复制到DestinationVOID RtlCopyMemory( _in VOID UNALIGNED *Destination, /Destination 目 /UNALIGNED 在IA64 (64位平台) 逐字节对齐 #pragma packed(1) byte/UNALIGNED 也是一个宏 是不对

28、齐 一种 在32位系统 也相 于一个 宏/OID 类没限制; _in const VOID UNALIGNED *Source, /Source _in SIZE_T Length /Length 拷贝 数据长度!);/RtlCopyBytes 函数 不论能 参数 都RtlCopyMemory 一RtlCopyBytes /memcpyVOID RtlCopyBytes( _in PVOID Destination, _in const VOID *Source,_in SIZE_T Length);/ 面 两个函数 都是用于连续 复制 拷贝 / 面 Rtloveemory函数 可以用于不连续

29、 复制Rtloveemory / 叠内 A B C D p1AD p2BC/ memmove 宏 VOID RtlMoveMemory( _in VOID UNALIGNED *Destination,_in const VOID UNALIGNED *Source, _in SIZE_T Length);RtlZeroemory /清零内块 清零长度为LengtVOID RtlZeroMemory(_in VOID UNALIGNED *Destination, _in SIZE_T Length); /字节清零内块长度Rtlillemory/为字符 ill填充Destination 填充长

30、度为LengthVOID RtlFillMemory(_in VOID UNALIGNED *Destination, _in SIZE_T Length, _in UCHAR Fill);/file 一般多为 RtlEqualemory /比较内块source1Source2 长度为Length这个范围内是否相等LOGICAL RtlEqualMemory( /LOGICAL 回一个无符号 整形_in const VOID *Source1, _in const VOID *Source2, _in SIZE_T Length);SIZE_T RtlCompareMemory( 比较内块so

31、urce1Source2 长度为Length范围 大小等出回 _in const VOID *Source1, _in const VOID *Source2, _in SIZE_T Length);E AllocatePool/一个内块 PoolType 大小为 NumberO BytesPVOID ExAllocatePool( _in POOL_TYPE PoolType, /POOL_TYPE 面有 出 范围_in SIZE_T NumberOfBytes);E reePool/ “内块currency1P VOID ExFreePool( _in PVOID P);newdelete

32、操 符/ newvoid * _cdecl operator new(size_t size,POOL_TYPE PoolType=PagedPool)KdPrint(“global operator newn“);KdPrint(“Allocate size :%dn“,size);return ExAllocatePool(PagedPool,size);/ delete void _cdecl operator delete(void* pointer)KdPrint(“Global delete operatorn“);ExFreePool(pointer);The POOL_TYPE

33、 enumeration type specifies the type of system memory to allocate.SyntaxCopytypedef enum _POOL_TYPE NonPagedPool = 0, /不分 PagedPool = 1, /分 NonPagedPoolMustSucceed = 2, /分 分 内 。DontUseThisType = 3, /未 系统 用NonPagedPoolCacheAligned = 4,/ 分 内 内 对齐。PagedPoolCacheAligned = 5,/分 内 内 对齐。NonPagedPoolCacheAl

34、ignedMustS = 6 /分 分 内 内 对齐 。 POOL_TYPE;#define RtlCopyBytes RtlCopyMemory#define RtlZeroBytes RtlZeroMemory#define RtlFillBytes RtlFillMemory_unaligned 关字会 currency1逐字节 #pragma packed(1)2. .1在 识 结构e e部分-35课A、 结构 B、 初始 C、在 数据 结 D、 :有 向 也有双向 有 形 在这里 只 论 双向 。双向 也 双 是 一种 个数据结 都有两个currency1 分 向 驱。fi以 从双向 意一个结 开始 都可以很 访问 驱结 结 。一般 都构 双向 。识 结构/ 结构typedef struct _DATALINKstruct _DATALINK *R;/这里两个currency1R L 是向 类结构 fi有用struct node结构类struct _DATALINK *L; / 是也可以用int类 制转int data;*PDATALINK,DATALINK;PDATALINK head=new DATALINK;/初始 head-L=head-R=head; 双currency1都向 也是 初始

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育教学资料库 > 精品笔记

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。