免费高清特黄a大片,九一h片在线免费看,a免费国产一级特黄aa大,国产精品国产主播在线观看,成人精品一区久久久久,一级特黄aa大片,俄罗斯无遮挡一级毛片

分享

Windows下實(shí)現(xiàn)進(jìn)程保護(hù)

 學(xué)習(xí)CB121 2012-06-10

Windows下實(shí)現(xiàn)進(jìn)程保護(hù) [復(fù)制鏈接]

樓主
南昌航空大學(xué)空中社區(qū) 立即收聽
沙發(fā)

然后,看一下我們可能需要的一些API第一個(gè)CreateProcess
這個(gè)函數(shù)很惡心啊,先看看他的聲明(M$的東西一貫惡心,習(xí)慣就好)
  1. BOOL WINAPI CreateProcess(
  2.   __in_opt     LPCTSTR lpApplicationName,
  3.   __inout_opt  LPTSTR lpCommandLine,
  4.   __in_opt     LPSECURITY_ATTRIBUTES lpProcessAttributes,
  5.   __in_opt     LPSECURITY_ATTRIBUTES lpThreadAttributes,
  6.   __in         BOOL bInheritHandles,
  7.   __in         DWORD dwCreationFlags,
  8.   __in_opt     LPVOID lpEnvironment,
  9.   __in_opt     LPCTSTR lpCurrentDirectory,
  10.   __in         LPSTARTUPINFO lpStartupInfo,
  11.   __out        LPPROCESS_INFORMATION lpProcessInformation
  12. );
復(fù)制代碼
對參數(shù),不做太詳細(xì)的解釋,這里只對這個(gè)函數(shù)做一點(diǎn)簡單說明lpApplicationName 進(jìn)程名
lpCommandLine 進(jìn)程路徑+進(jìn)程名
lpProcessAttributes 進(jìn)程安全描述結(jié)構(gòu)
lpThreadAttributes 線程安全描述結(jié)構(gòu)
bInheritHandles 是否從父進(jìn)程繼承句柄
dwCreateFlags  進(jìn)程優(yōu)先級等等,看文檔比較靠譜,參數(shù)比較復(fù)雜
lpEnvironment 進(jìn)程的環(huán)境變量(不指定的話,默認(rèn)繼承父進(jìn)程的所有環(huán)境變量)
lpStartupInfo  進(jìn)程創(chuàng)建以后的狀態(tài)(掛起,就緒...),這里能設(shè)置的和dwCreateFlags其實(shí)有類似的地方,具體不做太多討論,看文檔比較靠譜
lpCurrentDirectory 進(jìn)程創(chuàng)建以后的路徑,默認(rèn)是可執(zhí)行文件exe的路徑
lpProcessInformation 返回的進(jìn)程信息,包含進(jìn)程句柄和線程句柄

接下來,就是用這玩意創(chuàng)建一個(gè)進(jìn)程了。(想想linux和unix下的fork函數(shù)吧,多么簡單,或者是exec函數(shù)...)

再下來,需要簡單介紹下CreateThread,因?yàn)樯衔睦镎f了,需要一個(gè)不影響當(dāng)前進(jìn)程執(zhí)行的模塊來負(fù)責(zé)做守護(hù)
那么,CreateThread又有啥呢?當(dāng)然,CreateThread函數(shù)就相對簡單的多了
  1. HANDLE WINAPI CreateThread(
  2.   __in_opt   LPSECURITY_ATTRIBUTES lpThreadAttributes,
  3.   __in       SIZE_T dwStackSize,
  4.   __in       LPTHREAD_START_ROUTINE lpStartAddress,
  5.   __in_opt   LPVOID lpParameter,
  6.   __in       DWORD dwCreationFlags,
  7.   __out_opt  LPDWORD lpThreadId
  8. );
復(fù)制代碼
lpThreadAttributes 線程安全結(jié)構(gòu)dwStackSize 線程棧大小
lpStartAddress 線程執(zhí)行體函數(shù)
lpParameter 線程執(zhí)行體函數(shù)的參數(shù)
dwCreateFlags 線程的優(yōu)先級,線程狀態(tài)等標(biāo)志
lpThreadId 線程ID

