用远程线程技术实现DLL注入
来源:互联网 发布:unity3d 旧版本 编辑:程序博客网 时间:2024/06/12 19:21
以下摘自《Windows编程循序渐进》--张静盛
使用CreateRemoteThread可以为其它进程创建线程,可以用于以线程形式执行一段存在于目标进程地址空间的代码。
使用远程线程的三个条件:
1. 确保当前进程有足够的权限可以使用OpenProcess打开目标进程。
2. 线程过程函数存在于目标地址空间。
3. 待执行的函数过程的原型必须符合如 DWORD WINAPI ThreadProc(LPVOID lpParameter);
示例程序:(以线程形式执行目标进程的LoadLibraryA函数)
// RemoteThread.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <windows.h>#include <string>#include "stdio.h"#include <iostream>using namespace std;#define DEF_BUF_SIZE 1024// 用于存储注入模块DLL的路径全名char szDllPath[DEF_BUF_SIZE] = {0} ;// 使用远程线程向指定ID的进程注入模块BOOL InjectModuleToProcessById ( DWORD dwProcessId ){if ( dwProcessId == 0 )return FALSE ;// 打开进程HANDLE hProcess = OpenProcess ( PROCESS_ALL_ACCESS, FALSE, dwProcessId ) ;if ( hProcess == NULL )return FALSE ;//申请存放文件名的空间UINTnLen = (UINT)strlen ( szDllPath ) + 1;LPVOIDlpRemoteDllName = VirtualAllocEx ( hProcess, NULL, nLen, MEM_COMMIT, PAGE_READWRITE ) ;if ( lpRemoteDllName == NULL ){printf ( "[ERROR]VirtualAllocEx(%d)\n", GetLastError() ); return FALSE ;}//把dll文件名写入申请的空间if ( WriteProcessMemory ( hProcess, lpRemoteDllName, szDllPath, nLen, NULL) == FALSE ){printf ( "[ERROR]WriteProcessMemory(%d)\n", GetLastError() ); return FALSE ;}//获取动态链接库函数地址HMODULE hModule = GetModuleHandle ( L"kernel32.dll" ) ;LPTHREAD_START_ROUTINE fnStartAddr = ( LPTHREAD_START_ROUTINE )GetProcAddress(hModule,"LoadLibraryA") ;if ( (DWORD)fnStartAddr == 0 ){printf ( "[ERROR]GetProcAddress(%d)\n", GetLastError() ); return FALSE ;}//创建远程线程HANDLE hRemoteThread = CreateRemoteThread ( hProcess, NULL, 0,fnStartAddr, lpRemoteDllName, 0, NULL ) ;if ( hRemoteThread == NULL ){printf ( "[ERROR]CreateRemoteThread(%d)\n", GetLastError() ); return FALSE ;}// 等待远程线程结束if ( WaitForSingleObject ( hRemoteThread, INFINITE ) != WAIT_OBJECT_0 ){printf ( "[ERROR]WaitForSingleObject(%d)\n", GetLastError() ); return FALSE ;}CloseHandle ( hRemoteThread ) ;CloseHandle ( hModule ) ;CloseHandle ( hProcess ) ;return TRUE ;}int _tmain(int argc, _TCHAR* argv[]){// 取得当前工作目录路径GetCurrentDirectoryA ( DEF_BUF_SIZE, szDllPath ) ;// 生成注入模块DLL的路径全名strcat ( szDllPath, "\\DLLSample.dll" ) ;DWORD dwProcessId = 0 ;// 接收用户输入的目标进程IDwhile ( printf ( "请输入目标进程ID:" ) && cin >> dwProcessId && dwProcessId > 0 ) {BOOL bRet = InjectModuleToProcessById ( dwProcessId ) ;printf ( bRet ? "注入成功!\n":"注入失败!\n") ;}return 0;}
总结以上代码,可以看出远程线程注入主要分为以下几个步骤:
①OpenProcess打开目标进程;
②VirtualAllocEx在目标进程内分配一段内存用于存放所要注入的Dll的路径;
③WriteProcessMemory将dll路径写入目标进程分配的内存;
④在本进程内找到LoadLibraryA函数的地址;
⑤在本进程内给目标进程内创建远程线程,线程函数为LoadLibraryA函数,参数为目标进程内分配的内存的地址,其中存放着所要注入DLL的路径;
⑥在本进程内等待远程进程结束,WaitForSingleObject。
- 用远程线程技术实现DLL注入
- Dll注入技术之远程线程注入
- Dll注入技术之远程线程注入
- Dll注入技术之远程线程注入
- Dll注入技术之远程线程注入
- 远程线程注入DLL技术实战分析
- vc实现无dll远程线程注入
- 利用远程线程实现dll的注入
- 创建远程线程实现DLL注入
- 远程线程注入技术(1)之DLL的注入
- 远程线程dll注入
- 远程线程DLL注入
- 远程线程注入dll
- DLL 远程线程注入
- 将注入进行到底--------远程线程实现 Dll 注入 汇编实现
- 远程线程注入技术
- 创建远程线程注入DLL
- 建远程线程注入DLL
- 使用ASP.NET实现Windows Service定时执行任务
- 日期正则表达式
- 正则之\b单词边界
- commandfield列
- 正则之NFA引擎匹配原理
- 用远程线程技术实现DLL注入
- Java学习日志--其他对象System
- 正则之小数点
- 菜鸟修炼C语言小设计之——通讯录(二)
- oracle 日期操作 汇总
- QT Creator 快捷键
- c# 进阶
- 字符串string和内存流MemoryStream及比特数组byte[]互转比转换
- 开发Android应用赚钱