什么是Detours

Detours是微软开发的一个函数库,可用于捕获系统API。--百度百科

利用detours可以hook到WIN32的API,原理好像是修改调用API的指令使跳转到用户的函数。(未验证)

Detours的安装

以vs2015为例
下载地址:https://www.microsoft.com/ 我下载的版本是Detours Expressv3.0 Build 343 下载之后是免安装文件,解压就能玩。
把所有的的文件拷贝到 ++VS2015/VC++ 目录下面,运行++vs2015兼容命令行工具++,进入目录++vs2015/vc/src++,执行命令nmake 就可以用了。生成的lib文件在++lib.X64++和++lib.X86++文件夹中,在项目中包含就可以了。

Detours的使用

首先需要制作dll,例如制作hook WriteConsoleW的dll我们需要如下几步:
  • 首先写用户的函数
BOOL(WINAPI * OLD_WriteConsoleW)(HANDLE  hConsoleOutput, const VOID *lpBuffer, DWORD   nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten, LPVOID  lpReserved) = WriteConsoleW;BOOL WINAPI NEW_WriteConsoleW(HANDLE  hConsoleOutput, const VOID *lpBuffer, DWORD   nNumberOfCharsToWrite, LPDWORD lpNumberOfCharsWritten, LPVOID  lpReserved) {HANDLE wPip = GetStdHandle(STD_OUTPUT_HANDLE);WriteFile(wPip, lpBuffer, nNumberOfCharsToWrite*2, lpNumberOfCharsWritten, NULL);return TRUE;
}
  • 然后是调用detours的api写绑定和解绑函数
void Hook() {DetourRestoreAfterWith();DetourTransactionBegin();DetourUpdateThread(GetCurrentThread());DetourAttach((PVOID *)&OLD_WriteConsoleW, NEW_WriteConsoleW);DetourTransactionCommit();
}void UnHook() {DetourTransactionBegin();DetourUpdateThread(GetCurrentThread());DetourDetach((PVOID *)&OLD_WriteConsoleW, NEW_WriteConsoleW);DetourTransactionCommit();
}
  • 最后在DllMain中调用Hook()和UnHook()
BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:Hook();break;case DLL_THREAD_ATTACH:break;case DLL_THREAD_DETACH:break;case DLL_PROCESS_DETACH:UnHook();break;}return TRUE;
}

如果找不到DllMain请打开工程中的++dllmain.cpp++。
一定要有一个导出函数不然之后会报错0xc000007b

然后要将dll加载到exe中

这儿可以自己写dll注射器,也可以调用detours的CreateProcessWithDll,我采用的方法是后者

DetourCreateProcessWithDllA(NULL, "C:\\Users\\hasee\\Desktop\\tellnet\\telnet.exe", NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS|CREATE_NEW_CONSOLE, NULL, NULL, &si, pi, "D:\\Visual_studio_test\\VirusExcercise\\Fortelnet\\detoursTest3\\Debug\\detoursTest3.dll", NULL);

前面的参数和Winodes api CreateProcess一样,倒数第二个是dll地址,最后一个写NULL就行。

至此每当被调用程序的WriteCosoleW要被执行的时候就会先执行我们的NEW_WriteCosoleW函数。

转载于:https://www.cnblogs.com/rlee063/p/8695049.html