參數(shù)確實(shí)相比進(jìn)程簡單了很多,但是還是復(fù)雜

如此復(fù)雜的API,如何調(diào)用?這確實(shí)是問題,不過好處是,對于絕大部分的情況,我們都可以傳NULL(對于非指針和句柄傳0代替)
API內(nèi)部看到NULL(0)以后會(huì)用默認(rèn)的參數(shù)來代替他們

那么,我們可以如何調(diào)用呢?
下面寫2個(gè)簡單的調(diào)用例子
  1. STARTUPINFO si;
  2. PROCESS_INFORMATION pi;

  3. ZeroMemory(&si, sizeof(si));
  4. si.cb = sizeof(si);
  5. ZeroMemory(&pi, sizeof(pi));
復(fù)制代碼
以上就是創(chuàng)建一個(gè)進(jìn)程的代碼了,如果不出特殊需求
創(chuàng)建進(jìn)程都可以用這種形式,對我們不關(guān)注的參數(shù),直接傳NULL 或者是 0

那么,線程呢?
線程可能有點(diǎn)麻煩的
現(xiàn)在的線程創(chuàng)建,一般是把一個(gè)函數(shù)當(dāng)作一個(gè)線程來執(zhí)行
所以,我們首先需要定義一個(gè)函數(shù),作為線程的執(zhí)行體。
和進(jìn)程的入口函數(shù)main(其實(shí)main不是真正的入口,以后講到PE文件的時(shí)候會(huì)講到),線程的入口函數(shù)也是一個(gè)固定的格式
DWORD WINAPI ThreadProc(void *arg);
只有滿足這個(gè)格式的函數(shù)才能當(dāng)作線程函數(shù)
這里的函數(shù)聲明又多了一個(gè)東西,叫做WINAPI
其實(shí)WINAPI是個(gè)宏,在windows.h里面是這樣定義的
#define WINAPI __stdcall
他規(guī)定了函數(shù)的調(diào)用約定方式(這個(gè)涉及到一點(diǎn)點(diǎn)的匯編知識,所以就暫時(shí)不展開講了),平時(shí)用的最多的C庫,調(diào)用約定都是__cdecl的形式

好了,廢話說完了,那么,如何創(chuàng)建一個(gè)線程呢?
  1. DWORD WINAPI ThreadProc(void *arg)
  2. {
  3.     return 0;
  4. }
  5. HANDLE hThread;
  6. DWORD dwThreadID;

  7. hThread = CreateThread(
  8.         NULL,
  9.         0,
  10.         MyThreadFunction,
  11.         pDataArray[i],
  12.         0,
  13.         &dwThreadID
  14. );
復(fù)制代碼
如此,就能創(chuàng)建一個(gè)線程了
最后編輯tinysniper 最后編輯于 2012-03-07 11:16:19
板凳

