C++ detours实现简单的系统函数拦截

来源:互联网 发布:广告法 数据来源 编辑:程序博客网 时间:2024/06/04 18:38

哎,将近半年没写了,失踪人口回归,因为博主参加工作了。之前上学的时候,看到很多在学校读书的大牛参加工作之后也很少更新博客,之前不以为意。现在发现确实是工作的空闲时间不如上学的时候,所以也想念以前在大学里面一个人在图书馆一台电脑一瓶矿泉水一天的时光,哈哈。但是呢,有空写写博客,也不是一件坏事呢。


今天实现一个简单的调用detours.lib的静态库实现一个对系统函数(system)的拦截。

主要编程环境依旧是Visual Studio 2017。环境这东西嘛,都一样,哪个方便用哪个喽。

非常简单。按照道理是用Detours Express 3.0,但是官网好像都整合成一个了,也好。

官网detours的静态库下载地址:


下载完之后得到:


解压之后得到一堆文件:


然后打开VS2017的开发人员命令行:


然后进入这个文件夹的src目录下:


输入nmake 命令,编译里面的源文件得到相对应的静态库文件,这里和linux中的Makefile原理是一样的,只不过这里变成了Windows环境的编译。


然后把对应的头文件detours.h,detver.h和detours.lib文件放到你对应程序目录下。

1.



2.



3.



最后一步写出调用源码(注意:解决方案配置用Release模式)

gogogo.c:

#include<stdio.h>#include<stdlib.h>#include<Windows.h>#include"detours.h"                                         //加载头文件#pragma comment(lib,"detours.lib");int (*poldsystem)(char const* _Command) = system;           //记录原来函数的地址int newsystem(_In_opt_z_ char const* _Command) {printf("禁止执行%s",_Command);return 1;}void hook() {DetourRestoreAfterWith();                              //恢复状态,避免反复拦截改变地址DetourTransactionBegin();                              //开始拦截DetourUpdateThread(GetCurrentThread());                //拦截当前线程DetourAttach((void**)&poldsystem, newsystem);          //拦截DetourTransactionCommit();                             //生效}void main() {system("notepad");hook();system("notepad");                                     //禁止system打开记事本怎么办//需要借助detours修改代码区getchar();}


运行效果(好low啊):

1.



2.

原创粉丝点击