C++进程注入

简介: 代码 #include "stdafx.h"#include #include #include "stdio.h"#include using namespace std;#define DEF_BUF_SIZE 1024// 用于存储注入模块DLL的路径全名char szDllPath...
img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 代码
 
  
#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 ;

// 申请存放文件名的空间
UINT nLen = (UINT)strlen ( szDllPath ) + 1 ;
LPVOID lpRemoteDllName
= 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, " \\DLL.dll " ) ;

DWORD dwProcessId
= 0 ;
// 接收用户输入的目标进程ID
while ( printf ( " 请输入目标进程ID: " ) && cin >> dwProcessId && dwProcessId > 0 )
{
BOOL bRet
= InjectModuleToProcessById ( dwProcessId ) ;
printf ( bRet
? " 注入成功!\n " : " 注入失败!\n " ) ;
}
return 0 ;
}

 

没试过EXE文件

暂时不知道让自己的代码何时运行的方法

目录
相关文章
|
7月前
|
存储 安全 算法
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
【C++智能指针 相关应用】深入探索C++智能指针:跨进程、动态库与最佳实践
118 5
|
7月前
|
Linux C语言 C++
C/C++进程超详细详解【下部分】(系统性学习day8)
C/C++进程超详细详解【下部分】(系统性学习day8)
|
7月前
|
消息中间件 Linux API
C/C++ 进程间通信system V IPC对象超详细讲解(系统性学习day9)
C/C++ 进程间通信system V IPC对象超详细讲解(系统性学习day9)
|
2月前
|
资源调度 Linux 调度
Linux c/c++之进程基础
这篇文章主要介绍了Linux下C/C++进程的基本概念、组成、模式、运行和状态,以及如何使用系统调用创建和管理进程。
43 0
|
6月前
|
存储 分布式数据库 API
技术好文:VisualC++查看文件被哪个进程占用
技术好文:VisualC++查看文件被哪个进程占用
|
2月前
|
消息中间件 Linux API
Linux c/c++之IPC进程间通信
这篇文章详细介绍了Linux下C/C++进程间通信(IPC)的三种主要技术:共享内存、消息队列和信号量,包括它们的编程模型、API函数原型、优势与缺点,并通过示例代码展示了它们的创建、使用和管理方法。
38 0
Linux c/c++之IPC进程间通信
|
2月前
|
Linux C++
Linux c/c++进程间通信(1)
这篇文章介绍了Linux下C/C++进程间通信的几种方式,包括普通文件、文件映射虚拟内存、管道通信(FIFO),并提供了示例代码和标准输入输出设备的应用。
34 0
Linux c/c++进程间通信(1)
|
2月前
|
Linux C++
Linux c/c++之进程的创建
这篇文章介绍了在Linux环境下使用C/C++创建进程的三种方式:system函数、fork函数以及exec族函数,并展示了它们的代码示例和运行结果。
43 0
Linux c/c++之进程的创建
|
2月前
|
Linux C++
Linux c/c++进程之僵尸进程和守护进程
这篇文章介绍了Linux系统中僵尸进程和守护进程的概念、产生原因、解决方法以及如何创建守护进程。
26 0
|
7月前
|
安全 Linux 开发者
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
⭐⭐⭐⭐⭐Linux C/C++ 进程崩溃诊断以及有效数据收集:解锁代码问题快速定位与修复的方法
439 1

相关实验场景

更多