鱼C论坛

 找回密码
 立即注册
查看: 384|回复: 2

CreateRemoteThread

[复制链接]
发表于 2023-5-25 08:08:59 | 显示全部楼层 |阅读模式

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

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

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.     BOOL b=Inject(_T("D:\\bb\\Project1\\Debug\\MFCdll.dll"), 100616);//调用函数
  11.    
  12.    
  13.     return 0;
  14. }

  15. BOOL Inject(LPCTSTR szModule, DWORD dwID) {   //在目标进程中装载dll
  16.    
  17.     HANDLE process = OpenProcess(PROCESS_QUERY_INFORMATION |PROCESS_VM_OPERATION | PROCESS_CREATE_THREAD |PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION, FALSE, dwID);
  18.     if (!process) {
  19.         return FALSE;
  20.     }

  21.     int cByte = (_tcslen(szModule)+1)*sizeof(TCHAR);
  22.     //dll路径的字节数
  23.     LPVOID pAddr = VirtualAllocEx(process,NULL, cByte, MEM_COMMIT, PAGE_READWRITE);
  24.     if (!pAddr || !WriteProcessMemory(process, pAddr, szModule, cByte,NULL)) {
  25.         return FALSE;
  26.     }

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

  29.     if (!pfnStartAddr) {
  30.         return FALSE;
  31.     }

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

  50.     if (!hRemoteThread) {
  51.         return FALSE;
  52.     }

  53.     CloseHandle(hRemoteThread);
  54.     CloseHandle(process);
  55.     return TRUE;

  56. }
复制代码



上面代码是 进程注入 代码,hRemoteThread返回值为NULL,其余不为NULL  ??
能够远程dll有什么要求吗  ???





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-25 08:09:35 | 显示全部楼层
hRemoteThread返回值为NULL可能是因为CreateRemoteThread函数调用失败。这可能是由于以下原因之一导致的:

1. 目标进程的句柄无效或不具备足够的权限。在此代码中,我们使用了PROCESS_CREATE_THREAD、PROCESS_QUERY_INFORMATION、PROCESS_VM_OPERATION、PROCESS_VM_WRITE和PROCESS_VM_READ访问权限。请确保您的进程有这些权限。

2. 函数参数错误。请确保您正确传递了所有必需的参数并且它们的类型和值正确。

3. 目标进程已经崩溃或终止。在这种情况下,您需要重新启动该进程并尝试再次注入DLL。

至于能够远程加载DLL的要求,主要是目标进程必须具有足够的权限和允许加载DLL的设置。如果目标进程是由管理员启动的,则可能需要以管理员身份运行注入程序。另外,如果目标进程使用了安全软件或防病毒软件,则可能会阻止远程加载DLL。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-17 04:39:29 | 显示全部楼层
////////////////////////////////////////////////////////////////////////////////////
BOOL WINAPI ModuleInJectRemoteThread32(IN HWND hwndDlg, IN DWORD dwProcessID, IN LPTSTR szDllPath)
{
        ////////////////////////////////////////////////////////
        // 利用远程线程实现模块注入
        ////////////////////////////////////////////////////////
        if (!dwProcessID)
        {
                ::MessageBox(hwndDlg, TEXT("PID的值不能为空"), TEXT("失败"), MB_ICONWARNING);
                return RETURN_ERROR;
        }
        if (!_tcscmp(szDllPath, TEXT("")))
        {
                ::MessageBox(hwndDlg, TEXT("请先选择要注入的模块"), TEXT("失败"), MB_ICONWARNING);
                return RETURN_ERROR;
        }
        HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessID);
        if (!hProcess)
        {
                ::MessageBox(hwndDlg, TEXT("获取进程句柄失败"), TEXT("失败"), MB_ICONWARNING);
                return RETURN_ERROR;
        }
        // 得到字符串的长度
        DWORD dwLength = ::_tcslen(szDllPath);
        // 在目标进程中申请此长度的空间
        LPVOID lpBaseAddress = ::VirtualAllocEx(hProcess, NULL, dwLength * 2, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
        if (!lpBaseAddress)
        {
                ::MessageBox(hwndDlg, TEXT("在其它进程中申请空间失败"), TEXT("失败"), MB_ICONWARNING);
                return RETURN_ERROR;
        }
        // 将字符串写入到目标进程中
        if (!WriteProcessMemory(hProcess, lpBaseAddress, szDllPath, dwLength * 2, NULL))
        {
                ::MessageBox(hwndDlg, TEXT("内存写入失败"), TEXT("失败"), MB_ICONWARNING);
                goto cleanup;
        }
        HANDLE hThreadGetModuleHandle = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)&GetModuleHandle, lpBaseAddress, 0, NULL);
        if (!hThreadGetModuleHandle)
        {
                ::MessageBox(hwndDlg, TEXT("获取模块句柄远程线程创建失败"), TEXT("失败"), MB_ICONWARNING);
                goto cleanup;
        }
        // 等待远程线程执行完毕
        ::WaitForSingleObject(hThreadGetModuleHandle, INFINITE);
        // 获取到模块句柄
        DWORD dwHGetModuleHandle = NULL;
        if (!GetExitCodeThread(hThreadGetModuleHandle, &dwHGetModuleHandle))
        {
                ::MessageBox(hwndDlg, TEXT("获取模块句柄失败"), TEXT("失败"), MB_ICONWARNING);
                goto cleanup;
        }
        // 检查是否此模块已经被加载
        if (dwHGetModuleHandle)
        {
                ::MessageBox(hwndDlg, TEXT("模块已经加载"), TEXT("失败"), MB_ICONWARNING);
                goto cleanup;
        }
        HANDLE hLoadLibrary = ::CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)&LoadLibrary, lpBaseAddress, 0, NULL);
        if (!hLoadLibrary)
        {
                ::MessageBox(hwndDlg, TEXT("远程线程创建失败"), TEXT("失败"), MB_ICONWARNING);
                goto cleanup;
        }
        // 等待远程线程执行完毕
        ::WaitForSingleObject(hLoadLibrary, INFINITE);
        // 获取到加载到目标进程中的模块句柄
        DWORD dwHLoadLibrary = NULL;
        if (!GetExitCodeThread(hLoadLibrary, &dwHLoadLibrary))
        {
                ::MessageBox(hwndDlg, TEXT("获取远程线程退出码失败"), TEXT("失败"), MB_ICONWARNING);
                goto cleanup;
        }
        if (!dwHLoadLibrary)
        {
                ::MessageBox(hwndDlg, TEXT("获取模块句柄失败"), TEXT("失败"), MB_ICONWARNING);
                goto cleanup;
        }
        ::MessageBox(hwndDlg, TEXT("注入成功"), TEXT("成功"), MB_ICONINFORMATION);
cleanup:
        // 释放为DLL名字申请的空间
        if (!VirtualFreeEx(hProcess, lpBaseAddress, dwLength * 2, MEM_DECOMMIT))
        {
                ::MessageBox(hwndDlg, TEXT("DLL名称空间释放失败"), TEXT("失败"), MB_ICONWARNING);
                return RETURN_ERROR;
        }
        // 关闭进程句柄
        if (!CloseHandle(hProcess))
        {
                ::MessageBox(hwndDlg, TEXT("关闭句柄失败"), TEXT("失败"), MB_ICONWARNING);
                return RETURN_ERROR;
        }
        return RETURN_SUCCESS;
}
// 以前写的一个小程序里的一段, 如果目标进程没有保护应该是能注入的   [注意,32位程序只能注32位进程  64位注64位]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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