《Windows核心编程》---CAPIHook类

CAPIHook类代码 有错误有错误有错误有错误有错误有错误有错误有错误 立即下载

封装CAPIHook类:(某本书的笔记)

 

1)HOOK所有模块

HOOK一个进程对某个API的调用时,不仅要修改主模块的导入表,还必须遍历此进程的所有模块,替换掉每个对目标API的调用:

void CAPIHook::ReplaceIATEntryInOneMod(LPSTR pszExportMod, PROC pfnCurrent,

                            PROC pfnNew, HMODULE hModCaller)

{

       //取得模块的导入表(import descriptor)的首地址

       //ImageDirectoryEntryToData函数可以返回导入表地址

       ULONG ulSize;

       PIMAGE_IMPORT_DESCRIPTOR pImportDesc =

              (PIMAGE_IMPORT_DESCRIPTOR)::ImageDirectoryEntryToData(hModCaller, TRUE,

                                                                             IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize);

       if(pImportDesc == NULL)      //这个模块没有导入表项

              return;  

       //查找包含pszExportMod模块中函数导入信息的导入表项

       while(pImportDesc->Name != 0)

       {

              LPSTR pszMod = (LPSTR)((DWORD)hModCaller + pImportDesc->Name);

              if (lstrcmpiA(pszMod, pszExportMod) == 0)   //找到

              {

                     break;

              }

              pImportDesc++;

       }

 

       if (pImportDesc->Name == 0)    //hModCaller模块没有从pszExportMod模块导入任何函数

       {

              return;

       }

 

       //取得调用者的导入地址表(import address table, IAT)

       PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)(pImportDesc->FirstThunk +

                                                                             (DWORD)hModCaller);

       //查找我们要HOOK的函数,将它的地址用新函数的地址替换掉

       while (pThunk->u1.Function)

       {

              //lpAddr指向的内存保存了函数的地址

              PDWORD lpAddr = (PDWORD)&(pThunk->u1.Function);

              if (*lpAddr == (DWORD)pfnCurrent)

              {

                     //修改页的保护属性

                     DWORD dwOldProtect;

                     MEMORY_BASIC_INFORMATION mbi;

                     ::VirtualQuery(lpAddr, &mbi, sizeof(mbi));

                     ::VirtualProtect(lpAddr, sizeof(DWORD), PAGE_READWRITE, &dwOldProtect);

 

                     //修改内存地址,相当于"lpAddr = (DWORD)pfnNew;"

                     ::WriteProcessMemory(::GetCurrentProcess(), lpAddr,

                                   &pfnNew, sizeof(DWORD), NULL);

                     ::VirtualProtect(lpAddr, sizeof(DWORD), dwOldProtect, 0);

                     break;

              }

              pThunk++;

       }

}

 

void CAPIHook::ReplaceIATEntryInAllMods(LPSTR pszExportMod, PROC pfnCurrent,

                                                        PROC pfnNew, BOOL bExcludeAPIHookMod)

{

       //取得当前模块的句柄

       HMODULE hModThis = NULL;

       if(bExcludeAPIHookMod)

       {

              MEMORY_BASIC_INFORMATION mbi;

              if(::VirtualQuery(ReplaceIATEntryInAllMods, &mbi, sizeof(mbi)) != 0)

                     hModThis = (HMODULE)mbi.AllocationBase;

       }

 

       //取得本进程的模块列表

       HANDLE hSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ::GetCurrentProcessId());

 

       //遍历所有模块,分别对它们调用ReplaceIATEntryInOnMod函数,修改导入地址表

       MODULEENTRY32 me = {sizeof(MODULEENTRY32)};

       BOOL bOK = ::Module32First(hSnap, &me);

       while (bOK)

       {

              //注意,我们不HOOK当前模块的函数

              if (me.hModule != hModThis)

              {

                     ReplaceIATEntryInOneMod(pszExportMod, pfnCurrent, pfnNew, me.hModule);

              }

 

              bOK = ::Module32Next(hSnap, &me);

       }

       ::CloseHandle(hSnap);

}

