Advertisement

EasyHook函数钩子示例程序(VS2010 C++版)

  •  5星
  •     浏览量: 0
  •     大小:None
  •      文件类型:RAR


简介:
本项目为使用Visual Studio 2010开发的C++版本EasyHook函数钩子示例程序,旨在帮助开发者理解和实现动态代码注入与API拦截技术。 目前最好的EasyHook的完整示例程序包括了Hook.dll动态库和Inject.exe注入程序。 Hook.dll动态库封装了一套稳定的挂钩机制,今后对函数进行挂钩只需要填写数组表格即可实现,这极大地简化了未来的使用过程。 Inject.exe部分是用MFC编写的界面程序。用户只需在界面上输入进程ID就能成功地对该进程进行挂钩操作,非常简便易用。 这个示例的代码风格非常好,在VS2010中可以稳定编译通过,值得下载和使用。 以下是两个关键的部分代码片段: Inject.exe注入程序的代码如下所示: ```cpp void CInjectHelperDlg::OnBnClickedButtonInjectDllProcessId() { UINT nProcessID = 0; if (!GetProcessID(nProcessID)) { TRACE(_T(%s GetProcessID 失败), __FUNCTION__); return; } CString strPathDLL; if (!GetDllFilePath(strPathDLL)) { TRACE(_T(%s GetDllFilePath 失败), __FUNCTION__); return; } NTSTATUS ntStatus = RhInjectLibrary(nProcessID, 0, EASYHOOK_INJECT_DEFAULT, strPathDLL.GetBuffer(0), NULL, NULL, 0); if (!ShowStatusInfo(ntStatus)) { TRACE(_T(%s ShowStatusInfo 失败), __FUNCTION__); return; } } ``` Hook.dll动态库的代码如下所示: ```cpp extern C __declspec(dllexport) void __stdcall NativeInjectionEntryPoint(REMOTE_ENTRY_INFO* InRemoteInfo) { if (!DylibMain()) { TRACE(_T(%s DylibMain 失败), __FUNCTION__); return; } } FUNCTIONOLDNEW_FRMOSYMBOL array_stFUNCTIONOLDNEW_FRMOSYMBOL[]= { {_T(kernel32), (void*)CreateFileW, (void*)CreateFileW_new}, {_T(kernel32), (void*)CreateFileA, (void*)CreateFileA_new}, {_T(kernel32), (void*)ReadFile, (void*)ReadFile_new} }; BOOL HookFunctionArrayBySymbol() { int nPos = 0; do { FUNCTIONOLDNEW_FRMOSYMBOL* stFunctionOldNew = &g_stFUNCTIONOLDNEW_FRMOSYMBOL[nPos]; if (!stFunctionOldNew->strModulePath) break; if (!HookFunctionBySymbol(stFunctionOldNew->strModulePath, stFunctionOldNew->strNameFunction, stFunctionOldNew->pFunction_New)) { TRACE(_T(%s HookFunctionBySymbol 失败), __FUNCTION__); return FALSE; } } while(++nPos); return TRUE; } HANDLE WINAPI CreateFileW_new( PWCHAR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { TRACE(_T(CreateFileW_new. lpFileName = %s), lpFileName); return CreateFileW( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); } ```

全部评论 (0)

