• 通过进程注入,实现指定程序在Explorer.exe进程空间内启动

    主进程

  • 在进程空间分配一块内存区域,写入dll的名称,用LoadLibraryA加载

  • 常用API

    • CreateToolhelp32Snapshot、Process32First、Process32Next、CloseHandle:get PID
    • OpenProcess
    • VirtualAllocEx
    • WriteProcessMemory
    • GetModuleHandle
    • GetProcAddress:LoadLibrary
    • CreateRemoteThread

    • WaitForSingleObject

    • GetExitCodeThread
    • CloseHandle
    • VirtualFreeEx//!!

    • CreateRemoteThread

    • GetProcAddress:FreeLibrary
    • WaitForSingleObject// 需要知道线程的退出代码,
    • GetExitCodeThread
    • CloseHandle
    • CloseHandle
    • VirtualFreeEx ```cpp

      include “stdafx.h”

      include

      include

      include

      include “windows.h”

      include “tlhelp32.h”

using namespace std;
DWORD GetProcessIDFromName(LPCSTR name) { DWORD id = 0; // 进程ID PROCESSENTRY32 pe; // 进程信息 pe.dwSize = sizeof(PROCESSENTRY32); HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); // 获取系统进程列表 if (Process32First(hSnapshot, &pe)) // 返回系统中第一个进程的信息 { do { if (0 == _stricmp(_bstr_t(pe.szExeFile), name)) // 不区分大小写比较 { id = pe.th32ProcessID; break; } } while (Process32Next(hSnapshot, &pe)); // 下一个进程 } CloseHandle(hSnapshot); // 删除快照 return id; }

int main()
{
HMODULE hKernel32 = NULL; LPTHREAD_START_ROUTINE pLoadLibrary = NULL; DWORD hLibModule; char path[] = “C:\Documents and Settings\Administrator\桌面\workspace\Dll\debug\Dll.dll”; DWORD pid = GetProcessIDFromName(L”explorer.exe”); if (pid == 0) printf(“id invalid\n”);

  1. HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,
  2. FALSE,
  3. pid);
  4. if (hProcess == INVALID_HANDLE_VALUE) {
  5. printf("openprocess error\n");
  6. return -1;
  7. }
  8. LPVOID pszDllName = VirtualAllocEx(hProcess, //在进程空间分配一块区域
  9. NULL,
  10. strlen(path)+1,
  11. MEM_COMMIT,
  12. PAGE_READWRITE);
  13. if (NULL == pszDllName)
  14. {
  15. printf("alloc error\n");
  16. printf("error code:%d",GetLastError());
  17. return -1;
  18. }
  19. BOOL bRet = WriteProcessMemory( hProcess, pszDllName,
  20. (void *)path, strlen(path)+1, NULL); //写上要调用的dll名称
  21. if (NULL == bRet)
  22. {
  23. printf("write error\n");
  24. return -1;
  25. }
  26. hKernel32=GetModuleHandle(L"kernel32.dll");
  27. pLoadLibrary=(LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32,"LoadLibraryA");
  28. if(!hKernel32 || !pLoadLibrary) return -1;
  29. HANDLE hInjectThread = CreateRemoteThread(hProcess,
  30. NULL,
  31. 0,
  32. pLoadLibrary,
  33. pszDllName,
  34. 0,
  35. NULL);
  36. if (NULL == hInjectThread)
  37. {
  38. DWORD dwErr = GetLastError();
  39. printf("create thread error:%d\n",dwErr);
  40. VirtualFreeEx(hProcess,pszDllName,4096,MEM_DECOMMIT);
  41. return -1;
  42. }
  43. DWORD dw = WaitForSingleObject(hInjectThread, -1);
  44. GetExitCodeThread(hInjectThread, &hLibModule);
  45. CloseHandle(hInjectThread);
  46. BOOL bReturn = VirtualFreeEx(hProcess, pszDllName,
  47. strlen(path)+1, MEM_DECOMMIT);
  48. if (NULL == bReturn)
  49. {
  50. printf("freeex error:%d\n",GetLastError());
  51. return -1;
  52. }
  53. hInjectThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32,"FreeLibrary"),(void *)hLibModule,0,NULL);
  54. if (hInjectThread == NULL) {
  55. printf("create free thread error:%d\n",GetLastError());
  56. }
  57. WaitForSingleObject(hInjectThread,-1);
  58. DWORD FreeLibInfo;
  59. GetExitCodeThread(hInjectThread,&FreeLibInfo);
  60. if (!FreeLibInfo) {
  61. printf("free error:%d\n",GetLastError());
  62. }
  63. CloseHandle(hInjectThread);
  64. CloseHandle(hProcess);
  65. hProcess = NULL;
  66. VirtualFreeEx(hProcess,pszDllName,strlen(path)+1,MEM_DECOMMIT);
  67. system("pause");
  68. return 0;

}

  1. <a name="10Oh6"></a>
  2. # 注入的DLL
  3. - CreateProcessW
  4. ```cpp
  5. // Dll.cpp : 定义 DLL 应用程序的入口点。
  6. //
  7. #include "stdafx.h"
  8. #include "Dll.h"
  9. #include "Stdafx.h"
  10. #include <windows.h>
  11. #pragma unmanaged
  12. BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
  13. {
  14. switch(ul_reason_for_call) {
  15. case DLL_PROCESS_ATTACH: {
  16. STARTUPINFOW si;
  17. memset(&si,0,sizeof(STARTUPINFOW));
  18. si.cb=sizeof(STARTUPINFOW);
  19. si.dwFlags=STARTF_USESHOWWINDOW;
  20. si.wShowWindow=SW_SHOW;
  21. PROCESS_INFORMATION pi;
  22. wchar_t target[]=L"C:\\Documents and Settings\\Administrator\\桌面\\软件安全漏洞分析与发现\\2018第一次作业\\挑战题附件\\挑战第三题_盗梦空间.exe";
  23. if(!CreateProcessW(target,NULL,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) {
  24. printf("error code:%d",GetLastError());
  25. printf("create process error\n");
  26. }
  27. break;
  28. }
  29. case DLL_PROCESS_DETACH: {
  30. break;
  31. }
  32. case DLL_THREAD_ATTACH: {
  33. break;
  34. }
  35. case DLL_THREAD_DETACH: {
  36. break;
  37. }
  38. }
  39. return TRUE;
  40. }