`

简单的CreateRemoteThread例程(进程注入)

    博客分类:
  • VC
阅读更多

#include "stdafx.h"
#include <windows.h>
#include <iostream>
using namespace std;

// 保存数据的结构体
typedef struct tagRpcData
{
	char	m_szData[MAX_PATH];
	void*	m_pfunCall;
}stRpcData, *LPRPCDATA;

int const MAX_REMOTE_DATA = 1024 * 4;

typedef int(__stdcall* PFUNMESSAGE)(HWND, LPCTSTR, LPCTSTR, UINT);
int RemoteThread(HWND hwnd, LPCTSTR lpszContent);
DWORD __stdcall RpcFunc(LPRPCDATA pData);

int main()
{
	HWND hwnd = FindWindow("notepad", NULL);

	RemoteThread(hwnd, "Hello, andylin!");

	return 0;
};

//远程线程的函数
DWORD __stdcall RpcFunc(LPRPCDATA pData)
{
	PFUNMESSAGE pfunMsg = (PFUNMESSAGE)pData->m_pfunCall;
	pfunMsg(NULL, pData->m_szData, NULL, MB_OK);

	return 0;
}

int RemoteThread(HWND hwnd, LPCTSTR lpszContent)
{
	DWORD		dwThreadId	= 0;
	HANDLE		hProcess	= NULL;
	HINSTANCE	hInst		= NULL;

	//如果显示内容为NULL,直接返回失败!
	if ( (NULL == lpszContent) || (NULL == hwnd) )
	{
		cout << "err param!" << endl;
		return -1;
	}

	//打开进程
	::GetWindowThreadProcessId(hwnd, &dwThreadId);
	hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwThreadId);

	if (NULL == hProcess)
	{
		cout << "Open Processs failed!" << endl;
		return -2;
	}	

	//初始化调用结构
	stRpcData stData = {0};
	strncpy(stData.m_szData, lpszContent, sizeof(stData.m_szData));

	hInst = ::LoadLibrary("user32.dll");
	if (!hInst)
	{
		cout << "can't load user32.dll" << endl;
		return -3;
	}

	stData.m_pfunCall = GetProcAddress(hInst, "MessageBoxA");
	FreeLibrary(hInst);

	if (NULL == stData.m_pfunCall)
	{
		cout << "get function address failed!" << endl;
		return -4;
	}

	//分配空间
	LPVOID pRmtFunc = VirtualAllocEx(hProcess, NULL, MAX_REMOTE_DATA, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
	if (NULL == pRmtFunc)
	{
		cout << "Virtual Alloc Memory failed!" << endl;
		return -5;
	}

	if (!WriteProcessMemory(hProcess, pRmtFunc, RpcFunc, MAX_REMOTE_DATA, NULL))
	{
		cout << "write remote data failed!";
		return -6;
	}

	LPRPCDATA pstRmtData = (LPRPCDATA)VirtualAllocEx(hProcess, NULL, MAX_REMOTE_DATA, MEM_COMMIT, PAGE_READWRITE);
	if (NULL == pstRmtData)
	{
		cout << "Virtual Alloc Memory failed!" << endl;
		return -5;
	}

	if (!WriteProcessMemory(hProcess, pstRmtData, &stData, sizeof(stData), 0))
	{
		cout << "write remote data failed!";
		return -6;
	}


	//创建远程线程
	HANDLE hRmtThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pRmtFunc, pstRmtData, 0, 0);

	if (NULL == hRmtThread)
	{
		cout << "create remote thread failed!" << endl;
		return -7;
	}

	//清除工作
	if (NULL != hRmtThread)
	{
		CloseHandle(hRmtThread);
		hRmtThread = NULL;
	}	

	if (NULL != hProcess)
	{
		VirtualFreeEx(hProcess, pRmtFunc, MAX_REMOTE_DATA, MEM_RELEASE);
		VirtualFreeEx(hProcess, pstRmtData, MAX_REMOTE_DATA, MEM_RELEASE);

		CloseHandle(hProcess);
		hProcess = NULL;
	}
	
	cout << "create remote thread succ!" << endl;

	return 0;
}
 
分享到:
评论
1 楼 andylin02 2009-09-10  
编译成RELEASE版本就不会出错了,主要是DEBUG版本加了一个__chkesp的函数导致调用了非法地址

相关推荐

    将代码注入到进程中并运行.rar_内存注入_易语言注入进程源码例程_进程注入

    在易语言中进行进程注入,主要涉及以下几个步骤: 1. **打开进程**:使用`OpenProcess` API函数获取目标进程的句柄,这需要进程的PID(进程标识符)和适当的访问权限。 2. **分配内存**:使用`VirtualAllocEx` API...

    输入法注入源码+例程

    `EXE注入.e`和`my.e`这两个文件可能是电子书(.e格式)或某种编程文档,详细解释了如何进行进程注入,即如何将DLL文件加载到另一个正在运行的执行程序(EXE)中。进程注入是输入法注入的关键步骤,它使得自定义的...

    监控记事本模块源码和例程

    3. **API调用**:在Windows环境下,进程注入通常通过API函数如`CreateRemoteThread`、`VirtualAllocEx`和`WriteProcessMemory`等实现。这些函数允许程序在目标进程中分配内存、写入数据并执行新线程。 4. **易语言*...

    注入机器码到指定进程

    描述中提到的"关联目的进程源码例程",意味着在进行机器码注入时,可能需要理解目标进程的内部工作原理,例如它的函数调用流程、数据结构等。这样可以确保注入的机器码能在正确的位置执行,并达到预期效果。"程序...

    InjectExe4.zip_matlab例程_Visual_C++_

    标题 "InjectExe4.zip_matlab例程_Visual_C++_" 暗示这是一个关于在Windows系统中使用MATLAB编程和Visual C++进行进程注入技术的实例。在这个项目中,开发者可能通过MATLAB生成shellcode,然后利用C++编写程序来注入...

    易语言内存运行exe模块及例程.rar

    易语言是一种基于中文编程的计算机程序设计语言,其设计目标是让编程更加简单、直观,尤其适合初学者。本压缩包“易语言内存运行exe模块及例程.rar”提供了在易语言环境中实现程序在内存中运行的方法,这有助于避免...

    DLL内存注入源码

    6. **创建远程线程**:使用`CreateRemoteThread`在目标进程中创建一个新的线程,该线程会调用`LoadLibrary`或`GetProcAddress`等函数,使得目标进程加载并执行DLL中的代码。 7. **等待执行**:新线程执行完毕后,...

    DLL注入修改输入表模块

    4. 创建远程线程:调用`CreateRemoteThread` API函数,使得目标进程加载并执行DLL中的导出函数。 5. 修改输入表:一旦DLL被成功注入,它可以通过内部的代码找到输入表的内存地址,然后使用API函数如`...

    用户模式下的挂机中断和调用内核例程

    1. **动态链接库(DLL Injection)**:通过注入DLL到目标进程,可以实现API钩子和挂机中断。这通常涉及使用CreateRemoteThread创建远程线程,将DLL的地址加载到目标进程的地址空间。 2. **原生API**:使用如...

    LoadDLL(1)_dll_

    描述提到的“注入库”是实现这个技术的关键,它通过手动映射DLL、处理导入并调用启动例程来完成。 DLL(动态链接库)是Windows操作系统中一种共享代码的方式,它允许多个应用程序同时使用同一段代码,节省内存资源...

    易语言-易语言进程查看和结束

    这通常涉及到进程注入和反注入技术,需要对系统底层有较深的理解。在易语言中,这可能涉及到调用如`CreateRemoteThread`和`WriteProcessMemory`等API函数,来实现对目标进程的控制。 总的来说,易语言提供的这些...

    截获外部程序窗口消息.rar

    接下来,"注入DLL"(Dynamic Link Library Injection)是一种更深入的技术,它涉及将自定义的DLL文件加载到目标进程的地址空间中。通过这种方式,我们可以向目标程序注入代码,使其执行我们提供的函数,从而截获和...

    易语言-apihook达到对指定进程隐藏窗口

    3. **注入DLL**:使用`CreateRemoteThread` API或其他注入技术,将我们的DLL注入到目标进程中。这样,DLL中的Hook函数就可以在目标进程中执行了。 4. **Hook API**:在DLL中,我们需要找到窗口枚举API的地址,然后...

    补丁模块(带源码)InlinePatch,Hook,内存DLL注入等等

    注入成功返回 true, 注入失败则返回 false,CreateRemoteThread法 .参数 进程ID, 整数型, , 进程PID .参数 DLL文件名, 文本型, , 欲注入的DLL名称 .子程序 InjectDLL1, 逻辑型, 公开, SuspendThread,shellcode,...

    易语言-通用DLL注入E源码仅供学习

    注入DLL到其他进程可以实现跨进程通信,或者在不修改目标程序的情况下扩展其功能。 在易语言中,实现DLL注入通常需要以下几个步骤: 1. **创建DLL**:首先,你需要编写一个DLL,包含需要在目标进程中执行的函数。...

Global site tag (gtag.js) - Google Analytics