还没有任何评论哟~
客服
客服
  • EasyHookVS2010 C++
    优质
    本项目为使用Visual Studio 2010开发的C++版本EasyHook函数钩子示例程序,旨在帮助开发者理解和实现动态代码注入与API拦截技术。 目前最好的EasyHook的完整示例程序包括了Hook.dll动态库和Inject.exe注入程序。 Hook.dll动态库封装了一套稳定的挂钩机制,今后对函数进行挂钩只需要填写数组表格即可实现,这极大地简化了未来的使用过程。 Inject.exe部分是用MFC编写的界面程序。用户只需在界面上输入进程ID就能成功地对该进程进行挂钩操作,非常简便易用。 这个示例的代码风格非常好,在VS2010中可以稳定编译通过,值得下载和使用。 以下是两个关键的部分代码片段: Inject.exe注入程序的代码如下所示: ```cpp void CInjectHelperDlg::OnBnClickedButtonInjectDllProcessId() { UINT nProcessID = 0; if (!GetProcessID(nProcessID)) { TRACE(_T(%s GetProcessID 失败), __FUNCTION__); return; } CString strPathDLL; if (!GetDllFilePath(strPathDLL)) { TRACE(_T(%s GetDllFilePath 失败), __FUNCTION__); return; } NTSTATUS ntStatus = RhInjectLibrary(nProcessID, 0, EASYHOOK_INJECT_DEFAULT, strPathDLL.GetBuffer(0), NULL, NULL, 0); if (!ShowStatusInfo(ntStatus)) { TRACE(_T(%s ShowStatusInfo 失败), __FUNCTION__); return; } } ``` Hook.dll动态库的代码如下所示: ```cpp extern C __declspec(dllexport) void __stdcall NativeInjectionEntryPoint(REMOTE_ENTRY_INFO* InRemoteInfo) { if (!DylibMain()) { TRACE(_T(%s DylibMain 失败), __FUNCTION__); return; } } FUNCTIONOLDNEW_FRMOSYMBOL array_stFUNCTIONOLDNEW_FRMOSYMBOL[]= { {_T(kernel32), (void*)CreateFileW, (void*)CreateFileW_new}, {_T(kernel32), (void*)CreateFileA, (void*)CreateFileA_new}, {_T(kernel32), (void*)ReadFile, (void*)ReadFile_new} }; BOOL HookFunctionArrayBySymbol() { int nPos = 0; do { FUNCTIONOLDNEW_FRMOSYMBOL* stFunctionOldNew = &g_stFUNCTIONOLDNEW_FRMOSYMBOL[nPos]; if (!stFunctionOldNew->strModulePath) break; if (!HookFunctionBySymbol(stFunctionOldNew->strModulePath, stFunctionOldNew->strNameFunction, stFunctionOldNew->pFunction_New)) { TRACE(_T(%s HookFunctionBySymbol 失败), __FUNCTION__); return FALSE; } } while(++nPos); return TRUE; } HANDLE WINAPI CreateFileW_new( PWCHAR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile ) { TRACE(_T(CreateFileW_new. lpFileName = %s), lpFileName); return CreateFileW( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); } ```
  • EasyHook(稳定,适用于VS2010 C++)
    优质
    本项目提供了一个使用EasyHook进行函数级API拦截的C++示例程序,专为Visual Studio 2010环境设计,适合学习和研究函数钩子技术。 目前可用的最佳EasyHook示例程序包括一个名为Hook.dll的动态库和Inject.exe注入工具。该Hook.dll封装了一套稳定的挂钩机制,使得今后对函数进行挂钩变得非常简单——只需填写数组表格即可实现所需功能,极大地便利了后续使用需求。 Inject.exe是一款基于MFC框架开发的应用程序,用户界面友好且操作简便:通过在界面上输入目标进程的ID号便能成功地对该进程执行HOOK操作。此外,该示例项目的代码规范性良好,并能在Visual Studio 2010环境下稳定编译运行,具有较高的实用价值。 下面列出部分关键代码片段供参考: Inject.exe注入程序中的一个函数定义如下: ```cpp void CInjectHelperDlg::OnBnClickedButtonInjectDllProcessId(){ // 获取进程ID值 UINT nProcessID = 0; if (!GetProcessID(nProcessID)) { TRACE(_T(%s GetProcessID 失败), __FUNCTION__); return; } // 得到DLL完整路径 CString strPathDLL; if (!GetDllFilePath(strPathDLL)){ TRACE(_T(%s GetDllFilePath 失败), __FUNCTION__); return; } // 注入DLL NTSTATUS ntStatus = RhInjectLibrary(nProcessID, 0, EASYHOOK_INJECT_DEFAULT, strPathDLL.GetBuffer(0), NULL, NULL, 0); if (!ShowStatusInfo(ntStatus)){ TRACE(_T(%s ShowStatusInfo 失败), __FUNCTION__); return; } } ``` Hook.dll动态库中的一个函数定义如下: ```cpp extern C __declspec(dllexport) void __stdcall NativeInjectionEntryPoint(REMOTE_ENTRY_INFO* InRemoteInfo){ if (!DylibMain()){ TRACE(_T(%s DylibMain 失败), __FUNCTION__); return; } } // 定义需要挂钩的函数数组 FUNCTIONOLDNEW_FRMOSYMBOL array_stFUNCTIONOLDNEW_FRMOSYMBOL[]={ {_T(kernel32), CreateFileW, (void*)CreateFileW_new}, {_T(kernel32), CreateFileA, (void*)CreateFileA_new}, {_T(kernel32), ReadFile, (void*)ReadFile_new} }; // 钩子函数数组挂钩 BOOL HookFunctionArrayBySymbol(){ int nPos = 0; do { FUNCTIONOLDNEW_FRMOSYMBOL* stFunctionOldNew = &g_stFUNCTIONOLDNEW_FRMOSYMBOL[nPos]; if (NULL == stFunctionOldNew->strModuleName) break; if (!HookFunctionBySymbol(stFunctionOldNew->strModuleName, stFunctionOldNew->strNameFunction, stFunctionOldNew->pFunction_New)){ TRACE(_T(%s HookFunctionBySymbol 失败), __FUNCTION__); return FALSE; } } while(++nPos); return TRUE; } // 新的CreateFileW函数实现 HANDLE WINAPI CreateFileW_new(PWCHAR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile){ TRACE(_T(CreateFileW_new. lpFileName = %s), lpFileName); return CreateFileW( lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); } ``` 这些代码片段展示了如何使用EasyHook进行进程注入及函数挂钩的具体实现方法。
  • C# easyHook使用
    优质
    本示例教程介绍如何使用C#编程语言中的easyHook库来实现跨进程函数钩子,详细讲解了其安装、配置及基础用法。 C#EasyHook使用示例展示如何拦截其他程序的方法,并向其注入自己的代码。需要注意的是,在进行此类操作时,需要对DLL程序集进行签名,否则注入将会失败。
  • 使用简便地完成应用汉化的C++源码
    优质
    本段C++代码示例展示如何利用钩子函数简化应用程序的多语言支持,实现高效便捷的应用程序汉化过程。 利用钩子函数轻松实现应用程序的汉化是一个C++源代码程序的小实例。
  • 线注入
    优质
    线程钩子注入示例提供了一个详细的教程,展示如何在Windows操作系统中使用线程钩子技术来监控和修改应用程序的行为。通过API函数SetWindowsHookEx实现代码注入与拦截特定消息或事件的功能,适用于软件测试、安全分析及逆向工程等领域。 线程钩子注入是Windows操作系统中的高级编程技术之一,涉及到进程间通信、系统级钩子以及线程操作等方面的知识。在Windows编程环境中,钩子是一种机制允许开发者插入自定义代码来监控或拦截特定的系统事件或者调用。 在线程钩子注入的过程中,通常需要完成以下几个关键步骤: 1. **创建钩子**: 开发者首先需编写一个专门用于处理目标线程中特定操作(如键盘输入、鼠标点击等)发生的钩子函数。Windows API提供了SetWindowsHookEx等一系列接口来设置不同类型的系统级或应用程序内钩子。 2. **获取目标进程信息**: 在向另一个进程中注入代码时,必须先获得该进程的标识符和主线程ID的信息。这可以通过调用GetProcessId等API实现,并利用OpenThread函数访问相关线程资源。 3. **动态库加载**: 为了使我们的钩子功能能够在其他程序中生效,需要创建一个包含所需功能的DLL文件,在目标进程中通过远程线程执行LoadLibrary来加载此DLL。这样可以确保当目标进程运行时能够调用到我们定义的功能代码段。 4. **设置远程钩子**: 利用SetWindowsHookEx函数在指定的目标进程中安装我们的钩子,需要提供进程句柄、特定的线程标识符以及要监视事件类型的参数给该API。同时还要确保DLL已被正确加载进目标环境中以供调用。 5. **处理回调功能**: 当被监控的操作发生时(即触发了我们设置的某个类型),系统会自动执行我们的钩子函数,此时可以在其中实现各种定制化的逻辑操作如记录日志、修改事件行为等。 6. **卸载和清理资源**: 完成所需任务后通过调用UnhookWindowsHookEx来取消先前安装的所有钩子,并释放与目标进程相关联的句柄以避免内存泄漏等问题的发生。 值得注意的是,虽然线程钩子注入技术能够提供强大的功能支持,但同时也可能被恶意软件滥用。因此,在使用时必须严格遵守合法合规的原则并确保不会造成任何安全隐患或侵犯用户隐私的行为。随着系统安全机制的进步与强化,现代操作系统可能会对非管理员权限下的进程进行更严格的限制以防止此类潜在威胁的发生。 线程钩子注入技术是Windows开发中不可或缺的一部分,它为深入了解和控制应用程序提供了重要的手段。但同时也要认识到其可能带来的风险,并在应用时采取适当的预防措施来确保安全性和合法性。
  • EasyHook.rar
    优质
    EasyHook示例演示.rar提供了使用EasyHook库进行远程进程注入和函数钩截的多个实例代码,适用于学习与研究软件逆向和动态监控技术。 EasyHook可以用来让系统计算器显示文字。
  • SetWindowsHookEx
    优质
    本示例程序展示了如何使用SetWindowsHookEx函数在Windows API中设置全局低级挂钩,以监控和修改系统消息处理流程。 SetWindowsHookEx 在64位和32位系统上有所不同,需要分别编译对应的库文件。
  • MFC Hook VS2015
    优质
    本项目提供了一个在VS2015环境下使用MFC框架实现的Hook钩子技术示例,帮助开发者理解和应用Windows消息拦截与处理机制。 VS2015下的钩子例子可以用来抓取PostMessage信息,仅供参考。
  • 编写用于识别C++小及工具开发
    优质
    本项目提供了一个用C++编写的示例程序和相关工具,旨在检测系统中的钩子程序。通过此教程,开发者可以学习到如何创建并使用这些工具来增强软件的安全性与可靠性。 标题中的“开发一个检测钩子程序的工具C++源代码程序小实例”指的是利用C++编程语言设计一个能够检测系统中是否存在钩子程序的小型应用。钩子是Windows操作系统中的一种技术,允许开发者监视和控制特定事件,如键盘输入、鼠标活动等。这个实例将深入探讨如何在C++中实现这一功能。 我们需要了解钩子的基本概念。钩子是Windows API提供的一种机制,通过安装钩子函数,可以在系统中特定事件发生时得到通知。钩子分为不同种类,例如键盘钩子(WH_KEYBOARD)、鼠标钩子(WH_MOUSE)以及消息钩子(WH_GETMESSAGE)等,每种钩子都有其特定的用途和监控范围。 在C++中,创建钩子通常涉及以下几个步骤: 1. 定义钩子处理函数:这是一个回调函数,当指定的事件发生时,Windows会调用它。你需要根据钩子类型来编写相应的处理函数。 2. 安装钩子:使用SetWindowsHookEx函数,传入钩子类型、钩子处理函数的地址、可选的模块句柄以及线程ID,来安装钩子。 3. 处理事件:当钩子被触发时,系统会调用你定义的钩子处理函数。在这里,你可以分析事件并采取相应行动,如记录或阻止某些行为。 4. 卸载钩子:完成检测后,需要使用UnhookWindowsHookEx函数卸载钩子,以避免影响系统的正常运行。 在这个小实例中,我们可能会看到如何在C++中实现这些步骤的具体代码。开发者可能还会用到WinAPI函数,如GetMessage、DispatchMessage等,用于接收和处理来自Windows的消息。 此外,由于项目使用了VC2010,我们可以推测它是一个基于Visual C++ 2010编译器的项目。这意味着代码将遵循Microsoft的C++标准库,并可能包含一些特定于Visual Studio的特性或宏。 通过查看压缩包中的文件(如main.cpp、.h头文件等),可以进一步学习如何在实际项目中设置和使用钩子,以及如何组织C++代码来实现这一功能。这个小实例为我们提供了一个实践C++编程和Windows钩子技术的平台,有助于提升对系统监控和调试的理解。通过学习和分析提供的源代码,我们可以深入理解钩子的工作原理,并学会在自己的项目中运用这一技术。
  • VS2010C++生成Dump文件
    优质
    本文章详细介绍了在Visual Studio 2010环境下,编写C++代码时如何设置和生成dump文件的具体步骤与方法,帮助开发者解决程序崩溃问题。 VS2010 C++程序生成Dump文件的例子可以用来帮助开发者分析程序崩溃的原因。通过使用调试工具或者在项目属性中设置相应的选项,可以在程序异常终止时自动生成一个内存转储(dump)文件。这种做法对于定位和解决问题非常有用,特别是当遇到难以重现的问题时。 要启用VS2010生成Dump文件的功能,请按照以下步骤操作: 1. 打开你的C++项目。 2. 右键点击解决方案资源管理器中的项目名称选择“属性”选项。 3. 在左侧菜单中找到并展开“配置属性”,然后选择“调试信息格式”。将此设置为程序数据库(/Zi)或者详细 (/Z7),这取决于你的具体需求和代码库的大小。 4. 接下来,在左侧列表中选择“错误注入”或直接搜索“生成内核转储文件 (仅限 x64)”并将其值设为 是(所有子进程) 或者只勾选父进程根据实际需要进行配置。 完成上述步骤后,当程序在非Unicode环境下运行时遇到异常终止情况,VS2010将会自动生成一个dump文件。此文件可以用来调试和分析问题原因,并且有助于修复软件中的错误或缺陷。