ReplaceIATEntryInOneMod函数修改hModCaller模块的IAT,将所有对pfnCurrent函数的调用改为对pfnNew函数的调用,参数pszExportMod是目标API所在的模块。例如,为了将自定义的函数AceMessageBoxA替换当前模块中的MessageBoxA函数,可以调用如下:

CAPIHOOK::ReplaceIATEntryInOneMod("User32.dll",

       (PROC)AceMessageBoxA, (PROC)MessageBoxA, ::GetModuleHandle(NULL));

ReplaceIATEntryInAllMods函数修改进程内所有模块的IAT,挂钩用户指定的API函数,最后一个参数bExcludeAPIHookMod指定是否将负责HOOK API的模块排除在外。

由于CAPIHook类工作在一个单独的DLL中,为了在此模块中方便地调用原来的API函数,一般选择不HOOK当前模块的函数,即将bExcludeAPIHookMod设为TRUE。

 

2)防止程序在运行期间动态加载模块

在HOOK完目标进程当前所有模块之后,目标进程还可以调用LoadLibrary函数加载新的模块。为了将今后目标进程动态加载的模块也HOOK掉,我们可以默认挂钩LoadLibrary之类的函数。方法就是在代理函数中首先调用原来的LoadLibrary函数,然后再对新加载的模块调用ReplaceIATEntryInOneMod函数。

我们设替换LoadLibrary的自定义函数是HookNewlyLoadedModule。一个CAPIHook对象仅能够挂钩一个API函数,为了挂钩多个API,用户很可能申请了多个CAPIHook对象,所以,在自定义函数HookNewlyLoadedModule中,必须为每个CAPIHook对象调用ReplaceIATEntryInOneMod函数才能确保新模块中相应的IAT项被修改。因此,我们需要记录用户申请的所有CAPIHook对象的指针。

比较简单的方法是将所有CAPIHook对象连成一个链表,用一个静态变量记录下表头地址,在每个CAPIHook对象中再记录表中下一个CAPIHook对象的地址:

class CAPIHook

{

       //这两个指针用来将当前模块中所有的CAPIHook对象连在一起

       static CAPIHook *sm_pHeader;

       CAPIHook *m_pNext;

}

静态函数HookNewlyLoadedModule的实现代码如下:

void WINAPI CAPIHook::HookNewlyLoadedModule(HMODULE hModule, DWORD dwFlags)

{

       //如果一个新的模块被加载,挂钩各CAPIHook对象要求的API函数

       if((hModule != NULL) && ((dwFlags&LOAD_LIBRARY_AS_DATAFILE) == 0 ))

       {

              CAPIHook *p = sm_pHeader;

              while(p != NULL)

              {

                     ReplaceIATEntryInOneMod(p->m_pszModName, p->m_pfnOrig,

                                   p->m_pfnHook, hModule);

                     p = p->m_pNext;   

              }

       }

}

其中,dwFlags是LoadLibraryEx函数的一个附加参数,它指定了加载时采取的行动,只要它的值中不包含LOAD_LIBRARY_AS_DATAFILE标记,就说明文件要以镜像方式映射到内存中。

 

3)防止程序在运行期间动态调用API函数

并不是只有经过导入表才能调用API函数,应用程序可以在运行期间调用GetProcAddress函数取得API函数的地址再调用它,因此,我们也需要默认挂钩GetProcAddress函数。CAPIHook类的静态成员函数GetProcAddress将替换这个API:

FARPROC WINAPI CAPIHook::GetProcAddress(HMODULE hModule, PCSTR pszProcName)

