1. 安装DetoursExpress30.msi,点击安装,安装后的目录结构如下:
在sample里面有例子,可供查看使用
2.第一步,打开VS2013开发人员命令提示(E:\Installed\MicrosoftVisual Studio 12.0\Common7\Tools\Shortcuts\VS2013 开发人员命令提示),进入Detours安装目录下的src目录,效果图如下:
2.新建项目,暂定项目名称是“劫持”
3.lib知识点
选中解决翻案à添加à新建项目à常规,输入lib名称
创建一个1.c文件
同理,添加一个1.h,内容如下
void msg();
添加一个1.c,内容如下:
#include
void msg()
{
MessageBoxA(0, "11111", "2222", 0);
}
右击项目à属性à常规à配置类型à静态库.lib
然后,生成à生成lib,执行完成后发现资源目录里面的Debug目录下就有lib.lib文件了。
如果想在劫持项目中使用自己写的静态链接库。右击劫持项目à属性à链接器à常规à输入à附加依赖库,在最前面添加 lib.lib; 截图如下:
将lib.lib文件放到源文件同级目录下,截图如下:
在劫持项目里的hello.c文件中添加函数声明
#include
#include
voidmsg();
void main()
{
printf("hello world");
getchar();
}
这时候运行的时候就可以调用了lib.lib了。
动态库随时加载,随时注入。
静态库只有在编译的时候才可以调用。
4.使用detours做劫持(将项目改成release模式),其中项目结构如下(下面是劫持自己的过程):
A放文件有:
detours.h (src下)
detours.lib (lib.X86下)
detver.h (src下)
将上面的文件放在源文件目录下即可
B.添加
#include"detours.h" //载入头文件
#pragma comment(lib, "detours.lib")//表明要使用静态库
C:定义一个新的函数取代旧的函数。
int newsystem(const char *_Command) //新的函数
{
return 0;
}
D:添加Hook()方法和UnHook();
E:设置上detours.lib,方法是:右击项目à属性à链接器à输入à附加依赖项。截图:
#include
#include
#include
#include "detours.h" //载入头文件
#pragma comment(lib,"detours.lib")//表明要使用的静态库
//detour在realse模式生效
//创建函数指针等于地址,加上静态防止影响其它的源文件
static int(*oldsystem)(constchar* _Command) =system;
int newsystem(constchar * _Command) //新的函数
{
return 0;
}
//开始拦截
void Hook()
{
DetourRestoreAfterWith();//恢复原来状态,
DetourTransactionBegin();//拦截开始
DetourUpdateThread(GetCurrentThread());//刷新当前线程
//这里可以连续多次调用DetourAttach,表明HOOK多个函数
DetourAttach((void **)&oldsystem,newsystem);//实现函数拦截
DetourTransactionCommit();//拦截生效
}
//取消拦截
void UnHook()
{
DetourTransactionBegin();//拦截开始
DetourUpdateThread(GetCurrentThread());//刷新当前线程
//这里可以连续多次调用DetourDetach,表明撤销多个函数HOOK
DetourDetach((void **)&oldsystem,newsystem); //撤销拦截函数
DetourTransactionCommit();//拦截生效
}
void main()
{
system("calc");
printf("%p,%p,%p",system, newsystem, oldsystem);
Hook();
printf("\n%p,%p,%p",system, newsystem, oldsystem);
system("calc");
getchar();
}
现象是加了Hook()之后只弹出了一次计算机窗口,如果去掉了Hook()方法,则出现两个计算器窗口。
5、劫持应用
A:创建一个基于窗口的MFC的应用程序->然后拖一个button->双击buttonà添加代码,事件代码如下:
void C劫持测试2Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
#include
system("calc");
}
窗口截图如下:
B:选中解决方案,新建一个常规空项目(项目名称:劫持其他程序),这时候要写一个库劫持MFC程序
将detours中的各种相关文件放到源文件下面。截图如下:
C:修改项目的依赖项:右击项目-->属性-->链接器-->输入-->附加依赖项-
D:将项目改成dll项目,也就是,修改配置属性里面的常规的目标文件名和配置类型,截图如下:
1、编写dll内容:
#include
#include
#include
#include
#include"detours.h"
#pragma comment(lib, "detours.lib")
static int(*poldsystem)(constchar * _Command) =system;//存储函数指针地址
int newsystem(const char *_Command)
{
//tasklist
printf("%s",_Command); //禁止你干活
return 0;
}
//开始拦截
void Hook()
{
DetourRestoreAfterWith();//恢复原来状态
DetourTransactionBegin();//拦截开始
DetourUpdateThread(GetCurrentThread());//刷新当前线程
//这里可以连续多次调用DetourAttach,表明HOOK多个函数
DetourAttach((void **)&poldsystem,newsystem);//实现函数拦截
DetourTransactionCommit();//拦截生效
}
//导出函数,可以加载的时候调用
_declspec(dllexport)void go()
{
MessageBoxA(0, "1", "2", 0);
Hook();
}
E:生成dll文件,然后使用dllInject工具将它注入到应用里面。
6:劫持系统的原理是劫持CreateProcess()函数。同样也是编写dll文件。