去评论
TC辅助网

C语言编写的DLL注入工具源代码

Ysjt、凌何
2019/06/14 22:29:39



娉ㄥ叆鏂瑰紡浣跨敤鐨勬槸浠g爜娉ㄥ叆锛屽弬鑰冧簡銆婇嗗悜宸ョ▼鏍稿績鍘熺悊銆嬩腑鐨勭浉鍏充唬鐮併備唬鐮佹敞鍏ュ崰鐢ㄥ唴瀛樺皯骞堕毦浠ユ煡鎵剧棔杩癸紝鍦ㄤ唬鐮侀噺灏忕殑鏃跺欐瘮杈冨悎閫傘

涓嶈繃杩欒竟鏈変竴涓棶棰樺氨鏄湪鎵ц鐢ㄦ埛閫夋嫨鐨勫惎鍔ㄥ嚱鏁版椂鎴
  1. // 鍙傛暟绫诲瀷
  2. typedef struct _INJECTTHREAD_PARAM
  3. {
  4.         FARPROC pFunc[3];
  5.         char szBuf[2][128];
  6. } INJECTTHREAD_PARAM, *PINJECTTHREAD_PARAM;

  7. // 姝ゅ嚱鏁颁互浠g爜褰㈠紡娉ㄥ叆鐩爣杩涚▼
  8. DWORD WINAPI InjectThreadProc(LPVOID param)
  9. {
  10.         PINJECTTHREAD_PARAM pParam = (PINJECTTHREAD_PARAM)param;
  11.         HMODULE hModule;
  12.         FARPROC pFunc;
  13.         HANDLE hThread;

  14.         // 娉ㄥ叆鐨勪唬鐮侀噷涓嶈兘鐩存帴璋冪敤API鍑芥暟
  15.         // LoadLibraryA(szDllPath)
  16.         hModule = ((PFLOADLIBRARYA)pParam->pFunc[0])(pParam->szBuf[0]);
  17.         if (!hModule)
  18.         {
  19.                 return 1;
  20.         }

  21.         // GetProcAddress(hModule, szFunc)
  22.         pFunc = ((PFGETPROCADDRESS)pParam->pFunc[1])(hModule, pParam->szBuf[1]);
  23.         if (!pFunc)
  24.         {
  25.                 return 1;
  26.         }

  27.         // CreateThread()鎵ц鍔犺浇鏃惰杩愯鐨勫嚱鏁, 涓嶇煡閬撲娇鐢ㄨ繖绉嶆柟寮忓悎涓嶅悎閫
  28.         hThread = ((PFCREATETHREAD)pParam->pFunc[2])(NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, NULL, 0, NULL);

  29.         return 0;
  30. }

  31. BOOL InjectDll(DWORD dwPID, LPCSTR szDllPath, LPCSTR szFunc)
  32. {
  33.         HMODULE hModule;
  34.         INJECTTHREAD_PARAM param;
  35.         HANDLE hProcess;
  36.         HANDLE hThread;
  37.         LPVOID pRemoteBuf[2];
  38.         DWORD dwSize;

  39.         hModule = GetModuleHandleW(L"kernel32.dll");
  40.         memset(露m, 0, sizeof(INJECTTHREAD_PARAM));
  41.         // 瑕佽繘琛屼唬鐮佹敞鍏, 灏卞繀闇瑕佹妸瑕佽皟鐢ㄥ弬鏁板厛鍐欏叆鐩爣杩涚▼
  42.         param.pFunc[0] = GetProcAddress(hModule, "LoadLibraryA");
  43.         param.pFunc[1] = GetProcAddress(hModule, "GetProcAddress");
  44.         param.pFunc[2] = GetProcAddress(hModule, "CreateThread");
  45.         strcpy_s(param.szBuf[0], strlen(szDllPath) + 1, szDllPath);
  46.         strcpy_s(param.szBuf[1], strlen(szFunc) + 1, szFunc);

  47.         if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)))
  48.         {
  49.                 return FALSE;
  50.         }

  51.         // 鍒ゆ柇鐜
  52.         if (Is64BitProcess(GetCurrentProcess()) != Is64BitProcess(hProcess))
  53.         {
  54.                 MessageBox(NULL, TEXT("鎵撳紑鍔ㄦ侀摼鎺ュ簱鏂囦欢澶辫触"), TEXT("鎻愮ず"), MB_ICONERROR | MB_OK);
  55.                 CloseHandle(hProcess);
  56.                 return FALSE;
  57.         }

  58.         dwSize = sizeof(INJECTTHREAD_PARAM);
  59.         if (!(pRemoteBuf[0] = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE)))
  60.         {
  61.                 return FALSE;
  62.         }
  63.         // 灏嗗叏閮ㄧ殑鍙傛暟浣滀负缁撴瀯浣撴暣涓啓鍏
  64.         if (!WriteProcessMemory(hProcess, pRemoteBuf[0], (LPVOID)露m, dwSize, NULL))
  65.         {
  66.                 return FALSE;
  67.         }

  68.         dwSize = (DWORD)InjectDll - (DWORD)InjectThreadProc;
  69.         if (!(pRemoteBuf[1] = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE)))
  70.         {
  71.                 return FALSE;
  72.         }
  73.         // 鍐嶅皢InjectThreadProc鐨勫嚱鏁颁唬鐮佸啓鍏ョ洰鏍囪繘绋
  74.         if (!WriteProcessMemory(hProcess, pRemoteBuf[1], (LPVOID)InjectThreadProc, dwSize, NULL))
  75.         {
  76.                 return FALSE;
  77.         }

  78.         // pRemoteBuf[1]灏辨槸InjectThreadProc鍦ㄧ洰鏍囪繘绋嬩腑鐨勮捣濮嬪湴鍧, 宸茬粡琚啓鍏, pRemoteBuf[0]鍒欐槸鍐欏叆鐨勫弬鏁板湴鍧
  79.         if (!(hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pRemoteBuf[1], pRemoteBuf[0], 0, NULL)))
  80.         {
  81.                 return FALSE;
  82.         }

  83.         WaitForSingleObject(hThread, INFINITE);

  84.         VirtualFreeEx(hProcess, pRemoteBuf[0], 0, MEM_RELEASE);
  85.         VirtualFreeEx(hProcess, pRemoteBuf[1], 0, MEM_RELEASE);

  86.         CloseHandle(hThread);
  87.         CloseHandle(hProcess);

  88.         return TRUE;
  89. [align=left]
  90. }

閫夋嫨璁╃洰鏍囪繘绋嬩娇鐢–reateThread鏉ヨ皟鐢╠ll鐨勫鍑哄嚱鏁帮紝杩欐牱鍋氭槸鍚﹀悎閫傦紵娴嬭瘯浜嗕竴浜涙殏鏃惰繕娌″彂鐜颁粈涔堥棶棰