{

       //得到这个函数的真实地址

       FARPROC pfn = ::GetProcAddress(hModule, pszProcName);

       //看它是不是我们要hook的函数

       CAPIHook *p = sm_pHeader;

       while(p != NULL)

       {

              if(p->m_pfnOrig == pfn)

              {

                     pfn = p->m_pfnHook;

                     break;   

              }     

              p = p->m_pNext;

       }     

       return pfn;

}

 

下面是完整的CAPIHook类的实现:

=====================APIHook.h============================

#ifndef __APIHOOK_H__

#define __APIHOOK_H__

#include <windows.h>

class CAPIHook 

{

public:

       CAPIHook(LPSTR  pszModName, LPSTR pszFuncName,

                            PROC pfnHook, BOOL bExcludeAPIHookMod=TRUE);

       virtual ~CAPIHook();

       operator PROC() {return m_pfnOrig;}

 

private:

       LPSTR m_pszModName;        //导出要HOOK函数的模块的名字

       LPSTR m_pszFuncName;  //要HOOK的函数的名字

       PROC m_pfnOrig;                  //原API函数地址

       PROC m_pfnHook;                //HOOK后函数的地址

       BOOL m_bExcludeAPIHookMod; //是否将HOOK API的模块本身排除在外

 

private:

       static void ReplaceIATEntryInAllMods(LPSTR pszExportMod, PROC pfnCurrent,

                     PROC pfnNew, BOOL bExcludeAPIHookMod);

       static void ReplaceIATEntryInOneMod(LPSTR pszExportMod, PROC pfnCurrent,

                     PROC pfnNew, HMODULE hModCaller);

 

       //下面的代码用来解决其他模块动态加载DLL的问题

private:

       //这两个指针用来将所有的CAPIHook对象连在一起

       static CAPIHook *sm_pHeader;

       CAPIHook *m_pNext;

 

private:

       //当一个新的DLL被加载时,调用此函数

       static void WINAPI HookNewlyLoadedModule(HMODULE hModule, DWORD dwFlags);

       //用来跟踪当前进程加载新的DLL

       static HMODULE WINAPI LoadLibraryA(PCSTR pszModulePath);

       static HMODULE WINAPI LoadLibraryW(PCWSTR pszModulePath);

       static HMODULE WINAPI LoadLibraryExA(PCSTR pszModulePath, HANDLE hFile, DWORD dwFlags);

       static HMODULE WINAPI LoadLibraryExW(PCWSTR pszModulePath, HANDLE hFile, DWORD dwFlags);

       //如果请求已HOOK的API函数,则返回用户自定义函数的地址

       static FARPROC WINAPI GetProcAddress(HMODULE hModule, PCSTR pszProcName);

 

private:

       //自动对这些函数进行挂钩

       static CAPIHook sm_LoadLibraryA;

       static CAPIHook sm_LoadLibraryW;

       static CAPIHook sm_LoadLibraryExA;

       static CAPIHook sm_LoadLibraryExW;

       static CAPIHook sm_GetProcAddress;

 

};

#endif

 

========================APIHook.cpp========================

#include "APIHook.h"

#include "Tlhelp32.h"

#include <ImageHlp.h>  //为了调用ImageDirectoryEntryToData函数

#pragma comment(lib, "ImageHlp")

 

//CAPIHook对象链表的头指针

CAPIHook *CAPIHook::sm_pHeader = NULL;

 

//////////////////////////////////////////////////////////////////////

// Construction/Destruction

//////////////////////////////////////////////////////////////////////

 

CAPIHook::CAPIHook(LPSTR pszModName, LPSTR pszFuncName,

                               PROC pfnHook, BOOL bExcludeAPIHookMod/* =TRUE */)

{

       //保存这个Hook函数的信息

       m_bExcludeAPIHookMod = bExcludeAPIHookMod;

       m_pszModName = pszModName;

       m_pszFuncName = pszFuncName;

       m_pfnHook = pfnHook;

       m_pfnOrig = ::GetProcAddress(::GetModuleHandle(pszModName), pszFuncName);

 

       //将此对象添加到链表中

       m_pNext = sm_pHeader;

       sm_pHeader = this;

       //在所有当前已加载的模块中HOOK这个函数

       ReplaceIATEntryInAllMods(m_pszModName, m_pfnOrig, m_pfnHook,

                     bExcludeAPIHookMod);

}

 

