标签:头文件 use ima cap 开发 box 线程 根据 劫持
1.这里所说的移花接木分三个级别:@1对自己写的函数使用;@2对别的程序的函数使用;@3对操作系统程序使用。
简单地说就是让改变程序的走向,本来调用的函数不调用了,调用你写的函数,用你的花去接别的程序的木。
2.这里采用的是微软亚洲研究院开发的劫持技术detours,这是一个封装好的库,有源代码,原理是使用函数指针改变函数行为。
3.移花接木的技术就是调用它的API结合自己实际应用。
4.使用步骤:
@1安装detours,
@2构建库文件,使用Makefile进行编译。
@3包含头文件和库文件#include "detours.h" #include "detver.h" #pragma comment(lib,"detours.lib")
@4编写代码,我这一次是拦截自己应用里的调用的函数,代码如下
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<windows.h> 4 #include "detours.h" 5 #include "detver.h" 6 7 8 #pragma comment(lib,"detours.lib")//声明要使用静态库 9 /* 10 拦截,劫持分三种级别: 11 1.拦截自己写的函数:直接调用拦截函数 12 2.拦截别人的函数与进程:通过dll注入来拦截 13 3.劫持操作系统函数: 14 劫持三个要素:函数名和函数参数以及返回类型 15 16 注意:使用拦截必须使用Release而不是Debug 17 */ 18 /* 19 根据函数原型定义该函数的函数指针,为避免影响其他API使用static修饰该函数指针 20 WINUSERAPI 21 int 22 WINAPI 23 MessageBoxW( 24 _In_opt_ HWND hWnd, 25 _In_opt_ LPCWSTR lpText, 26 _In_opt_ LPCWSTR lpCaption, 27 _In_ UINT uType); 28 29 */ 30 /*定义原函数指针指向原函数*/ 31 static int (WINAPI *PMessageBoxW)(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) = MessageBoxW;//让这个指针保存MessageBoxW函数入口地址 32 33 34 /*自己定义的替代原函数的函数*/ 35 int WINAPI NewMessageBoxW(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType) 36 { 37 printf("我是代替者"); 38 } 39 40 /*拦截一个函数,使用新函数代替旧函数,oldFunctionPointer为旧函数的函数指针,newFunction为新函数的函数名*/ 41 void holdUp() 42 { 43 DetourRestoreAfterWith();//1.恢复原来状态 44 DetourTransactionBegin();//2.拦截事物开始 45 DetourUpdateThread(GetCurrentThread());//3.刷新当前线程 46 //多次调用可以拦截多个函数,这里只调用一次DetourAttach 47 DetourAttach((void **)&PMessageBoxW, NewMessageBoxW);//实现函数拦截,PMessageBoxW为要被代替的函数的指针变量,NewMessageBoxW为取代者函数名 48 DetourTransactionCommit();//提交拦截事物 49 50 } 51 52 /*取消所拦截函数*/ 53 void unHoldUp() 54 { 55 56 DetourTransactionBegin();//2.拦截事物开启 57 DetourUpdateThread(GetCurrentThread());//3.刷新当前线程 58 //多次调用可以取消拦截的多个函数,这里只调用一次DetourDetach 59 60 DetourDetach((void **)&PMessageBoxW, NewMessageBoxW);//实现取消函数拦截,PMessageBoxW为被代替的函数的指针变量,NewMessageBoxW为取代者函数名 61 DetourTransactionCommit();//提交拦截事物 62 63 } 64 65 66 void main() 67 { 68 //printf("%p", main); 69 printf("%p", MessageBoxW); 70 printf("\n%p", &MessageBoxW); 71 printf("\n%p", PMessageBoxW); 72 printf("\n%p", *PMessageBoxW); 73 printf("\n%p", &PMessageBoxW); 74 printf("\n%p", NewMessageBoxW); 75 MessageBoxW(0, L"锄禾日当午", L"汗滴禾下土", 1);//拦截前的函数 76 77 holdUp();//拦截MessageBoxW这个函数 78 MessageBoxW(0, L"锄禾日当午", L"汗滴禾下土", 1);//拦截后的函数 79 MessageBoxW(0, L"锄禾日当午", L"汗滴禾下土", 1);//拦截后的函数 80 //Sleep(1000); 81 printf("\n%p", MessageBoxW); 82 printf("\n%p", PMessageBoxW); 83 printf("\n%p", *PMessageBoxW); 84 printf("\n%p", &PMessageBoxW); 85 printf("\n%p", NewMessageBoxW); 86 unHoldUp();//取消拦截 87 MessageBoxW(0, L"锄禾日当午", L"汗滴禾下土", 1);//拦截后的函数 88 MessageBoxW(0, L"锄禾日当午", L"汗滴禾下土", 1);//拦截后的函数 89 PMessageBoxW(0, L"锄禾日当午", L"汗滴禾下土", 1); 90 printf("\n%p", MessageBoxW); 91 printf("\n%p", PMessageBoxW); 92 printf("\n%p", *PMessageBoxW); 93 printf("\n%p", &PMessageBoxW); 94 printf("\n%p", NewMessageBoxW); 95 96 system("pause"); 97 }
@5拦截效果
看第一个对话框截图
点击第一个对话框确定后,便没有弹出对话框了,被自己定义的函数给取代了,打印了2次我会替代者,可见拦截成功,继续运行会弹出三个对话框,可见取消拦截也成功
5.总结:这次主要测试自己代码里的函数,下次在测试别人代码和系统代码,拦截效果很明显,取消拦截也很明显,给点提示。
标签:头文件 use ima cap 开发 box 线程 根据 劫持
原文地址:http://www.cnblogs.com/huipengbo/p/6896971.html