簡單那守護(hù)進(jìn)程實(shí)現(xiàn):
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <psapi.h>

  4. #ifdef DBG
  5. #define ErrorInfo(proc) \
  6.     fprintf(stderr, "%s failed in FILE:[%s] FUNCTION:[%s] LINE:[%d] ---- ERRORNUM:[%d]\r\n", #proc, __FILE__, __FUNCTION__, __LINE__, GetLastError())
  7. #else
  8. #define ErrorInfo(proc) do { } while(0)
  9. #endif

  10. /*++
  11. *
  12. * 函數(shù)名           FindProcessByName
  13. *
  14. * 函數(shù)說明         從當(dāng)前進(jìn)程列表中查詢,是否有指定的進(jìn)程
  15. *
  16. * 參數(shù)             pszName - 需要查詢的進(jìn)程名
  17. *
  18. * 返回值           TRUE  - 指定進(jìn)程存在
  19. *                  FALSE - 指定進(jìn)程不存字在
  20. *
  21. --*/
  22. BOOL FindProcessByName(const CHAR *pszName)
  23. {
  24.     BOOL bRet;
  25.     DWORD dwProcessArray[1024];
  26.     DWORD dwTotalSize;
  27.     DWORD dwProcessCount;
  28.     DWORD i;

  29.     HANDLE hProcess;
  30.     HMODULE hModule;
  31.     DWORD dwSize;

  32.     CHAR szProcessName[MAX_PATH];

  33.     bRet = EnumProcesses(
  34.             dwProcessArray,
  35.             sizeof(dwProcessArray),
  36.             &dwTotalSize);
  37.     if ( !bRet ) {
  38.         ErrorInfo(EnumProcesses);
  39.         return FALSE;
  40.     }

  41.     //
  42.     // 獲得當(dāng)前系統(tǒng)中的進(jìn)程個(gè)數(shù)
  43.     //
  44.     dwProcessCount = dwTotalSize / sizeof(DWORD);
  45.     for ( i = 0; i < dwProcessCount; i++ ) {
  46.         if ( !dwProcessArray[i] ) {
  47.             continue;
  48.         }
  49.         hProcess = OpenProcess(
  50.                 PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
  51.                 FALSE,
  52.                 dwProcessArray[i]
  53.                 );
  54.         if ( !hProcess ) {
  55.             printf("Error OpenProcess ID - %d\n", dwProcessArray[i]);
  56.             ErrorInfo(OpenProcess);
  57.             continue;
  58.         }

  59.         //
  60.         // 枚舉進(jìn)程模塊
  61.         //
  62.         bRet = EnumProcessModules(
  63.                 hProcess,
  64.                 &hModule,
  65.                 sizeof(hModule),
  66.                 &dwSize
  67.                 );
  68.         if ( !bRet ) {
  69.             printf("Error EnumProcessModules ID - %d\n", dwProcessArray[i]);
  70.             ErrorInfo(EnumProcessModules);
  71.             CloseHandle(hProcess);
  72.             continue;
  73.         }

  74.         //
  75.         // 獲得進(jìn)程模塊名
  76.         //
  77.         bRet = GetModuleBaseName(
  78.                 hProcess,
  79.                 hModule,
  80.                 szProcessName,
  81.                 sizeof(szProcessName) / sizeof(CHAR)
  82.                 );
  83.         if ( !bRet ) {
  84.             ErrorInfo(GetModuleBaseName);
  85.             CloseHandle(hProcess);
  86.             continue;
  87.         }

  88.         //
  89.         // 如果抓取到的模塊名和進(jìn)程名一樣
  90.         //
  91.         if ( strcmp(szProcessName, pszName) == 0 ) {
  92.             CloseHandle(hProcess);
  93.             return TRUE;
  94.         }
  95.     }
  96.     return FALSE;
  97. }

  98. int main()
  99. {
  100.     STARTUPINFO si;
  101.     PROCESS_INFORMATION pi;
  102.     BOOL bRet;

  103.     while ( TRUE ) {

  104.         ZeroMemory(&si, sizeof(si));
  105.         si.cb = sizeof(si);
  106.         ZeroMemory(&pi, sizeof(pi));

  107.         //
  108.         // 在系統(tǒng)進(jìn)程列表里面查詢calc進(jìn)程是否存在
  109.         //
  110.         if ( FindProcessByName("calc.exe") ) {
  111.             Sleep(1000);
  112.             continue;
  113.         }

  114.         //
  115.         // 創(chuàng)建calc進(jìn)程
  116.         //
  117.         bRet = CreateProcess(
  118.                 NULL,  
  119.                 "C:\\Windows\\System32\\calc.exe",       // windows自帶的計(jì)算器
  120.                 NULL,        
  121.                 NULL,        
  122.                 FALSE,        
  123.                 0,            
  124.                 NULL,        
  125.                 NULL,        
  126.                 &si,          
  127.                 &pi
  128.                 );
  129.         if ( bRet ) {
  130.             //
  131.             // XXX 如果進(jìn)程創(chuàng)建成功,一定記得關(guān)閉進(jìn)程句柄和線程句柄
  132.             //
  133.             CloseHandle(pi.hProcess);
  134.             CloseHandle(pi.hThread);
  135.         }

  136.         Sleep(1000);
  137.     }
  138.     return 0;
  139. }
復(fù)制代碼

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多