CAPIHook::~CAPIHook()

{

       //取消对所有模块中函数的HOOK

       ReplaceIATEntryInAllMods(m_pszModName, m_pfnHook, m_pfnOrig,

                     m_bExcludeAPIHookMod);

       CAPIHook *p = sm_pHeader;

       //从链表中移除此对象

       if(p == this)

       {

              sm_pHeader = p->m_pNext;

       }

       else

       {

              while(p != NULL)

              {

                     if(p->m_pNext == this)

                     {

                            p->m_pNext = this->m_pNext;

                            break;

                     }

                     p = p->m_pNext;

              }

       }

      

}

 

void CAPIHook::ReplaceIATEntryInOneMod(LPSTR pszExportMod, PROC pfnCurrent,

                                                               PROC pfnNew, HMODULE hModCaller)

{

       //取得模块的导入表(import descriptor)的首地址

       //ImageDirectoryEntryToData函数可以返回导入表地址

       ULONG ulSize;

       PIMAGE_IMPORT_DESCRIPTOR pImportDesc =

              (PIMAGE_IMPORT_DESCRIPTOR)::ImageDirectoryEntryToData(hModCaller, TRUE,

                                                                             IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize);

       if(pImportDesc == NULL)      //这个模块没有导入表项

              return;  

       //查找包含pszExportMod模块中函数导入信息的导入表项

       while(pImportDesc->Name != 0)

       {

              LPSTR pszMod = (LPSTR)((DWORD)hModCaller + pImportDesc->Name);

              if (lstrcmpi(pszMod, pszExportMod) == 0)      //找到

              {

                     break;

              }

              pImportDesc++;

       }

 

       if (pImportDesc->Name == 0)    //hModCaller模块没有从pszExportMod模块导入任何函数

       {

              return;

       }

 

       //取得调用者的导入地址表(import address table, IAT)

       PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)(pImportDesc->FirstThunk +

                                                                             (DWORD)hModCaller);

       //查找我们要HOOK的函数,将它的地址用新函数的地址替换掉

       while (pThunk->u1.Function)

       {

              //lpAddr指向的内存保存了函数的地址

              PDWORD lpAddr = (PDWORD)&(pThunk->u1.Function);

              if (*lpAddr == (DWORD)pfnCurrent)

              {

                     //修改页的保护属性

                     DWORD dwOldProtect;

                     MEMORY_BASIC_INFORMATION mbi;

                     ::VirtualQuery(lpAddr, &mbi, sizeof(mbi));

                     ::VirtualProtect(lpAddr, sizeof(DWORD), PAGE_READWRITE, &dwOldProtect);

 

                     //修改内存地址,相当于"lpAddr = (DWORD)pfnNew;"

                     ::WriteProcessMemory(::GetCurrentProcess(), lpAddr,

                                   &pfnNew, sizeof(DWORD), NULL);

                     ::VirtualProtect(lpAddr, sizeof(DWORD), dwOldProtect, 0);

                     break;

              }

              pThunk++;

       }

}

 

void CAPIHook::ReplaceIATEntryInAllMods(LPSTR pszExportMod, PROC pfnCurrent,

                                                        PROC pfnNew, BOOL bExcludeAPIHookMod)

