使用远程线程来注入DLL

摘要:
PCWSTRpszLibFile){HANDLEhProcess=NULL,PWSTRpszLibFileRemote=NULL;if(hProcess==NULL)returnfalse;if(pszLibFileRemote==NULL)return false;if;

使用远程线程来注入DLL

DLL注入技术要求我们目标进程中的一个线程调用LoadLibrary来载入我们想要的DLL

(1)用OpenProcess函数打开目标进程
(2)用VirtualAllocEx函数在远程进程的地址空间中分派一块内存
(3)用WriteProcessMemory函数把DLL的路径名复制到第一步分配的内存中
(4)用GetProcAddress函数来得到LoadLibraryW函数(在Kernel32.dll中)的实际地址
(5)用CreateRemoteThread函数在远程进程中创建一个线程,让新线程调用LoadLibraryW函数并在参数中传入第1步分配的内存地址。这时,DLL已经被注入到远程进程的地址空间中,DLL的DllMain函数会收到DLL_PROCESS_ATTACH通知并且可以执行我们想要执行的代码。当DllMain返回的时候,远程线程会从LoadLibraryW调用返回到BaseThreadStart函数。BaseThreadStart函数然后调用ExitThread,使远程线程终止。

补充:
(1)OpenProcess函数的作用是打开一个已存在的进程对象,并返回进程的句柄
(2)VirtualAllocEx函数的作用是在指定进程的虚拟空间申请内存,执行成功返回分配内存的首地址,不成功返回NULL
(3)WriteProcessMemory函数的作用是在某一进程的内存区域写入数据
(4)GetProcAddress函数的作用是获取DLL导出函数的地址,使用返回的函数指针调用DLL函数
(5)CreateRemoteThread函数的作用是创建一个在其它进程地址空间中运行的线程

示例代码:

BOOL WINAPI InjectLibW(DWORD dwProcessId, PCWSTR pszLibFile) {

    HANDLE hProcess = NULL, hThread = NULL;
    PWSTR pszLibFileRemote = NULL;

    // 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) return false;

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

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

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

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

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

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

    // 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 true;
}

 源自《Windows核心编程(第5版)》

免责声明:文章转载自《使用远程线程来注入DLL》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇FUSE简介QOS-QOS(服务质量)概述下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

oracle 跟踪文件和转储命令

一、Oracle跟踪文件        Oracle跟踪文件分为三种类型,一种是后台报警日志文件,记录数据库在启动、关闭和运行期间后台进程的活动情况,如表空间创建、回滚段创建、某些alter命令、日志切换、错误消息等。在数据库出现故障时,应首先查看该文件,但文件中的信息与任何错误状态没有必然的联系。后台报警日志文件保存BACKGROUND_DUMP_DES...

Opencv——相机标定

相机标定的目的:获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的选择和平移矩阵),内参和外参系数可以对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像。 相机标定的输入:标定图像上所有内角点的图像坐标,标定板图像上所有内角点的空间三维坐标(一般情况下假定图像位于Z=0平面上)。 相机标定的输出:摄像机的内参、外参系数。 标定流程 1. 准备标定...

开发时javascript 文件调试 chrome 浏览器本地缓存处理

chrome 浏览器 javascript 文件缓存处理 调试一体项目时,js文件需要经常刷新,通过强制刷新全页面重新加载是非常恶心的,我们测试填写的很多数据都需要重新填一遍,当然我们可以写个函数快速填充数据,但是还是不够通用。 尽管我们在新的标签页面请求js,发现js文件已经刷新了。但是当前页面使用的js还是没变...... 解决方案 在开发者模式下停用...

NOIP比赛写代码注意事项

1.头文件:   常用头文件:      <iostream>      <cstdio>      <cmath>      <cstring>      <cstdlib>      cstdio包含scanf和printf,有的编译器iostream都包含了,都写上比较好一般写代码时先都把这...

TS Eslint规则说明

"no-alert": 0,//禁止使用alert confirm prompt "no-array-constructor": 2,//禁止使用数组构造器 "no-bitwise": 0,//禁止使用按位运算符 "no-caller": 1,//禁止使用arguments.caller或arguments.callee "no-catch-sha...

内核如何启动根文件系统?

当u-boot開始运行bootcmd命令,就进入Linux内核启动阶段。与u-boot类似,普通Linux内核的启动过程也能够分为两个阶段,但针对压缩了的内核如uImage就要包含内核自解压过程了。本文以linux-2.6.37版源代码为例分三个阶段来描写叙述内核启动全过程。第一阶段为内核自解压过程,第二阶段主要工作是设置ARM处理器工作模式、使能MMU、...