使用Detours HOOK API防DLL注入

jjqxt 2009-09-21 09:53:23
我要写一个程序,具体作用是这样的:
1.HOOK相关的API,防止外挂的DLL起作用,但是我的代码做的是全局钩子,把游戏的API也拦截了,导致游戏一被钩就关闭。应该怎么办?
我的想法是指定不钩游戏,只钩其他的程序,不知道该怎么做,也不知道行不行得通。

不吝赐教~~~~~~~~~~~~~

代码里调用InstallHook安装全局钩子
只放出DLL代码

// InterceptDll.cpp : 定义 DLL 应用程序的入口点。
//

#include "Hook.h"
#include "detours.h"

#pragma warning(disable: 4099)
#pragma comment(lib,"detours.lib")


HHOOK g_hHook = NULL;
HANDLE g_hInst = NULL;


DETOUR_TRAMPOLINE( HHOOK WINAPI Real_SetWindowsHookEx( int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId),SetWindowsHookEx);

HHOOK WINAPI Replace_SetWindowsHookEx( int idHook, HOOKPROC lpfn, HINSTANCE hMod, DWORD dwThreadId)
{
if(g_hHook != NULL)
{
return 0;
}
return Real_SetWindowsHookEx(idHook,lpfn,hMod,dwThreadId);
}

void Intercept()
{
DetourFunctionWithTrampoline((PBYTE)Real_SetWindowsHookEx, (PBYTE)Replace_SetWindowsHookEx);
}

void UnIntercept()
{
DetourRemove((PBYTE)Real_SetWindowsHookEx, (PBYTE)Replace_SetWindowsHookEx);
}

BOOL APIENTRY DllMain( HANDLE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
g_hInst = hinstDLL;

switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
Intercept();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
UnIntercept();
break;
}
return TRUE;
}

LRESULT CALLBACK MyShellProc (int nCode, WPARAM wParam, LPARAM lParam)
{
return ::CallNextHookEx( g_hHook, nCode, wParam, lParam );
}

void InstallHook()
{
if(g_hHook == NULL)
{
g_hHook = ::SetWindowsHookEx( WH_GETMESSAGE , MyShellProc ,(HINSTANCE)g_hInst, 0);
}
}

void UninstallHook()
{
if(::UnhookWindowsHookEx( g_hHook ))
g_hHook = NULL;
}



2.还有就是问下外挂把DLL注进来后 还有调用到什么API函数么? 外挂的DLL注入后是如何起作用的?
...全文
434 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxw253038773 2010-09-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 jjqxt 的回复:]
引用 5 楼 wangk 的回复:
解决的方式楼上的已经都说完了。
补充:
1.外挂的DLL起作用,不止SetWindowsHookEx一个方式。
2.你这样的做法,其他正常应用想要安装钩子也会失败,你需要一个白名单和黑名单。
3.安装钩子未必一定要调用SetWindowsHookEx函数。不在SSDT表中挂钩,在应用层中起不到太多作用

1.我钩了好几个API的,只留SetWind……
[/Quote]
请教下,还有哪些函数可以安装钩子?
jjqxt 2009-09-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wangk 的回复:]
解决的方式楼上的已经都说完了。
补充:
1.外挂的DLL起作用,不止SetWindowsHookEx一个方式。
2.你这样的做法,其他正常应用想要安装钩子也会失败,你需要一个白名单和黑名单。
3.安装钩子未必一定要调用SetWindowsHookEx函数。不在SSDT表中挂钩,在应用层中起不到太多作用
[/Quote]
1.我钩了好几个API的,只留SetWindowsHookEx只是为了缩短代码,O(∩_∩)O哈!
2.恩,黑白名单确实好复杂,我后续再搞。。。。(头痛啊~~)
3.有几个外挂都用的是全局钩子,所以就比较针对SetWindowsHookEx这个函数了,(*^__^*) 嘻嘻……
wangk 2009-09-22
  • 打赏
  • 举报
回复
解决的方式楼上的已经都说完了。
补充:
1.外挂的DLL起作用,不止SetWindowsHookEx一个方式。
2.你这样的做法,其他正常应用想要安装钩子也会失败,你需要一个白名单和黑名单。
3.安装钩子未必一定要调用SetWindowsHookEx函数。不在SSDT表中挂钩,在应用层中起不到太多作用
oyljerry 2009-09-22
  • 打赏
  • 举报