{

       //取得当前模块的句柄

       HMODULE hModThis = NULL;

       if(bExcludeAPIHookMod)

       {

              MEMORY_BASIC_INFORMATION mbi;

              if(::VirtualQuery(ReplaceIATEntryInAllMods, &mbi, sizeof(mbi)) != 0)

                     hModThis = (HMODULE)mbi.AllocationBase;

       }

 

       //取得本进程的模块列表

       HANDLE hSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ::GetCurrentProcessId());

 

       //遍历所有模块,分别对它们调用ReplaceIATEntryInOnMod函数,修改导入地址表

       MODULEENTRY32 me = {sizeof(MODULEENTRY32)};

       BOOL bOK = ::Module32First(hSnap, &me);

       while (bOK)

       {

              //注意,我们不HOOK当前模块的函数

              if (me.hModule != hModThis)

              {

                     ReplaceIATEntryInOneMod(pszExportMod, pfnCurrent, pfnNew, me.hModule);

              }

 

              bOK = ::Module32Next(hSnap, &me);

       }

       ::CloseHandle(hSnap);

}

 

//挂钩LoadLibrary和GetProcAddress函数,以便在这些函数被调用以后,挂钩的函数也能够被正确的处理

CAPIHook CAPIHook::sm_LoadLibraryA("Kernel32.dll", "LoadLibraryA",

                                                           (PROC)CAPIHook::LoadLibraryA, TRUE);

CAPIHook CAPIHook::sm_LoadLibraryW("Kernel32.dll", "LoadLibraryW",

                                                           (PROC)CAPIHook::LoadLibraryW, TRUE);

CAPIHook CAPIHook::sm_LoadLibraryExA("Kernel32.dll", "LoadLibraryExA",

                                                                (PROC)CAPIHook::LoadLibraryExA, TRUE);

CAPIHook CAPIHook::sm_LoadLibraryExW("Kernel32.dll", "LoadLibraryExW",

                                                                (PROC)CAPIHook::LoadLibraryExW, TRUE);

CAPIHook CAPIHook::sm_GetProcAddress("Kernel32.dll", "GetProcAddress",

                                                                (PROC)CAPIHook::GetProcAddress, TRUE);

 

void WINAPI CAPIHook::HookNewlyLoadedModule(HMODULE hModule, DWORD dwFlags)

{

       //如果一个新的模块被加载,挂钩各CAPIHook对象要求的API函数

       if((hModule != NULL) && ((dwFlags&LOAD_LIBRARY_AS_DATAFILE) == 0))

       {

              CAPIHook *p = sm_pHeader;

              while (p != NULL)

              {

                     ReplaceIATEntryInOneMod(p->m_pszModName, p->m_pfnOrig,

                                                                      p->m_pfnHook, hModule);

                     p = p->m_pNext;

              }

       }

}

 

HMODULE WINAPI CAPIHook::LoadLibraryA(PCSTR pszModulePath)

{

       HMODULE hModule = ::LoadLibraryA(pszModulePath);

       HookNewlyLoadedModule(hModule, 0);

       return hModule;

}

 

HMODULE WINAPI CAPIHook::LoadLibraryW(PCWSTR pszModulePath)

{

       HMODULE hModule = ::LoadLibraryW(pszModulePath);

       HookNewlyLoadedModule(hModule, 0);

       return hModule;

}

 

HMODULE WINAPI CAPIHook::LoadLibraryExA(PCSTR pszModulePath, HANDLE hFile, DWORD dwFlags)

{

       HMODULE hModule = ::LoadLibraryExA(pszModulePath, hFile, dwFlags);

       HookNewlyLoadedModule(hModule, dwFlags);

       return hModule;

}

 

HMODULE WINAPI CAPIHook::LoadLibraryExW(PCWSTR pszModulePath, HANDLE hFile, DWORD dwFlags)

{

       HMODULE hModule = ::LoadLibraryExW(pszModulePath, hFile, dwFlags);

       HookNewlyLoadedModule(hModule, dwFlags);

       return hModule;

}

 

FARPROC WINAPI CAPIHook::GetProcAddress(HMODULE hModule, PCSTR pszProcName)

