首页 使用自旋锁的各种HOOK

使用自旋锁的各种HOOK

举报
开通vip

使用自旋锁的各种HOOK使用自旋锁的各种HOOK #include #define MEM_TAG 'TMEM' typedef struct _THREAD_BASIC_INFORMATION { NTSTATUS ExitStatus; PVOID TebBaseAddress; CLIENT_ID ClientId; KAFFINITY AffinityMask; KPRIORITY Priority; KPRIORITY BasePriority; }THREAD_BASIC_INFORMATION, *PTH...

使用自旋锁的各种HOOK
使用自旋锁的各种HOOK #include #define MEM_TAG 'TMEM' typedef struct _THREAD_BASIC_INFORMATION { NTSTATUS ExitStatus; PVOID TebBaseAddress; CLIENT_ID ClientId; KAFFINITY AffinityMask; KPRIORITY Priority; KPRIORITY BasePriority; }THREAD_BASIC_INFORMATION, *PTHREAD_BASIC_INFORMATION; typedef BOOL (*NTUSERPOSTTHREADMESSAGE) ( DWORD idThread, UINT Msg, WPARAM wParam, LPARAM lParam ); typedef NTSTATUS (*NTOPENPROCESS) ( OUT PHANDLE ProcessHandle, IN ACCESS_MASK AccessMask, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId ); typedef NTSTATUS (*NTOPENTHREAD) ( OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId ); typedef NTSTATUS (*NTDUPLICATEOBJECT) ( IN HANDLE SourceProcessHandle, IN HANDLE SourceHandle, IN HANDLE TargetProcessHandle, OUT PHANDLE TargetHandle OPTIONAL, IN ACCESS_MASK DesiredAccess, IN ULONG Attributes, IN ULONG Options ); NTKERNELAPI KeAddSystemServiceTable(PVOID, PVOID, PVOID, PVOID, PVOID); NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(IN HANDLE ProcessId,OUT PEPROCESS *Process); NTKERNELAPI NTSTATUS PsLookupThreadByThreadId(IN HANDLE ThreadId,OUT PETHREAD *Thread); NTKERNELAPI PEPROCESS IoThreadToProcess(IN PETHREAD Thread); NTSYSAPI NTSTATUS NTAPI ZwQueryInformationProcess ( IN HANDLE ProcessHandle, IN ULONG ProcessInformationClass, OUT PVOID ProcessInformation, IN ULONG ProcessInformationLength, OUT PULONG ReturnLength OPTIONAL ); NTSYSAPI NTSTATUS NTAPI ZwQueryInformationThread ( IN HANDLE ThreadHandle, IN ULONG ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL ); ULONG idPTM=476; //XP HARD CODE BYTE JmpCode[5]={0xE9,0x00,0x00,0x00,0x00}; BYTE OrgCode[5]={0x8B,0x3F,0x8B,0x1C,0x87}; BYTE PushRetCode[6]={0x68,0x00,0x00,0x00,0x00,0xc3}; KIRQL f_oldirql; KSPIN_LOCK f_spinlock; NTOPENTHREAD OldNtOpenThread; NTOPENPROCESS OldNtOpenProcess; NTDUPLICATEOBJECT OldNtDuplicateObject; NTUSERPOSTTHREADMESSAGE OldNtUserPostThreadMessage; ULONG uKiFastCallEntryAddr=0; ULONG HookAddr=0; ULONG JMPRet=0; ULONG PushRetMem=0; ULONG ppid=0; PEPROCESS ppep=NULL; PSYSTEM_SERVICE_TABLE KeServiceDescriptorTableShadow; extern PSYSTEM_SERVICE_TABLE KeServiceDescriptorTable; ULONG GetShadowTableAddress() { ULONG dwordatbyte,i; PUCHAR p = (PUCHAR) KeAddSystemServiceTable; for(i = 0; i < PAGE_SIZE; i++, p++)// 往下找一页 指针递增1 { __try { dwordatbyte = *(PULONG)p; } __except(EXCEPTION_EXECUTE_HANDLER) { return FALSE; } if(MmIsAddressValid((PVOID)dwordatbyte)) { if(memcmp((PVOID)dwordatbyte, KeServiceDescriptorTable, 16) == 0)//对比前16字节 相同则找到 { if((PVOID)dwordatbyte == KeServiceDescriptorTable)//排除自己 { continue; } return dwordatbyte; } } } return FALSE; } ULONG GetSSDTCurAddr(IN ULONG Index,BOOL IsShadow) { ULONG ServiceCount,BaseAddr; if (KeServiceDescriptorTableShadow!=NULL) { ServiceCount=KeServiceDescriptorTableShadow[IsShadow?1:0].NumberOfServices; BaseAddr = (ULONG)KeServiceDescriptorTableShadow[IsShadow?1:0].ServiceTableBase; if (Index>=ServiceCount) return FALSE; return *(PULONG)(BaseAddr+Index * 4); } return FALSE; } NTSTATUS MyNtOpenThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId) { PETHREAD tcmp; PEPROCESS pcmp; NTSTATUS st,ntotst; if(MmIsAddressValid(ClientId)==TRUE) { st=PsLookupThreadByThreadId((HANDLE)ClientId->UniqueThread,&tcmp); if (!NT_SUCCESS(st)) { ntotst=STATUS_ACCESS_DENIED; } else { pcmp=IoThreadToProcess(tcmp); if(pcmp==ppep) ntotst=STATUS_ACCESS_DENIED; else ntotst=OldNtOpenThread(ThreadHandle,DesiredAccess,ObjectAttributes,ClientId); } } else { ntotst=STATUS_ACCESS_DENIED; } return ntotst; } NTSTATUS MyNtOpenProcess(OUT PHANDLE ProcessHandle, IN ACCESS_MASK AccessMase, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId) { PEPROCESS pcmp; NTSTATUS st,ntopst; if(MmIsAddressValid(ClientId)==TRUE) { st=PsLookupProcessByProcessId((HANDLE)ClientId->UniqueProcess,&pcmp); if (!NT_SUCCESS(st)) { ntopst=STATUS_ACCESS_DENIED; } else { if(pcmp==ppep) ntopst=STATUS_ACCESS_DENIED; else ntopst=OldNtOpenProcess(ProcessHandle,AccessMase,ObjectAttributes,ClientId); } } else { ntopst=STATUS_ACCESS_DENIED; } return ntopst; } NTSTATUS MyNtDuplicateObject(IN HANDLE SourceProcessHandle, IN HANDLE SourceHandle, IN HANDLE TargetProcessHandle, OUT PHANDLE TargetHandle OPTIONAL, IN ACCESS_MASK DesiredAccess, IN ULONG Attributes, IN ULONG Options) { NTSTATUS ntStatus,Tmp; PROCESS_BASIC_INFORMATION PBI; THREAD_BASIC_INFORMATION TBI; ULONG NowPid; ntStatus=OldNtDuplicateObject(SourceProcessHandle,SourceHandle,TargetProcessHandle,T argetHandle,DesiredAccess,Attributes,Options); if (NT_SUCCESS(ntStatus) ) { Tmp=ZwQueryInformationProcess(*TargetHandle,0,&PBI,sizeof(PBI),NULL); if (NT_SUCCESS(Tmp)) { NowPid=PBI.UniqueProcessId; if (NowPid==ppid || NowPid==ppid+1 || NowPid==ppid+2 || NowPid==ppid+3) { ZwClose(*TargetHandle); *TargetHandle=0; ntStatus= STATUS_UNSUCCESSFUL; } } Tmp=ZwQueryInformationThread(*TargetHandle,0,&TBI,sizeof(TBI),NULL); if (NT_SUCCESS(Tmp)) { NowPid=(ULONG)TBI.ClientId.UniqueProcess; if (NowPid==ppid || NowPid==ppid+1 || NowPid==ppid+2 || NowPid==ppid+3) { ZwClose(*TargetHandle); *TargetHandle=0; ntStatus= STATUS_UNSUCCESSFUL; } } } return ntStatus; } BOOL MyNtUserPostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam) { PEPROCESS pcmp=NULL; PETHREAD tcmp=NULL; NTSTATUS st=STATUS_UNSUCCESSFUL; BOOL rt=FALSE; st=PsLookupThreadByThreadId((HANDLE)idThread,&tcmp); if (NT_SUCCESS(st)) { pcmp=IoThreadToProcess(tcmp); if(pcmp==ppep) rt=FALSE; else rt=OldNtUserPostThreadMessage(idThread,Msg,wParam,lParam); } else { rt=FALSE; } return rt; } //HOOK KiFastCallEntry过滤函数 __declspec(naked)void FakeKiFastCallEntry() { _asm { pushfd pushad mov edi,dword ptr [edi] mov ebx,dword ptr [edi+eax*4] cmp OldNtOpenProcess,ebx; //比较是否为NtOpenProcess je Label1 cmp OldNtDuplicateObject,ebx; //比较是否为NtDuplicateObject je Label2 cmp OldNtOpenThread,ebx; //比较是否为NtOpenThread je Label3 cmp OldNtUserPostThreadMessage,ebx; //比较是否为NtOpenThread je Label4 popad popfd mov edi,dword ptr [edi] mov ebx,dword ptr [edi+eax*4] jmp [JMPRet]; Label1: popad popfd mov ebx,MyNtOpenProcess //修改NtOpenProcess为我们的代理函数 jmp [JMPRet]; Label2: popad popfd mov ebx,MyNtDuplicateObject //修改NtDuplicateObject为我们的代理函数 jmp [JMPRet]; Label3: popad popfd mov ebx,MyNtOpenThread //修改NtOpenThread为我们的代理函数 jmp [JMPRet]; Label4: popad popfd mov ebx,MyNtUserPostThreadMessage //修改NtUserPostThreadMessage为我们的代理函数 jmp [JMPRet]; } } NTSTATUS LoadKiHooker() { NTSTATUS status = STATUS_UNSUCCESSFUL; KIRQL oldIrql; PMDL pMdl = NULL; UNICODE_STRING ustrFunctionName,ustrFunctionName2; //获得“阴影 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf ”的地址 KeServiceDescriptorTableShadow=(PSYSTEM_SERVICE_TABLE)GetShadowTableAddres s(); if (!KeServiceDescriptorTableShadow) { DbgPrint("Find SSSDT Error!"); return STATUS_UNSUCCESSFUL; } //获取NtUserPostThreadMessage地址 OldNtUserPostThreadMessage=(NTUSERPOSTTHREADMESSAGE)GetSSDTCurAddr(idPTM,TRUE); DbgPrint("NtUserPostThreadMessaged=0x%08X",OldNtUserPostThreadMessage); //获取NtOpenProcess地址 RtlInitUnicodeString(&ustrFunctionName, L"NtOpenProcess"); OldNtOpenProcess=(NTOPENPROCESS)MmGetSystemRoutineAddress( &ustrFunctionNa me); DbgPrint("NtOpenProcess=0x%08X",OldNtOpenProcess); //获取NtDuplicateObject地址 RtlInitUnicodeString(&ustrFunctionName2, L"NtDuplicateObject"); OldNtDuplicateObject=(NTDUPLICATEOBJECT)MmGetSystemRoutineAddress(&ustrFun ctionName2); DbgPrint("NtDuplicateObject=0x%08X",OldNtDuplicateObject); //获取NtOpenThread地址 OldNtOpenThread=(NTOPENTHREAD)GetSSDTRealAddr(GetSysCallIndex("NtOpenThre ad")); DbgPrint("NtOpenThread=0x%08X",OldNtOpenThread); //系统调用管理器的地址保存在MSR寄存器里面,标识ID为0x176是 SYSENTER_EIP_MSR寄存器,存放着KiFastCallEntry地址~所以在这里用rdmsr读取 KiFastCallEntry地址; __asm { pushfd pushad mov ecx,0x176 rdmsr mov uKiFastCallEntryAddr,eax //获取KiFastCallEntry地址 xor ecx,ecx Label1: cmp ecx,0x100 je Label3 mov edx,DWORD ptr [eax] cmp edx,0x1C8B3F8B //搜索特征码,获取要Hook的位置 je Label2 inc eax inc ecx jmp Label1 Label2: mov HookAddr,eax Label3: popad popfd } if (HookAddr==0) { return status; } //申请分配二级跳转内存 PushRetMem=(ULONG)ExAllocatePoolWithTag(NonPagedPool,6,MEM_TAG); if ((PVOID)PushRetMem==NULL) { return status; } DbgPrint("PushRetMem=0x%08X",PushRetMem); //一级跳转地址 *(ULONG*)&JmpCode[1]=(ULONG)(PushRetMem)-(HookAddr+5); //二级跳转地址 *(ULONG*)&PushRetCode[1]=(ULONG)FakeKiFastCallEntry; //HOOK返回地址 JMPRet=HookAddr+5; //申请MDL pMdl = IoAllocateMdl((PBYTE)HookAddr, 5, FALSE, FALSE, NULL); if (pMdl) { //锁定内存页面 __try { MmProbeAndLockPages(pMdl, KernelMode, IoWriteAccess); } __except(EXCEPTION_EXECUTE_HANDLER) { IoFreeMdl(pMdl); return status; } //申请并使用自旋锁 KeInitializeSpinLock(&f_spinlock); KeAcquireSpinLock(&f_spinlock,&f_oldirql); //提升中断请求级 oldIrql = KeRaiseIrqlToDpcLevel(); //关闭中断 _asm { CLI MOV EAX, CR0 AND EAX, NOT 10000H MOV CR0, EAX } //进行HOOK操作 RtlCopyMemory((PVOID)PushRetMem,PushRetCode,6); RtlCopyMemory((PVOID)HookAddr,JmpCode,5); //开启中断 _asm { MOV EAX, CR0 OR EAX, 10000H MOV CR0, EAX STI } //恢复先前中断请求级 KeLowerIrql(oldIrql); //释放自旋锁 KeReleaseSpinLock(&f_spinlock, f_oldirql); DbgPrint("KiFastCallEntry=0x%08X",uKiFastCallEntryAddr); DbgPrint("HookAddr=0x%08X",HookAddr); status=STATUS_SUCCESS; } return status; } VOID UnloadKiHooker() { PMDL pMdl = NULL; KIRQL oldIrql; if (HookAddr!=0) { pMdl = IoAllocateMdl((PBYTE)HookAddr, 5, FALSE, FALSE, NULL); if (pMdl) { //锁定内存页面 __try { MmProbeAndLockPages(pMdl, KernelMode, IoWriteAccess); } __except(EXCEPTION_EXECUTE_HANDLER) { IoFreeMdl(pMdl); return; } //申请并使用自旋锁 KeInitializeSpinLock(&f_spinlock); KeAcquireSpinLock(&f_spinlock,&f_oldirql); //提升中断请求级 oldIrql = KeRaiseIrqlToDpcLevel(); //关闭中断 _asm { CLI MOV EAX, CR0 AND EAX, NOT 10000H MOV CR0, EAX } //进行还原HOOK操作 RtlCopyMemory((PVOID)HookAddr,OrgCode,5); _asm { MOV EAX, CR0 OR EAX, 10000H MOV CR0, EAX STI } //恢复先前中断请求级 KeLowerIrql(oldIrql); //释放自旋锁 KeReleaseSpinLock(&f_spinlock, f_oldirql); //释放内存 ExFreePool((PVOID)PushRetMem); } } }
本文档为【使用自旋锁的各种HOOK】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_477730
暂无简介~
格式:doc
大小:44KB
软件:Word
页数:20
分类:互联网
上传时间:2018-02-19
浏览量:29