要实现下面程序,首先我们需要三个文件 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)形式。注入到该程序或者软件模块中,这样就可以了!! 做到这儿,是不是再加上一点点线程的知识,就有想做一个桌面锁的冲动呀!