{

       //得到函数的真实地址

       FARPROC pfn = ::GetProcAddress(hModule, pszProcName);

       //看它是否我们要HOOK的函数

       CAPIHook *p = sm_pHeader;

       while(p != NULL)

       {

              if (p->m_pfnOrig == pfn)

              {

                     pfn = p->m_pfnHook;

                     break;

              }

              p = p->m_pNext;

       }

       return pfn;

}

封装CAPIHook类 封装CAPIHook类 c++ 立即下载

相关推荐

【Java完整版 面试必备】Leetcode Top100题目和答案-滑动窗口篇

【Java完整版 面试必备】Leetcode Top100题目和答案-滑动窗口篇

weixin_43298211的博客 2245

利用HOOK API做进程保护器

其实就很简单,只是对TerminateProcess的HOOK,因为要阻止的不是本进程的,所以要用到全局钩子,也就是把他做成dll形式的! 首先,对前面的HOOK API进行封装CAPIHook:   [cpp] view plain copy /////////////////////////////////////////////////////////   // APIHook...

bruce135lee的专栏 2026

Kindle电子书DRM破解全攻略:从下载到转换的完整流程(含最新DeDRM插件配置)

本文详细介绍了2025年最新Kindle电子书DRM移除的完整实战流程。针对亚马逊加密机制的升级,文章重点讲解了如何配置最新的DeDRM插件、从新版Kindle客户端提取密钥,并利用Calibre完成电子书的解密与格式转换,为个人备份提供了一套可行的解决方案。

weixin_29279153的博客 1732

windows注入续讲

本文内容引述至《windows核心编程》 DLL注入 Dll注入除了使用前文《windows注入》中所推荐的三种方法 修改注册表 Hook RemoteThread 还有其他的注入方式 木马注入DLL 木马注入常见的黑客手法,把预知常见的进程必然载入的DLL库同名替换。 Dll库除了名字要相同,还有原来DLL中导出的所有符号,而且随着替换的Dll版本发生变化,更改了导入表甚至是导入地址,那么这...

WeinKee的博客 369

求助:有没有基于pscad的锂电池仿真模型

求助:有没有基于pscad的锂电池仿真模型 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变没有 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写...

qq_38922523的博客 1222

在matlab中运行自带的模块(以CCSDS LDPC Decoder模块为例)

最新版的获取需要注册 MathWorks 账户 访问账户注册页面:www.mathworks.cn/mwaccount/register。下载新版本或历史版本的MATLAB,请登陆:https://www.mathworks.cn/downloads 并下载。点击此处可以拷贝调用例程的命令,在matlab命令行输入即可自动获取代码。可以看到页面中写了该模块需要在R2022b以上版本使用。运行.m文件可以生成simulink运行所需要的数据。可以看到左侧下载到了官方历程的文件。之后双击slx文件即可打开。

qq_28455081的博客 885

HOOK专题(转)

HOOK专题目录基本概念 运行机制 钩子类型 作者基本概念钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。钩子实际上是一个处理消息的程序段,通过系

刘雁行的专栏 2163

设计的多实例引用(Multiple Instances of a Design Reference)

一、什么是“设计的多实例引用” 在层次化的设计中,我们经常会将一个module例化多份,这些例化的instance就是设计的module的多实例引用。 二、为什么要解决多实例引用 三、怎么解决多实例引用 ...

kevindas的博客 3719

(来自windows核心编程)API Hook的试验记录

