添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
俊逸的肉夹馍  ·  基于Windows ...·  2 月前    · 
很拉风的山羊  ·  如何将已有 Maven ...·  1 月前    · 
开朗的领带  ·  百度网盘bl文合集 - 百度·  7 月前    · 
奔放的梨子  ·  altium ...·  8 月前    · 
傻傻的瀑布  ·  android ...·  1 年前    · 
完美的苦瓜  ·  Search - Government.se·  1 年前    · 

编译Detours工程。
在安装目录C:\Program Files\Microsoft Research\Detours Express 3.0\src目录下的是工程的 源文件

(1)打开VS2013命令行工具,进入src目录。

(2)使用nmake( linux 下是make)命令编译生成静态库

劫持的原理就是把目标函数的指针的指向修改为自定义函数的地址。
函数是放在内存中的代码区,所以劫持与代码区密切相关。实现劫持需要使用detours。

第二步:将所需要的头文件 静态库文件放在当前工程路径下

#include<stdlib.h>

#include<stdio.h>

#include<Windows.h>

#include "detours.h" //载入头文件第三步

#pragma comment(lib,"detours.lib") //表明要使用静态库

//第四步:定义旧函数指针指向原来的函数

static int (*oldsystem)(const char *_Command) = system;

//第五步:声明一个和原函数参数相同的新函数

int newsystemA(char *_Command)

//这里相当于一个加锁:只要是tasklist我就劫持,不让你执行。

//char *p = strstr(_Command, "tasklist");

//if (p == NULL)

//oldsystem(_Command);

//else

//printf("%s", _Command); //找到了,禁止执行

//return 0;

printf("%s", _Command);   //找到了,禁止执行

return 0;

//第六步:开始拦截

//开始拦截

void Hook()

DetourRestoreAfterWith();//恢复原来状态,

DetourTransactionBegin();//拦截开始

DetourUpdateThread(GetCurrentThread());//刷新当前线程

//这里可以连续多次调用DetourAttach,表明HOOK多个函数

DetourAttach((void **)&oldsystem, newsystemA);//实现函数拦截

DetourTransactionCommit();//拦截生效

//第七步:取消拦截

//取消拦截

void UnHook()

DetourTransactionBegin();//拦截开始

DetourUpdateThread(GetCurrentThread());//刷新当前线程

//这里可以连续多次调用DetourDetach,表明撤销多个函数HOOK

DetourDetach((void **)&oldsystem, newsystemA);//撤销拦截函数

DetourTransactionCommit();//拦截生效

//第八步:main函数运行,大功告成

void main()

system("calc");

Hook();

system("calc");

system("tasklist");

//UnHook();

getchar();

当然我们还可已使用如下方式实现劫持其他的进程

注射的方式:

_declspec(dllexport)void go()

Hook();

在这里要注意:劫持的时候需要将 Debug 模式变成Release模式。

最后还可以劫持系统,也就是阻止系统创建进程。劫持系统也就是劫持系统函数而已。

GPU软件工程师 29.4k