隨筆 - 67  文章 - 79  trackbacks - 0
          <2007年10月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章檔案

          相冊

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          摘錄在windows core編程
          函數原形:
          HANDLE CreateRemoteThread(
          HANDLE hProcess,
          PSECURITY_ATTRIBUTES psa,
          DWORD dwStackSize,
          PTHREAD_STRART_ROUTINE pfnStartAddr,
          PVOID pvParam,
          DWORD fdwCreate,
          PDWORD pdwThreadId);
          范例:
          插入
          BOOL WINAPI InjectLib(DWORD dwProcessId, PCTSTR pszLibFile) {

             BOOL fOk = FALSE; // Assume that the function fails
             HANDLE hProcess = NULL, hThread = NULL;
             PTSTR pszLibFileRemote = NULL;

             __try {
                // Get a handle for the target process.
                hProcess = OpenProcess(
                   PROCESS_QUERY_INFORMATION |   // Required by Alpha
                   PROCESS_CREATE_THREAD     |   // For CreateRemoteThread
                   PROCESS_VM_OPERATION      |   // For VirtualAllocEx/VirtualFreeEx
                   PROCESS_VM_WRITE,             // For WriteProcessMemory
                   FALSE, dwProcessId);
                if (hProcess == NULL) __leave;

                // Calculate the number of bytes needed for the DLL's pathname
                int cch = 1 + lstrlen(pszLibFile);
                int cb  = cch * sizeof(TCHAR);

                // Allocate space in the remote process for the pathname
                pszLibFileRemote = (PTSTR)
                   VirtualAllocEx(hProcess, NULL, cb, MEM_COMMIT, PAGE_READWRITE);
                if (pszLibFileRemote == NULL) __leave;

                // Copy the DLL's pathname to the remote process's address space
                if (!WriteProcessMemory(hProcess, pszLibFileRemote,
                   (PVOID) pszLibFile, cb, NULL)) __leave;

                // Get the real address of LoadLibraryW in Kernel32.dll
                PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
                   GetProcAddress(GetModuleHandle(TEXT("Kernel32")),
          #ifdef UNICODE
                   "LoadLibraryW");
          #else
                   "LoadLibraryA");
          #endif
                if (pfnThreadRtn == NULL) __leave;

                // Create a remote thread that calls LoadLibraryW(DLLPathname)
                hThread = CreateRemoteThread(hProcess, NULL, 0,
                   pfnThreadRtn, pszLibFileRemote, 0, NULL);
                if (hThread == NULL) __leave;

                // Wait for the remote thread to terminate
                WaitForSingleObject(hThread, INFINITE);

                fOk = TRUE; // Everything executed successfully
             }
             __finally { // Now, we can clean everthing up

                // Free the remote memory that contained the DLL's pathname
                if (pszLibFileRemote != NULL)
                   VirtualFreeEx(hProcess, pszLibFileRemote, 0, MEM_RELEASE);

                if (hThread  != NULL)
                   CloseHandle(hThread);

                if (hProcess != NULL)
                   CloseHandle(hProcess);
             }

             return(fOk);
          }
          取消插入:
          BOOL WINAPI EjectLib(DWORD dwProcessId, PCTSTR pszLibFile) {

             BOOL fOk 
          = FALSE; // Assume that the function fails
             HANDLE hthSnapshot = NULL;
             HANDLE hProcess 
          = NULL, hThread = NULL;

             __try {
                
          // Grab a new snapshot of the process
                hthSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcessId);
                
          if (hthSnapshot == NULL) __leave;

                
          // Get the HMODULE of the desired library
                MODULEENTRY32 me = { sizeof(me) };
                BOOL fFound 
          = FALSE;
                BOOL fMoreMods 
          = Module32First(hthSnapshot, &me);
                
          for (; fMoreMods; fMoreMods = Module32Next(hthSnapshot, &me)) {
                   fFound 
          = (lstrcmpi(me.szModule,  pszLibFile) == 0|| 
                            (lstrcmpi(me.szExePath, pszLibFile) 
          == 0);
                   
          if (fFound) break;
                }
                
          if (!fFound) __leave;

                
          // Get a handle for the target process.
                hProcess = OpenProcess(
                   PROCESS_QUERY_INFORMATION 
          |   // Required by Alpha
                   PROCESS_CREATE_THREAD     | 
                   PROCESS_VM_OPERATION,  
          // For CreateRemoteThread
                   FALSE, dwProcessId);
                
          if (hProcess == NULL) __leave;

                
          // Get the real address of LoadLibraryW in Kernel32.dll
                PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
                   GetProcAddress(GetModuleHandle(TEXT(
          "Kernel32")), "FreeLibrary");
                
          if (pfnThreadRtn == NULL) __leave;

                
          // Create a remote thread that calls LoadLibraryW(DLLPathname)
                hThread = CreateRemoteThread(hProcess, NULL, 0
                   pfnThreadRtn, me.modBaseAddr, 
          0, NULL);
                
          if (hThread == NULL) __leave;

                
          // Wait for the remote thread to terminate
                WaitForSingleObject(hThread, INFINITE);

                fOk 
          = TRUE; // Everything executed successfully
             }
             __finally { 
          // Now we can clean everything up

                
          if (hthSnapshot != NULL) 
                   CloseHandle(hthSnapshot);

                
          if (hThread     != NULL) 
                   CloseHandle(hThread);

                
          if (hProcess    != NULL) 
                   CloseHandle(hProcess);
             }

             
          return(fOk);
          }


          posted on 2007-10-19 09:00 zarra 閱讀(262) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
          博客園   IT新聞   Chat2DB   C++博客   博問  
           
          主站蜘蛛池模板: 巴彦淖尔市| 浙江省| 武平县| 东明县| 洪雅县| 建德市| 海伦市| 肇源县| 玉山县| 陈巴尔虎旗| 抚顺市| 铜川市| 原阳县| 大关县| 柳河县| 益阳市| 罗定市| 奎屯市| 华阴市| 扎赉特旗| 哈巴河县| 湘阴县| 桂林市| 阳新县| 石泉县| 芮城县| 克什克腾旗| 成都市| 林芝县| 眉山市| 宁海县| 万安县| 巴彦淖尔市| 靖州| 宝鸡市| 分宜县| 西城区| 资中县| 静乐县| 肥城市| 同心县|