鱼C论坛

 找回密码
 立即注册
查看: 256|回复: 1

[已解决]CreateRemoteThread

[复制链接]
发表于 2023-5-26 07:22:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. // Project1.cpp : 定义应用程序的入口点。
  2. //

  3. #include "framework.h"
  4. #include "Project1.h"


  5. int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
  6.                      _In_opt_ HINSTANCE hPrevInstance,
  7.                      _In_ LPWSTR    lpCmdLine,
  8.                      _In_ int       nCmdShow)
  9. {
  10.    
  11.     HWND hWnd = ::FindWindow(_T("Notepad"), NULL);//获取与指定窗口类名和窗口名的最顶层窗口的窗口句柄
  12.     //寻找 记事本 进程
  13.     if (!hWnd) {
  14.         MessageBox(NULL,_T("请打开语音计算器"),NULL,NULL);
  15.         ExitProcess(0);
  16.     }

  17.     unsigned long pid;
  18.     ::GetWindowThreadProcessId(hWnd, &pid);//获取指定进程的进程ID
  19.     /*
  20.     参数:HANDLE Process  进程的句柄
  21.             句柄必须具有PROCESS_QUERY_INFORMATION或PROCESS_QUERY_LIMITED_INFORMATION访问权限
  22.     返回值:如果函数成功,则返回值为进程标识符
  23.             如果函数失败,则返回值为零
  24.     */

  25.     if(pid ==0){
  26.         MessageBox(NULL, _T("语音计算器进程ID获取失败"), NULL, NULL);
  27.         ExitProcess(0);
  28.     }


  29.     BOOL b=Inject(_T("D:\\bb\\MFCdll\\Debug\\MFCdll.dll"), pid);//调用函数
  30.         
  31.     return 0;
  32. }

  33. BOOL Inject(LPCTSTR szModule, DWORD dwID) {   //在目标进程中装载dll
  34.    
  35.     HANDLE process = OpenProcess(PROCESS_QUERY_INFORMATION |PROCESS_VM_OPERATION | PROCESS_CREATE_THREAD |PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, dwID);
  36.     if (!process) {
  37.         MessageBox(NULL, _T("进程权限获取失败"), NULL, NULL);
  38.         return FALSE;
  39.     }

  40.     int cByte = (_tcslen(szModule)+1)*sizeof(TCHAR);
  41.     //dll路径的字节数
  42.     LPVOID pAddr = VirtualAllocEx(process,NULL, cByte, MEM_COMMIT, PAGE_READWRITE);
  43.     if (!pAddr || !WriteProcessMemory(process, pAddr, szModule, cByte,NULL)) {
  44.         MessageBox(NULL, _T("路径写入失败"), NULL, NULL);
  45.         return FALSE;
  46.     }

  47.     PTHREAD_START_ROUTINE pfnStartAddr =(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T("Kernel32")), "LoadLibraryW");
  48.     //获取Kernel32动态链接库中LoadLibraryW函数的地址

  49.     if (!pfnStartAddr) {
  50.         MessageBox(NULL, _T("LoadLibraryW函数地址获取失败"), NULL, NULL);
  51.         return FALSE;
  52.     }

  53.     DWORD dwThreadID = 0;
  54.     HANDLE hRemoteThread = CreateRemoteThread(process,NULL,0, pfnStartAddr, pAddr,0,&dwThreadID);//创建远程线程
  55.     /*
  56.     【在目标进程中装载dll】
  57.     参数1:HANDLE hProcess  线程所属进程的进程句柄
  58.             该句柄必须具有 PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE,和PROCESS_VM_READ 访问权限
  59.     参数2:LPSECURITY_ATTRIBUTES lpThreadAttributes 一个指向 SECURITY_ATTRIBUTES 结构的指针, 该结构指定了线程的安全属性  
  60.     参数3:SIZE_T dwStackSize   线程栈初始大小,以字节为单位,如果该值设为0,那么使用系统默认大小
  61.     参数4:LPTHREAD_START_ROUTINE lpStartAddress   在远程进程的地址空间中,该线程的线程函数的起始地址
  62.     参数5:LPVOID lpParameter    传给线程函数的参数
  63.     参数6:DWORD dwCreationFlags 线程的创建标志
  64.             0     线程创建后立即运行
  65.             CREATE_SUSPENDED=0x00000004   线程创建后先将线程挂起,直到 ResumeThread 被调用
  66.             STACK_SIZE_PARAM_IS_A_RESERVATION=0x00010000    dwStackSize 参数指定为线程栈预订大小,如果STACK_SIZE_PARAM_IS_A_RESERVATION没有被指定,dwStackSize 参数指定为线程栈分配大小.
  67.     参数7:LPDWORD lpThreadId    指向新创建线程ID的指针,如果创建失败,该参数为NULL
  68.    
  69.     返回值:成功返回新线程句柄,失败返回NULL
  70.     */

  71.     if (!hRemoteThread) {
  72.         MessageBox(NULL, _T("远程线程创建失败"), NULL, NULL);
  73.         return FALSE;
  74.     }

  75.     CloseHandle(hRemoteThread);
  76.     CloseHandle(process);
  77.     return TRUE;

  78. }
复制代码




请帮忙看看   在 CreateRemoteThread创建远程线程时  失败 ?????











最佳答案
2023-5-26 07:22:34
在使用CreateRemoteThread创建远程线程时,可能会失败,原因可能有很多。常见的原因是权限不足或者目标进程已经退出。

在这段代码中,我们可以看到在打开目标进程的句柄时,使用了PROCESS_QUERY_INFORMATION、PROCESS_VM_OPERATION、PROCESS_CREATE_THREAD、PROCESS_VM_READ、PROCESS_VM_WRITE、PROCESS_QUERY_INFORMATION这些权限。这些权限应该足够创建远程线程,但是如果目标进程已经退出,这些权限也没有用。

另外,当目标进程权限不足时,也会导致创建远程线程失败。在这种情况下,可以尝试使用管理员权限运行程序或者提升权限。

如果以上两种情况都不是问题,那么就需要进一步排查问题。可以使用工具如Process Monitor等来监视程序的运行情况,查看是否有其他问题导致创建远程线程失败。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-26 07:22:34 | 显示全部楼层    本楼为最佳答案   
在使用CreateRemoteThread创建远程线程时,可能会失败,原因可能有很多。常见的原因是权限不足或者目标进程已经退出。

在这段代码中,我们可以看到在打开目标进程的句柄时,使用了PROCESS_QUERY_INFORMATION、PROCESS_VM_OPERATION、PROCESS_CREATE_THREAD、PROCESS_VM_READ、PROCESS_VM_WRITE、PROCESS_QUERY_INFORMATION这些权限。这些权限应该足够创建远程线程,但是如果目标进程已经退出,这些权限也没有用。

另外,当目标进程权限不足时,也会导致创建远程线程失败。在这种情况下,可以尝试使用管理员权限运行程序或者提升权限。

如果以上两种情况都不是问题,那么就需要进一步排查问题。可以使用工具如Process Monitor等来监视程序的运行情况,查看是否有其他问题导致创建远程线程失败。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 00:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表