首页
社区
课程
招聘
[旧帖] [求助]无dll远程写入线程-帮忙看哪错了 0.00雪花
发表于: 2009-12-8 17:02 1462

[旧帖] [求助]无dll远程写入线程-帮忙看哪错了 0.00雪花

2009-12-8 17:02
1462
#include <windows.h>
#include <TLHELP32.H>

struct _ProcessMsg
{
	int (WINAPI *MyMessageBox)(HWND, LPCTSTR, LPCTSTR, UINT);
};

DWORD WINAPI ThreadProc(LPVOID lpParent)
{
	struct _ProcessMsg *msg = (struct _ProcessMsg*)lpParent;
	
	msg->MyMessageBox(NULL, TEXT("我是无dll进去的"), TEXT("提示"), MB_OK);
	
	return 0;
}

DWORD GetProcessID(TCHAR *szProcess)
{
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
	PROCESSENTRY32W pe;
	
	if (hSnapshot == INVALID_HANDLE_VALUE) return -1;
	pe.dwSize = sizeof(pe);
	Process32FirstW(hSnapshot, &pe);

	do 
	{
		if (0 == wcsicmp(szProcess, pe.szExeFile))
		{
			return pe.th32ProcessID;
		}
	} while(Process32NextW(hSnapshot, &pe));
	
	return 0;
}

HANDLE GetProcessHandle(TCHAR *szProcess)
{
	DWORD dwProcess = GetProcessID(szProcess);
	//找到进程则不为0
	if (0 == dwProcess)
	{
		MessageBoxW(NULL, TEXT("找不到进程"), TEXT("提示"), 0);
		return NULL;
	}
	//打开进程
	HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_QUERY_INFORMATION|
		PROCESS_VM_OPERATION|PROCESS_VM_WRITE, FALSE, dwProcess);
	
	return hProcess;
}

bool InserThread(HANDLE hProcess)
{
	struct _ProcessMsg msg;
	(FARPROC&)msg.MyMessageBox = GetProcAddress(GetModuleHandleW(TEXT("User32.dll")), "MessageBoxW");
	DWORD dwSize = sizeof(msg);
	
	//向远程进程中写入参数
	LPVOID lpBuf = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
	DWORD dwWrite;
	if (0 == WriteProcessMemory(hProcess, lpBuf, &msg, dwSize, &dwWrite))
	{
		VirtualFreeEx(hProcess, lpBuf, dwSize, MEM_DECOMMIT);
		MessageBoxW(NULL, TEXT("写入远程数据错误"), TEXT("提示"), 0);
		return FALSE;
	}
	
	LPVOID lpThread = VirtualAllocEx(hProcess, NULL, 1024, MEM_COMMIT, PAGE_READWRITE);
	if (0 == WriteProcessMemory(hProcess, lpThread, ThreadProc, 1024, &dwWrite))
	{
		VirtualFreeEx(hProcess, lpThread, 1024, MEM_DECOMMIT);
		MessageBoxW(NULL, TEXT("写入远程数据错误"), TEXT("提示"), 0);
		return FALSE;
	}
	
	CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)lpThread, lpBuf, 0, 0);
	return true;
}

int main()
{
	TCHAR szProcess[64] = TEXT("explorer.exe");
	HANDLE hProcess = GetProcessHandle(szProcess);		//获取指定进程句柄
	
	if (NULL == hProcess)
	{
		MessageBoxW(NULL, TEXT("打开进程失败"), TEXT("警告"), 0);
		return -1;
	}
	
	bool blInsert = InserThread(hProcess);			//向指定进程远程写入线程并执行
	
	if (FALSE == blInsert)
	{
		MessageBoxW(NULL, TEXT("插入远程线程失败"), TEXT("警告"), 0);
		return -1;
	}
	return 0;
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 44
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
msg->MyMessageBox(NULL, TEXT("我是无dll进去的"), TEXT("提示"), MB_OK);

是不是运行了explorer就崩了。这个代码你直接考到别的进程里面怎么可以直接用呢,那两个字符串你又没拷过去,在你本进程它会分配一个地址,但是到了explorer.exe里面那个地址不一定有效。
2009-12-8 18:59
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
OpenProcess 这个
2009-12-8 20:22
0
雪    币: 370
活跃值: (52)
能力值: ( LV13,RANK:350 )
在线值:
发帖
回帖
粉丝
4
进程的空间是相互独立 所以依赖于本进程虚拟内存空间所有地址 指针都需要重定位的
(我是无dll进去的"), TEXT("提示)像这个其中的 "我是无dll进去的"  你写到远程进程中的是原进程空间的地址 在远程线程中就找不到  你这个还有诸多类似问题
copy到远程线程中的代码还是用汇编实现比较好 在VC中可以写内嵌汇编的裸函数也行
在论坛中找下相关文章先看下吧 有不少
2009-12-8 21:49
0
游客
登录 | 注册 方可回帖
返回
//