要实现下面程序,首先咱们须要三个文件 detours.h ,detours.lib ,detver.h(能够去网上下载)windows
1. 首先让咱们看看,一个最简单的C程序,如何劫持system函数.数组
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<windows.h> 5 #include"detours.h" 6 //#include"detver.h" 7 #pragma comment(lib , "detours.lib") 8 9 // 存储函数指针地址 10 //指针分为:通常指针,多级指针。 指针函数,函数指针,指针数组 。数组指针。 11 //static int(*poldsystem) (const char * _Command)=system; 12 static int( *poldsystem )(const char * _Command) = system; 13 //本身实现一个system函数 14 int mysystem( const char * _Command){ 15 const char * ps = NULL; 16 ps = strstr(_Command ,"calc"); 17 if (ps != NULL) 18 printf("%s 已经被劫持啦!\n", _Command); 19 else 20 printf("run run run 北鼻 !"); 21 return 1; 22 }; 23 24 //开始拦截 25 void Hook(){ 26 DetourRestoreAfterWith(); //恢复初始状态 27 DetourTransactionBegin(); //拦截开始 28 DetourUpdateThread(GetCurrentThread()); //刷新当前线程 29 //此处下面填写本身想要拦截的函数 30 DetourAttach((void **)&poldsystem, mysystem); //实现函数拦截 31 DetourTransactionCommit(); //提交事务,拦截生效 32 } 33 34 //撤销拦截 35 void UnHook() { 36 DetourTransactionBegin(); //拦截开始 37 DetourUpdateThread(GetCurrentThread()); //刷新当前线程 38 DetourDetach((void **)&poldsystem, mysystem); 39 DetourTransactionCommit(); 40 } 41 int main( void ) { 42 43 system("calc"); 44 Hook(); 45 system("tasklist"); 46 UnHook(); 47 getchar(); 48 //system("pause"); 49 return 0; 50 }
截图:函数
结果显示。第一个system实现了,可是第二个system被劫持,没法执行、 spa
2. 若是相对其余的程序或者软件劫持的话,只须要生成动态库(.dll)形式。注入到该程序或者软件模块中,这样就能够了!! 作到这儿,是否是再加上一点点线程的知识,就有想作一个桌面锁的冲动呀!线程