要實現下面程序,首先咱們須要三個文件 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)形式。注入到該程序或者軟件模塊中,這樣就能夠了!! 作到這兒,是否是再加上一點點線程的知識,就有想作一個桌面鎖的衝動呀!線程