Detours实现劫持

劫持:

第一步:

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

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

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

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

 

 

 

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

 

 Detours实现劫持_第1张图片

#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模式。

 

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

 


你可能感兴趣的:(Detours实现劫持)