回复
DLL被各个进程加载的时候判断一下进程名称,路径等,GetModuleFileName,不是希望的就直接返回..
cattycat 2009-09-22
  • 打赏
  • 举报
回复
同意二楼可以判断名字比较。
oldn123 2009-09-22
  • 打赏
  • 举报
回复
case DLL_PROCESS_ATTACH:
里GetModuleFileName取名子和游戏名对比,如果相等则不掉用Intercept();
MoXiaoRab 2009-09-21
  • 打赏
  • 举报
回复
他们写在PROCESS_ATTACH中,注入进来就会直接运行其中的代码了
Detours是微软开发的一个函数库, 用于修改运行中的程序在内存中的影像,从而即使没有源代码也能改变程序的行为。具体用途是: 拦截WIN32 API调用,将其引导到自己的子程序,从而实现WIN32 API的定制。 为一个已在运行的进程创建一新线程,装入自己的代码并运行。 ---- 本文将简介Detours的原理,Detours库函数的用法, 并利用Detours库函数在Windows NT上编写了一个程序,该程序能使有“调试程序”的用户权限的用户成为系统管理员,附录利用Detours库函数修改该程序使普通用户即可成为系统管理员 (在NT4 SP3上)。 一. Detours的原理 ---- 1. WIN32进程的内存管理 ---- 总所周知,WINDOWS NT实现了虚拟存储器,每一WIN32进程拥有4GB的虚存空间, 关于WIN32进程的虚存结构及其操作的具体细节请参阅WIN32 API手册, 以下仅指出与Detours相关的几点: ---- (1) 进程要执行的指令也放在虚存空间中 ---- (2) 可以使用QueryProtectEx函数把存放指令的页面的权限更改为可读可写可执行,再改写其内容,从而修改正在运行的程序 ---- (3) 可以使用VirtualAllocEx从一个进程为另一正运行的进程分配虚存,再使用 QueryProtectEx函数把页面的权限更改为可读可写可执行,并把要执行的指令以二进制机器码的形式写入,从而为一个正在运行的进程注入任意的代码 ---- 2. 拦截WIN32 API的原理 ---- Detours定义了三个概念: ---- (1) Target函数:要拦截的函数,通常为Windows的API。 ---- (2) Trampoline函数:Target函数的复制品。因为Detours将会改写Target函数,所以先把Target函数复制保存好,一方面仍然保存Target函数的过程调用语义,另一方面便于以后的恢复。 ---- (3) Detour 函数:用来替代Target函数的函数。 ---- Detours在Target函数的开头加入JMP Address_of_ Detour_ Function指令(共5个字节)把对Target函数的调用引导到自己的Detour函数, 把Target函数的开头的5个字节加上JMP Address_of_ Target _ Function+5作为Trampoline函数。例子如下: 拦截前:Target _ Function: ;Target函数入口,以下为假想的常见的子程序入口代码 push ebp mov ebp, esp push eax push ebx Trampoline: ;以下是Target函数的继续部分 …… 拦截后: Target _ Function: jmp Detour_Function Trampoline: ;以下是Target函数的继续部分 …… Trampoline_Function: ; Trampoline函数入口, 开头的5个字节与Target函数相同 push ebp mov ebp, esp push eax push ebx ;跳回去继续执行Target函数 jmp Target_Function+5 ---- 3. 为一个已在运行的进程装入一个DLL ---- 以下是其步骤: ---- (1) 创建一个ThreadFuction,内容仅是调用LoadLibrary。 ---- (2) 用VirtualAllocEx为一个已在运行的进程分配一片虚存,并把权限更改为可读可写可执行。 ---- (3) 把ThreadFuction的二进制机器码写入这片虚存。 ---- (4) 用CreateRemoteThread在该进程上创建一个线程,传入前面分配的虚存的起始地址作为线程函数的地址,即可为一个已在运行的进程装入一个DLL。通过DllMain 即可在一个已在运行的进程中运行自己的代码。 二. Detours库函数的用法 ---- 因为Detours软件包并没有附带帮助文件,以下接口仅从剖析源代码得出。 ---- 1. PBYTE WINAPI DetourFindFunction(PCHAR pszModule, PCHAR pszFunction) ---- 功能:从一DLL中找出一函数的入口地址 ---- 参数:pszModule是DLL名,pszFun

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