[windows平台] 给进程注入代码 -- 导入DLL到指定进程的地址空间
2014-04-01 15:07
696 查看
1. 基本原理
使用自己写的代码, 在指定的进程里面启动一个远程线程, 从而把相关的代码注入到这个指定进程里面去, 实施操作. 通常这样做是为了拦截一些系统的 API, 或者是操控(挟持)这个进程.
2. 具体实现
拿到进程的句柄, 然后用 LoadLibrary 系统函数开启一个远程的线程. 从而把我们的DLL导入到这个指定的进程.(读者可以使用自己的办法, 不过套路应该都差不多)
3. 样例代码
#include "windows.h"
int main()
{
char * lpExeFile = "D:\\src-project\\testProcess.exe";
char * lpDllFile = "D:\\src-project\\memTrace.dll";
// Step 1. 开启想要跟踪的进程,并挂起.
STARTUPINFOA startupInfo = { sizeof(startupInfo) };
PROCESS_INFORMATION processInfo;
if ( ! CreateProcessA(
NULL,lpExeFile,NULL,NULL,FALSE,CREATE_SUSPENDED,
NULL,NULL,&startupInfo,&processInfo ) )
{
return -1;
}
// Step 2. 开启远程线程的相关参数初始化.
LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL; // 表示使用默认值.
SIZE_T sizeStack = 0; // 表示使用默认值.
LPTHREAD_START_ROUTINE lpStartAddress // 新线程执行入口地址.
= (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("Kernel32"),"LoadLibraryA");
LPVOID lpParameter = NULL; // 传给新线程的参数.
DWORD flagCreation = 0; // 表示立即执行, CREATE_SUSPENDED
表示挂起.
DWORD threadID = 0; // 用来记录新创建的线程的ID.
// Step 3. 准备远程线程需要的参数.
SIZE_T sizeLength = strlen(lpDllFile) + 1;
lpParameter = VirtualAllocEx(processInfo.hProcess,NULL,sizeLength,MEM_COMMIT,PAGE_READWRITE);
if ( ! lpParameter ) return -1;
if ( ! WriteProcessMemory(processInfo.hProcess,lpParameter,lpDllFile,sizeLength,NULL) )
return -1;
// Step 4. 通过远程线程导入我们的动态库.
HANDLE hRemoteThread = CreateRemoteThread(
processInfo.hProcess,lpThreadAttributes,sizeStack,
lpStartAddress,lpParameter,flagCreation,&threadID);
WaitForSingleObject(hRemoteThread,INFINITE);
// Step 5. 恢复子进程的主线程, 相关系统资源的销毁.
ResumeThread(processInfo.hThread);
VirtualFreeEx(processInfo.hProcess,lpParameter,0,MEM_RELEASE);
if ( hRemoteThread ) CloseHandle(hRemoteThread);
if ( processInfo.hThread ) CloseHandle(processInfo.hThread);
if ( processInfo.hProcess ) CloseHandle(processInfo.hProcess);
return 0;
}
使用自己写的代码, 在指定的进程里面启动一个远程线程, 从而把相关的代码注入到这个指定进程里面去, 实施操作. 通常这样做是为了拦截一些系统的 API, 或者是操控(挟持)这个进程.
2. 具体实现
拿到进程的句柄, 然后用 LoadLibrary 系统函数开启一个远程的线程. 从而把我们的DLL导入到这个指定的进程.(读者可以使用自己的办法, 不过套路应该都差不多)
3. 样例代码
#include "windows.h"
int main()
{
char * lpExeFile = "D:\\src-project\\testProcess.exe";
char * lpDllFile = "D:\\src-project\\memTrace.dll";
// Step 1. 开启想要跟踪的进程,并挂起.
STARTUPINFOA startupInfo = { sizeof(startupInfo) };
PROCESS_INFORMATION processInfo;
if ( ! CreateProcessA(
NULL,lpExeFile,NULL,NULL,FALSE,CREATE_SUSPENDED,
NULL,NULL,&startupInfo,&processInfo ) )
{
return -1;
}
// Step 2. 开启远程线程的相关参数初始化.
LPSECURITY_ATTRIBUTES lpThreadAttributes = NULL; // 表示使用默认值.
SIZE_T sizeStack = 0; // 表示使用默认值.
LPTHREAD_START_ROUTINE lpStartAddress // 新线程执行入口地址.
= (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandleA("Kernel32"),"LoadLibraryA");
LPVOID lpParameter = NULL; // 传给新线程的参数.
DWORD flagCreation = 0; // 表示立即执行, CREATE_SUSPENDED
表示挂起.
DWORD threadID = 0; // 用来记录新创建的线程的ID.
// Step 3. 准备远程线程需要的参数.
SIZE_T sizeLength = strlen(lpDllFile) + 1;
lpParameter = VirtualAllocEx(processInfo.hProcess,NULL,sizeLength,MEM_COMMIT,PAGE_READWRITE);
if ( ! lpParameter ) return -1;
if ( ! WriteProcessMemory(processInfo.hProcess,lpParameter,lpDllFile,sizeLength,NULL) )
return -1;
// Step 4. 通过远程线程导入我们的动态库.
HANDLE hRemoteThread = CreateRemoteThread(
processInfo.hProcess,lpThreadAttributes,sizeStack,
lpStartAddress,lpParameter,flagCreation,&threadID);
WaitForSingleObject(hRemoteThread,INFINITE);
// Step 5. 恢复子进程的主线程, 相关系统资源的销毁.
ResumeThread(processInfo.hThread);
VirtualFreeEx(processInfo.hProcess,lpParameter,0,MEM_RELEASE);
if ( hRemoteThread ) CloseHandle(hRemoteThread);
if ( processInfo.hThread ) CloseHandle(processInfo.hThread);
if ( processInfo.hProcess ) CloseHandle(processInfo.hProcess);
return 0;
}
相关文章推荐
- 基于visual c++之windows核心编程代码分析(63)无模块dll进程注射
- Dll注入系统进程的部分代码
- 基于visual c++之windows核心编程代码分析(63)无模块dll进程注射
- 更新了已经过测试-Windows下如何改写目标进程的窗口函数来注入DLL
- Linux 平台一种进程代码注入方法
- MFC:AfxLoadLibrary-将指定的 DLL 映射到调用进程的地址空间
- ring3层面函数HOOK从头来之(一)——无dll远程进程代码注入
- 深入探究Windows平台客户端安全问题-进程地址空间入侵和白加黑高阶利用
- Linux 平台一种进程代码注入方法
- Windows提供了两种将DLL映像到进程地址空间的方法
- [置顶] 恶意代码--dll动态链接库注入目标进程隐藏自身(亲测win7x86和x64有效)
- Linux 平台一种进程代码注入方法
- Windows提供了两种将DLL映像到进程地址空间的方法
- 基于visual c++之windows核心编程代码分析(63)无模块dll进程注射
- windows平台实现dll远程注入的简单例子
- Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)
- windows平台下杀死指定端口的进程(转载)
- 基于visual c++之windows核心编程代码分析(54)实现Winlogon注入dll
- 基于visual c++之windows核心编程代码分析(54)实现Winlogon注入dll
- 基于visual c++之windows核心编程代码分析(54)实现Winlogon注入dll