Detours 简介与简单使用相关推荐

  1. Spring AOP 简介以及简单用法

    Spring AOP 简介以及简单用法 如果你去面试java开发, 那么Spring的AOP和DI几乎是必问的问题. 那么AOP是什么呢? 一. AOP 所谓Aop就是 Aspect-Oriented ...

  2. 重要性采样(Importance Sampling)简介和简单样例实现

    重要性采样(Importance Sampling)简介和简单样例实现 在渲染领域,重要性采样这个术语是很常见的,但它究竟是什么呢?我们首先考虑这样的一种情况: 如果场景里有一点P,我们想计算P点的最 ...

  3. ONENET平台简介及简单的接入方法

    ONENET平台简介及简单的接入方法 OneNET是中国移动物联网有限公司响应"大众创新.万众创业"以及基于开放共赢的理念,面向公共服务自主研发的开放云平台,为各种跨平台物联网应用 ...

  4. knockout.js的简介和简单使用

    1.knockout简介 knockout是一个轻量级的UI类库,通过MVVM模式使JavaScript前端UI简单化 knockout有四大重要概念: 1)声明式绑定:使用简明移读的语法很容易地将模 ...

  5. dbus的代码范例 linux_Dbus简介与简单的收发示例程序

    Dbus简介与简单的收发示例程序. D-BUS 是一个大有前途的消息总线和活动系统,正开始深入地渗透到 Linux® 桌面之中.了解创建它的原因.它的用途以及发展前景. D-BUS 本质上是 进程间通 ...

  6. matlab guide的简介和简单使用

    Matlab guide简介和简单使用 简介 快捷键 1.对其对象键 2.菜单编辑器 两种菜单的设计方法 3.Tab键顺序编辑器 4.属性检查器 gui数据管理机制 guide实例 实例一画图 实例二 ...

  7. 【gTest】gtest简介及简单使用

    [gTest]gtest简介及简单使用 gtest是一个跨平台(Liunx.Mac OS X.Windows.Cygwin.Windows CE and Symbian)的C++测试框架,有googl ...

  8. MongoDB自学笔记8--- 3.3 MongoDB Shell简介及简单使用

     3.3 MongoDB Shell简介及简单使用 mongoDB Shell是mongoDB自带的一个javascript shell,随mongoDB安装包一同发布.可以使用mongoDB she ...

  9. Java Iterator 接口简介和简单用法.

    Iterator 的中文意思是迭代器. 单单从中文翻译也不易理解迭代器的意思啊,  其实Iterator是1个接口,  它的作用就是遍历容器的所有元素. 一, Iterator 接口简介 Iterat ...

最新文章

  1. 跟刘强东、雷军等大佬聊天后,我总结了:如何结交牛人,跟大咖做朋友!
  2. 【转】Python3 (入门6) 库的打包与安装
  3. produces在@requestMapping中的使用方式和作用
  4. 国科大prml15-目标检测
  5. tt桌球瞄准器手机版_法国或将禁止不可拆卸手机,想当年手机后盖随便拆开玩儿...
  6. python安全性_关于python安全性的问题
  7. idea的文件可以mysql运行吗,终于将tiny-sdpm+intellij idea+mysql+jettyt运行成功
  8. webstorm 主题导入方法
  9. 软考高项-质量管理论文范文
  10. 计算机核心期刊新排名(八大学报)
  11. 程序员加油站 -- 懂电脑更要懂人脑!继“书呆子”后又一呆子现世!
  12. linux centos 访问根目录 not accessable
  13. 微信小程序,图片双指放大缩小
  14. Python性能分析入门——cProfile、可视化、逐行分析、内存分析
  15. app:processDebugManifest 错误
  16. 广域网(PPP协议和HDLC协议)
  17. C++17新特性总结
  18. 安天每日安全简讯20160712
  19. js实现键盘按键s进入搜索框
  20. Python各种镜像链接——一蓑烟雨任平生

热门文章

  1. 基于Wav2Lip的AI主播
  2. 链接chinanet无法出现登陆界面(电脑),360开wifi说缺少一个网卡
  3. Function 函数式接口及应用
  4. 支持linux浏览器,让 Linux web 浏览器支持 KDE 的 KParts 技术
  5. 如何删除重复的DS_SERVICE_PRINCIPAL_NAME账户|spn
  6. U盘安装Linux系统教程步骤
  7. “以电折水、水电共计”智能仪表助力农业灌溉走上新模式
  8. 学习Unity3D第一天之基础入门。
  9. Spring框架技术总结(一)
  10. 【Java面试题】之内存泄漏