Dll注入方法-钩子

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

idHook: 钩子类型
lpfn:钩子过程的指针 ,也即拦截到指定系统消息后的预处理过程,定义在DLL中
hMod:应用程序实例的句柄 如果是全局钩子, hInstance是DLL句柄(DllMain中给的模块地址。就是包含HookProc的动态库加载地址。否则给0就可以了,即勾自己。
dwThreadId:要安装钩子的线程ID ,指定被监视的线程,如果明确指定了某个线程的ID就只监视该线程,此时的钩子即为线程钩子;如果该参数被设置为0,则表示此钩子为监视系统所有线程的全局钩子。

其中idHook参数可以取如下常量:
WH_CALLWNDPROC //窗口钩子,当系统向目标窗口发送消息时将触发此钩子
WH_CALLWNDPROCRET //窗口钩子,当窗口处理完消息后将触发此钩子
WH_CBT //当Windows激活、产生、释放(关闭)、最小化、最大化或改变窗口时都将触发此事件
WH_DEBUG //调试钩子
WH_GETMESSAGE //当往消息队列中增加一个消息时将触发此钩子
WH_JOURNALPLAYBACK //回放钩子,可以用于播放已记录的鼠标和键盘的操作
WH_JOURNALRECORD //记录钩子,可以用于记录鼠标和键盘的操作,木马程序可以使用此钩子窃取受控方在屏幕中敲入的密码
WH_KEYBOARD //当敲击键盘时将触发此钩子
WH_MOUSE //当有鼠标操作时将触发此钩子
WH_MSGFILTER //消息过滤钩子
WH_SHELL //Shell钩子
WH_SYSMSGFILTER //系统消息过滤钩子

原理:通过SetWindowsHookEx函数将DLL注入到进程的地址空间中,最后一个参数dwThreadId指向的是被注入进程内的某个线程ID。
(1) 进程A对线程dwThread挂键盘钩子
(2) 线程dwThreadId获取到的键盘消息会实现被钩子拦截
(3) 系统检查hMod指向的DLL是否已被载入到线程dwThreadId所在的进程地址空间中,若否,则载入。这时,假设DLL被载入到进程B
(4) 系统在进程B的地址空间中调用lpfn函数

*********************************************************************************

DLL部分

*********************************************************************************

LRESULT CALLBACK FunProc(
int code, // hook code
WPARAM wParam, // virtual-key code
LPARAM lParam // keystroke-message information
)
{
MessageBox(NULL,"KEY PRESS","hook inject",MB_OK);
return CallNextHookEx(0,code,wParam,lParam);
}

HHOOK g_HookHandle;

__declspec(dllexport) void SetHook()
{
DWORD tid = 0;
// 获取窗口句柄
HWND gameh = FindWindow(NULL,"test.txt - 记事本");
if (gameh == 0)
{
return;
}
// 获取创建这个窗口的线程
tid = GetWindowThreadProcessId(gameh,NULL);
// 安装钩子到指定线程 WH_KEYBOARD 键盘钩子
g_HookHandle = SetWindowsHookEx(WH_KEYBOARD, FunProc, GetModuleHandle("HOOKInject.dll"),tid);
}

__declspec(dllexport) void UnHook()
{
UnhookWindowsHookEx(g_HookHandle);
}

*********************************************************************************

EXE部分

*********************************************************************************

typedef void (*lpFun)();
int main()
{
HINSTANCE hDll; //DLL句柄
lpFun SetHook; //函数指针
lpFun UnHook; //函数指针
hDll = LoadLibrary("..\\Debug\\HOOKInject.dll");
if (hDll != NULL)
{
SetHook = (lpFun)GetProcAddress(hDll, "SetHook");
UnHook = (lpFun)GetProcAddress(hDll, "UnHook");
}

if (SetHook != NULL)
{
SetHook();
}
getchar();
UnHook();
if (hDll != NULL)
{
FreeLibrary(hDll);
}

return 0;
}

Dll注入方法-钩子

时间: 2024-10-25 03:11:19

Dll注入方法-钩子的相关文章

Dll注入方法之二

有了第一种方法,我们不难举一反三,由于原理是只需要我们的执行函数被写入到目标进程,所有相关的变量也在目标函数里,那么我们的函数就能被正确执行(前提是没有互相调用我们注入的函数,否则需要做地址处理.这也是为什么整个可执行文件注入时,要做很多重定位).这里,我们进一步尝试,将LoadLibrary放在一个函数里,在同一个函数里,我们再调用一个MessageBox(这里只是一个测试,以后你可以调用任何你的函数,但必须要对地址进行处理). 步骤一和步骤二:请参考Dll注入方法之一. 步骤三:书写需要被注

反射式DLL注入--方法

使用RWX权限打开目标进程,并为该DLL分配足够大的内存. 将DLL复制到分配的内存空间. 计算DLL中用于执行反射加载的导出的内存偏移量. 调用CreateRemoteThread(或类似的未公开的API函数RtlCreateUserThread)在远程进程中开始执行,使用反射加载函数的偏移地址作为入口点. 反射加载函数使用适当的CPU寄存器查找目标进程的进程环境块(PEB),并使用它查找内存中的地址kernel32.dll以及任何其他所需的库. 解析的KERNEL32出口目录中找到所需的AP

经典的就要转载:另类DLL注入法

转自:http://blog.csdn.net/onevs1/article/details/5692680 输入法注入[转帖] 百度搜来的.论述比较详细,不过我还没搞懂!就原文贴一下了! ----------------------------------------------------------------------------------------------以下是原文 Ring3下注入DLL的另类方法,能过杀软和游戏NP(源码)       注入DLL是做全局钩子或者拦截类软件

Windows系统的dll注入

声明:这篇博客原为本人在CSDN上发布的,但是CSDN这个网站违背了本人的分享和开源精神,另外CSDN的广告满天飞.审核重重(所有的下载必须使用CSDN下载,而下载需要积分,这严重违背本人的无私分享精神.开源精神.),即使审核通过也会不定时进行重新审核,CSDN的这些操作严重影响了本人的博客管理.因此,本着无私分享精神.开源精神.轻松使用原则,本人摒弃了CSDN,并将博文重新编辑并发布在博客园网站上,而原博文作删除处理! 一.什么是dll注入 在Windows操作系统中,运行的每一个进程都生活在

[转载]Dll注入技术之消息钩子

转自:黑客反病毒 DLL注入技术之消息钩子注入 消息钩子注入原理是利用Windows 系统中SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个特性,我们可以将DLL注入到指定进程中.主要流程如下图所示 1.准备阶段     需要编写一个DLL,并且显式导出MyMessageProc()函数,主要代码如下: LRESULT WINAPI MyMessageProc(int code,WPARAM wParam,LPARAM lParam)

[转]Dll注入经典方法完整版

Pnig0s1992:算是复习了,最经典的教科书式的Dll注入. 总结一下基本的注入过程,分注入和卸载 注入Dll: 1,OpenProcess获得要注入进程的句柄 2,VirtualAllocEx在远程进程中开辟出一段内存,长度为strlen(dllname)+1; 3,WriteProcessMemory将Dll的名字写入第二步开辟出的内存中. 4,CreateRemoteThread将LoadLibraryA作为线程函数,参数为Dll的名称,创建新线程 5,CloseHandle关闭线程句

<ReversingEngineering>关于windows32位系统下的dll注入技术经验汇

上个学期把自己闷在图书馆一直在看关于逆向工程技术方面的书,从入门到初级,现在也敢说自己一条腿已经迈进了这片知识的大门里,因为该博客刚开通先将一些经验记录下来,也是留给自己一方面做个参照. <逆向工程核心原理>((韩)李承远 )<Reversing:逆向工程揭密(电子工业出版社)><黑客反汇编揭密>((俄)卡巴斯基 ) dll注入技术是一门逆向工程中非常基础非常初步的技术,也是打开大门的钥匙,逆向破解的前提条件.API勾取 ,Rootkit进程隐藏都需要dll注入为先决条

远程线程注入方法CreateRemoteThread

最近在整理学习Windows注入方面的知识,这个远程注入前面早写过,现在看看人家博客的理解整理,整理, 需要源码的可以到我的github上下载. 链接是  https://github.com/Arsense/WindowsCode 首先先来说说什么是注入,为什么要注入 0x00 Baise 注入就是把自己的Dll注入到人家的代码中,被注入的DLL拥有目标进程内存的访问权限,所以我们可以通过该 向某个进程注入DLL时的方法主要有以下三种: 创建远程线程(CreateRemoteThread()

DLL注入的学习(未完)

参考:http://andylin02.iteye.com/blog/459483 进程注入的方法分类如下: 带DLL的注入 利用注册表注入 利用Windows Hooks注入 利用远程线程注入 利用特洛伊DLL注入 不带DLL的注入 直接将代码写入目标进程,并启动远程线程 1. 利用注册表注入(appinit_dll 注入) 在Windows NT/2000/XP/2003中,有一个注册表键值HKEY_LOCAL_MACHINE\Software\Microsoft \WindowsHKEY_