要实现下面程序,首先我们需要三个文件 detours.h ,detours.lib ,detver.h(可以去网上下载)
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被劫持,无法执行、
2. 如果相对其他的程序或者软件劫持的话,只需要生成动态库(.dll)形式。注入到该程序或者软件模块中,这样就可以了!! 做到这儿,是不是再加上一点点线程的知识,就有想做一个桌面锁的冲动呀!