前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实现hook OpenProcess实现

实现hook OpenProcess实现

作者头像
py3study
发布2020-01-09 12:43:22
2.1K2
发布2020-01-09 12:43:22
举报
文章被收录于专栏:python3

/*********************************实现hook OpenProcess实现ring3保护进程、、C++完整代码、、************************************************/ #include <windows.h>

PIMAGE_IMPORT_BY_NAME  pImportByName = NULL; PIMAGE_THUNK_DATA    pOriginalThunk = NULL; PIMAGE_THUNK_DATA    pFirstThunk = NULL;

//IAT HOOK的核心函数、 int IatHook(const char* DllName, const char* FunName,DWORD RealAddr);

//自己的OpenProcess函数、 HANDLE   WINAPI    MyOpenProcess    (DWORD dwDesiredAccess,  BOOL bInheritHandle,   DWORD dwProcessId);

DWORD MyOpenProcessAddr = (DWORD)MyOpenProcess;

//真正的 OpenProcess函数指针、、 typedef HANDLE (WINAPI * RealOpenProcess)(DWORD,BOOL,DWORD); RealOpenProcess pRealOpenProcess = (RealOpenProcess)OpenProcess;

//DLL MAIN 函数、 BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) { if(fdwReason==DLL_PROCESS_ATTACH) {  IatHook("Kernel32.dll","OpenProcess",MyOpenProcessAddr); } return TRUE; }

/****************************************************** MyOpenProcess 函数的实现部分****************************************************/

HANDLE WINAPI MyOpenProcess(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwProcessId) {

//获取  要保护进程的标题  的窗口句柄 系统API函数前使用::为了和类扩展函数区别 // 为了代码的健壮性 使用TEXT宏、  HWND 窗口句柄、 HWND HProtect = ::FindWindow(NULL,TEXT("Windows 当前所有进程")); if(!HProtect) {  return ( pRealOpenProcess(dwDesiredAccess,bInheritHandle,dwProcessId) ); }                         //若不存在则调用返回                             //获取创建此窗口的进程的ID、保存在  &ProtectId  地址中、 DWORD ProtectId;                //下边找出某个窗口的创建者(线程或进程) GetWindowThreadProcessId(HProtect,&ProtectId); if(ProtectId == dwProcessId)                      //dwProcessId是任务管理器要结束的进程ID {  return 0;                              //如果结束的是我们的进程则 返回错误码0、 }  return ( pRealOpenProcess(dwDesiredAccess,bInheritHandle,dwProcessId) ); }

/ ****************************************************** IAT  HOOK  函数的实现部分****************************************************/

int IatHook(const char* DllName, const char* FunName,DWORD RealAddr)

{ /**************************   找相同的DLL   ****************************/ HANDLE pBegin = GetModuleHandle(NULL); PBYTE  pBegin2 = (PBYTE)pBegin; PIMAGE_DOS_HEADER DOS = PIMAGE_DOS_HEADER(pBegin2); PIMAGE_NT_HEADERS NT = PIMAGE_NT_HEADERS(pBegin2+DOS->e_lfanew); PIMAGE_OPTIONAL_HEADER OPTION = &(NT->OptionalHeader); PIMAGE_IMPORT_DESCRIPTOR IMPORT = PIMAGE_IMPORT_DESCRIPTOR(OPTION->DataDirectory[1].VirtualAddress + pBegin2); while (IMPORT->Name) {    char* OurDllName = (char*)(IMPORT->Name + pBegin2);  if (0 == strcmpi(DllName , OurDllName))  {   break;  }  IMPORT++; } /*************************   找相同的API函数    ****************************/ PIMAGE_IMPORT_BY_NAME  pImportByName = NULL; PIMAGE_THUNK_DATA   pOriginalThunk = NULL; PIMAGE_THUNK_DATA   pFirstThunk = NULL; pOriginalThunk = (PIMAGE_THUNK_DATA)(IMPORT->OriginalFirstThunk + pBegin2); pFirstThunk = (PIMAGE_THUNK_DATA)(IMPORT->FirstThunk + pBegin2); while (pOriginalThunk->u1.Function) //记住是Function {  DWORD u1 = pOriginalThunk->u1.Ordinal;  //记住是Ordinal  if ((u1 & IMAGE_ORDINAL_FLAG) != IMAGE_ORDINAL_FLAG) //说明MSB不是1  不是以序号导入  {   pImportByName = (PIMAGE_IMPORT_BY_NAME)((DWORD)pOriginalThunk->u1.AddressOfData + pBegin2);   char* OurFunName = (char*)(pImportByName->Name); //下边的计算也可以     //char* OurFunName2 = (char*)((DWORD)pOriginalThunk->u1.AddressOfData + pBegin2 + 2);     if (0 == strcmpi(FunName,OurFunName))   {    //获取以pFirstThunk开始的内存的信息并将其保存到MEMORY_BASIC_INFORMATION结构中    MEMORY_BASIC_INFORMATION   mbi_thunk;    VirtualQuery (pFirstThunk, &mbi_thunk, sizeof(MEMORY_BASIC_INFORMATION));    //VirtualProtect(mbi_thunk.BaseAddress,mbi_thunk.RegionSize, PAGE_READWRITE, &mbi_thunk.Protect);    //修改以pFirstThunk开始的内存的的保护属性为PAGE_READWRITE并将原保护属性保存到&dwOLD中    DWORD dwOLD;    VirtualProtect(pFirstThunk,sizeof(DWORD),PAGE_READWRITE,&dwOLD);    //更改真正OpenProcess的地址为自己写的MyOpenProcess函数的地址、、    pFirstThunk->u1.Function = (PDWORD)RealAddr;      //关键地方    //恢复之前更改的内存的保护属性为人家自己的、、              VirtualProtect(pFirstThunk,sizeof(DWORD),dwOLD,0);    break;   }  }  pOriginalThunk++;  pFirstThunk++; } return 0; }

/***********************完***************************/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/09/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档