直接pudn找到windows viac 的源码(第五版?) 找到22-LastMsgBoxInfo工程 开始试验发现挂在了CAPIHook::GetProcAddress 错误是stack overflow 然后去掉 CAPIHook CAPIHook::sm_GetProcAddress("Kernel32.dll", "GetProcAddress", (PROC) CAPI...

weixin_34406061的博客 166

深入理解EtherCAT状态机:从IGH代码看伺服电机如何从‘上电’到‘使能’

本文深入解析EtherCAT状态机的工作原理,重点探讨伺服电机从'上电'到'使能'的状态转换过程。通过分析状态字(Status Word)和控制字(Control Word)的交互机制,结合IGH代码实例,揭示DS402状态机的核心逻辑,帮助工程师解决60%以上的伺服控制问题,提升EtherCAT网络调试效率。

weixin_42549037的博客 288

zynq7020的arm A9核降频实录

zynq arm9 cortex a9 降频

qq_40011737的博客 8764

windows 核心编程第五版 源代码 无法编译的问题

      这段时间没事做,找了本windows 核心编程第五版 来看,下了源代码,编译,200多的编译错误。上网找了下,都说装最新的SDK,当然,如果是家里的电脑,那安装就好了。如果是工作电脑最好就谨慎点。装了SDK也不一定好使,有的哥们装了,原来的又编译不过了,都是路径的问题。      其实也不一定需要更新SDK,主要是认真看看问题,第五版是关联到VISTA,所以有些宏或函数就变成在之下的系...

weixin_33909059的博客 227

YOLOv9电力巡检实战:绝缘子破裂/鸟巢识别+无人机自动定位

摘要:本文聚焦电力输电线路巡检的效率与安全痛点,提出基于YOLOv9与无人机的智能巡检解决方案。针对绝缘子破裂、鸟巢等高危缺陷,通过“无人机改装-模型训练-缺陷识别-工单生成”四阶段工程落地流程,实现全自动化巡检。系统采用大疆M300无人机搭载RTK模块与Jetson边缘计算盒,结合改进YOLOv9模型实时识别5类缺陷,通过4G传输将GPS定位与缺陷数据同步至工单系统。实测表明,该方案巡检效率达50公里/天(较人工提升10倍),缺陷发现率95%(提升40%),事故预防率98%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1509

windows钩子保护自身进程不被破坏

【代码】windows钩子保护自身进程不被破坏。

qiufeng_xinqing的专栏 477

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

windows钩子,APIhook

全局监控剪贴板 思路,DLL全局APIhook,在应用层做的话比较简单,但是可能会有很多情况无法实现。 1钩子 ---- 在Windows系统中,钩子(hook)是一种特殊的消息处理机制。勾子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的勾子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕

旧雨绵绵的专栏 1205

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

用钩子实现API拦截(解决延迟加载模块问题)

转载:http://9200cs.blog.163.com/blog/static/1345773692011859337260/ 最近在研究Windows Ring3上的API Hook,对HOOK导入表这种方法进行了研究。HOOK导入表所用的C++类大同小异,不同的就是如何实现HOOK一个延迟加载的模块中的函数,以及FreeLibaray某个函数之后再次LoadLibaray加载这个

slionls的专栏 1615

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

HOOK技术的一些简单总结

好久没写博客了, 一个月一篇还是要尽量保证,今天谈下Hook技术。 在Window平台上开发任何稍微底层一点的东西,基本上都是Hook满天飞, 普通应用程序如此,安全软件更是如此, 这里简单记录一些常用的Hook技术。 SetWindowsHookEx 基本上做Windows开发都知道这个API, 它给我们提供了一个拦截系统事件和消息的机会, 并且它可以将我们的DLL注入到其他进程。...

weixin_34396902的博客 1812

单进程机器码hook_HOOK技术的一些简单总结

好久没写博客了, 一个月一篇还是要尽量保证,今天谈下Hook技术。在Window平台上开发任何稍微底层一点的东西,基本上都是Hook满天飞, 普通应用程序如此,安全软件更是如此, 这里简单记录一些常用的Hook技术。基本上做Windows开发都知道这个API, 它给我们提供了一个拦截系统事件和消息的机会, 并且它可以将我们的DLL注入到其他进程。但是随着64位时代的到来和Vista之后的UAC机制...

weixin_33533460的博客 1273
上一篇: 《Windows核心编程》---HOOK API基础
下一篇: 《Windows核心编程》---检测PE文件有效性
ACE1985
博客等级 码龄17年 1307粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值