劫持:
第一步:
编译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模式。
最后还可以劫持系统,也就是阻止系统创建进程。劫持系统也就是劫持系统函数而已。