HOOK SSDT主要代码

#pragma once
#include <ntifs.h> /*
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * *
* 更多游戏逆向视频www.yxfzedu.com *
* *
* 有任何问题请发邮件至service@yxfzedu.com *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
*/
#pragma pack(1) //SSDT表的结构
typedef struct ServiceDescriptorEntry {
unsigned int* ServiceTableBase;
unsigned int* ServiceCounterTableBase; //Used only in checked build
unsigned int NumberOfServices;
unsigned char* ParamTableBase;
} ServiceDescriptorTableEntry_t, * PServiceDescriptorTableEntry_t;
#pragma pack() typedef NTSTATUS (*pNtOpenProcess)(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId OPTIONAL);
ULONG g_OpenProcess; __declspec(dllimport) ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
//恢复内存保护
VOID PageProtectOn() { __asm {
mov eax, cr0;
or eax, 0x10000;
mov cr0, eax;
sti;//开启中断
}
}
//去掉内存保护
VOID PageProtectOFF() { __asm {
cli;//关闭中断,防止线程切换
mov eax, cr0;
and eax,not 0x10000;
mov cr0, eax;
}
} //
ULONG GetProcessNameOffset()
{ PEPROCESS curproc;
ULONG procNameOffset;
//获取EPROCESS结构的地址
curproc = PsGetCurrentProcess();
for (int i = ; i < ; i++)
{
if (!strncmp("explo", (PCHAR)curproc + i, strlen("explo")))
{
procNameOffset = i;
return procNameOffset;
}
}
return ;
} BOOLEAN ProtectProcess(HANDLE ProcessId) {
PEPROCESS Process;
//HANDLE ProcessId = 100; if (ProcessId == ) {
return FALSE;
}
NTSTATUS ProcessByProcessIdStatus = PsLookupProcessByProcessId(ProcessId, &Process); if (ProcessByProcessIdStatus != STATUS_SUCCESS)
{
KdPrint(("yxfzedu:根据PID获取进程对象失败 \n"));
return FALSE;
}
PEPROCESS pEprocess = PsGetCurrentProcess();
KdPrint(("yxfzedu %s \n", (UCHAR*)pEprocess + 0x16c));
if(strstr((char*)pEprocess + 0x16c,"TraceMe")!=){
ObDereferenceObject(Process);
return TRUE;
}
ObDereferenceObject(Process);
return FALSE;
} NTSTATUS MyNtOpenProcess(
OUT PHANDLE ProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
IN PCLIENT_ID ClientId OPTIONAL) {
KdPrint(("yxfzedu: 进入到了MyNtOpenProcess! \n"));
KdPrint(("yxfzedu: ClientId->UniqueProcess=%d \n", ClientId->UniqueProcess)); if (ClientId->UniqueProcess == (HANDLE))
{
return STATUS_UNSUCCESSFUL;
}
/*ULONG offse= GetProcessNameOffset();
KdPrint(("yxfzedu:%d\n",offse));*/ //PEPROCESS pEprocess = PsGetCurrentProcess();
//KdPrint(("yxfzedu %s \n", (UCHAR*)pEprocess + 0x16c));
NTSTATUS status = ((pNtOpenProcess)g_OpenProcess)(ProcessHandle, DesiredAccess, ObjectAttributes,ClientId);
return status;
} NTSTATUS HookOpenProcess() {
PageProtectOFF();
g_OpenProcess = KeServiceDescriptorTable.ServiceTableBase[];
KeServiceDescriptorTable.ServiceTableBase[] = (ULONG)MyNtOpenProcess;
PageProtectOn();
/*for (unsigned int i = 0; i < KeServiceDescriptorTable.NumberOfServices; i++)
{
KdPrint(("yxfzedu: 索引号【%d】函数地址=%X \n",i, KeServiceDescriptorTable.ServiceTableBase[i]));
}*/
return STATUS_SUCCESS;
} VOID UnHook() {
PageProtectOFF();
KeServiceDescriptorTable.ServiceTableBase[] = g_OpenProcess;
PageProtectOn();
KdPrint(("yxfzedu:HookOpenProcess 以还原!"));
}

更多游戏逆向视频www.yxfzedu.com

最新文章

  1. 【腾讯Bugly干货分享】Android动态布局入门及NinePatchChunk解密
  2. ie7中ul不能嵌套div和li平级
  3. cmd执行mysql操作
  4. 对atime、mtime和ctime的研究
  5. Mix and Build(简单DP)
  6. yii2 学习中
  7. (原创)LAMP教程2-安装虚拟机软件VirtualBox
  8. javascript链式调用实现方式总结
  9. wordpress搭建后地址栏页面显示IP地址的问题
  10. java服务器获取客户端ip
  11. JS工厂模式开发实践
  12. Nginx前端设置反向代理,后端Apache如何获取访客的真实IP,结合PHP
  13. angular路由详解六(路由守卫)
  14. os X下mds_stores占用大量cpu的解决办法
  15. scws安装
  16. GG的文化课
  17. 虚拟蜜罐honeyd安装使用
  18. spring boot 包jar运行
  19. 痞子衡嵌入式:忘掉cmd.exe吧!选用优雅的控制台终端(ConsoleZ)
  20. gentoo 工具命令

热门文章

  1. 全球疫情爬取APP版
  2. Java流程控制,for,switch,while.break,continue,return
  3. 精讲RestTemplate第4篇-POST请求方法使用详解
  4. go微服务系列(二) - 服务注册/服务发现
  5. JavaScript 实用方法
  6. Manacher(马拉车)算法(jekyll迁移)
  7. CPF 入门教程(一)
  8. 坚持第一天:HashMap和Hashtable的区别
  9. MySQL设置跳过密码验证
  10. python 01 print input int