WriteProcessMemory 请问怎样写入字符串

大漠飞狐 2016-10-12 11:22:58
我不知道问题在哪里,写入整型类型没有问题,但我要写入字符串却不成功。


DWORD pid;

HWND hWnd = ::FindWindow(NULL, TEXT("TestServer"));
if (!hWnd)
{
AfxMessageBox(L"没有找到");
}

::GetWindowThreadProcessId(hWnd, &pid);
HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

LPVOID lpBaseAddress = (LPVOID)14177052;
UpdateData();
//DWORD dwValue = _wtoi(m_strWrite);
LPCTSTR kk = m_strWrite;
if (!::WriteProcessMemory(hProcess, lpBaseAddress, (void*)kk, 10, 0))
return;
...全文
573 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
BeanJoy 2016-10-14
  • 打赏
  • 举报
回复
所以说你的问题是没有把申请内存,再把字符串拷贝进去是吧? 还有,要注意strPrompt.Format(L"查询0x%x的页面信息失败" );这句里面把0x%x去掉,后面没有参数。
大漠飞狐 2016-10-12
  • 打赏
  • 举报
回复
引用 2 楼 BeanJoy 的回复:
(LPVOID)14177052是个什么地址,这个地址代表什么东西,有多大? 修改前一般需要修改内存的保护属性,使用VirtualProtectEx。 这个文章可以参考下:内存搜索、修改器(附VC6源码)
14177052 是变量的地址,我改整型变量的内容正常,想改字符趾却弄不了。
VirtualProtectEx(hProcess, lpBaseAddress, 8, PAGE_EXECUTE_READWRITE,0 );
这句也加了,没反应。
encoderlee 2016-10-12
  • 打赏
  • 举报
回复
WriteProcessMemory(hProcess, lpBaseAddress, (void*)kk, 10, 0) 这里的10是10个字节,要注意字符集是多字节字符集还是Unicode
BeanJoy 2016-10-12
  • 打赏
  • 举报
回复
(LPVOID)14177052是个什么地址,这个地址代表什么东西,有多大? 修改前一般需要修改内存的保护属性,使用VirtualProtectEx。 这个文章可以参考下:内存搜索、修改器(附VC6源码)
向立天 2016-10-12
  • 打赏
  • 举报
回复
是不是你的长度指定有问题 应该是字节长度而不是字符串长度 如果你写入的是unicode字符串应该是字符串长度的2倍
大漠飞狐 2016-10-12
  • 打赏
  • 举报
回复
引用 2 楼 BeanJoy 的回复:
(LPVOID)14177052是个什么地址,这个地址代表什么东西,有多大? 修改前一般需要修改内存的保护属性,使用VirtualProtectEx。 这个文章可以参考下:内存搜索、修改器(附VC6源码)
下载了这个例子,我再通过提炼,成功运行。写的时候字节数大一些小一些问题不大。

	DWORD pid;
	HWND hWnd = ::FindWindow(NULL, TEXT("TestServer"));
	if (!hWnd)
	{
		AfxMessageBox(L"没有找到");
	}
	::GetWindowThreadProcessId(hWnd, &pid);
	HANDLE hProcess = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);

	LPVOID lpBaseAddress = (LPVOID)14177052;

	CString strPrompt;
	BOOL bRet = FALSE;
	CString aa;
	m_editStr.GetWindowTextW(aa);
	LPCTSTR paa = aa;
	aa.Trim();
	int width = aa.GetLength()*2+2;
	BYTE* strModi = new BYTE[width];
	memcpy(strModi, paa, width);
	MEMORY_BASIC_INFORMATION mbi;
	DWORD dwOldProtect;
	if (sizeof(mbi) != VirtualQueryEx(hProcess, lpBaseAddress, &mbi, sizeof(mbi)))
	{
		strPrompt.Format(L"查询0x%x的页面信息失败" );		AfxMessageBox(strPrompt);
	}
	if (FALSE == VirtualProtectEx(hProcess, mbi.BaseAddress, mbi.RegionSize,
		PAGE_EXECUTE_READWRITE, &dwOldProtect))
	{
		strPrompt.Format(L"设置0x%x的页面属性失败");		AfxMessageBox(strPrompt);
	}
	bRet = WriteProcessMemory(hProcess, lpBaseAddress, strModi, width, NULL);
	if (FALSE == bRet)
	{
		strPrompt.Format(L"修改0x%x的值失败");		AfxMessageBox(strPrompt);
	}
	delete strModi;
非常感谢各位的帮助,现在问题解决了。
大漠飞狐 2016-10-12
  • 打赏
  • 举报
回复
引用 8 楼 jacksonfan 的回复:
要先把字符串写到目标进程才行 LPTSTR pText = NULL; pText = (LPTSTR)VirtualAllocEx(hProcess, NULL, 256, MEM_COMMIT, PAGE_READWRITE); WriteProcessMemory(hProcess,pText ,你的字符串,长度,NULL); 然后再把这个地址写入目标地址中
目标地址 在哪个语句中用起来?
jacksonfan 2016-10-12
  • 打赏
  • 举报
回复
要先把字符串写到目标进程才行
LPTSTR pText = NULL;
pText = (LPTSTR)VirtualAllocEx(hProcess, NULL, 256, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess,pText ,你的字符串,长度,NULL);

然后再把这个地址写入目标地址中
Eleven 2016-10-12
  • 打赏
  • 举报
回复
WriteProcessMemory调用失败的GetLastError值是什么?
BeanJoy 2016-10-12
  • 打赏
  • 举报
回复
引用 4 楼 cyjcn1 的回复:
[quote=引用 2 楼 BeanJoy 的回复:] (LPVOID)14177052是个什么地址,这个地址代表什么东西,有多大? 修改前一般需要修改内存的保护属性,使用VirtualProtectEx。 这个文章可以参考下:内存搜索、修改器(附VC6源码)
14177052 是变量的地址,我改整型变量的内容正常,想改字符趾却弄不了。
VirtualProtectEx(hProcess, lpBaseAddress, 8, PAGE_EXECUTE_READWRITE,0 );
这句也加了,没反应。[/quote] 在内存中,整形和字符串是没有区别的,既然整形没问题,那么字符串也应该行的,注意字符串的大小,以后最后以0结束。 先一点点的调整字符串的大小,然后观察情况进行分析。 比如int a=10;可以将a写入进去,然后这样: *(char *)&a ='A'; *(((char *)&a) + 1) = 0; 这样a的地址就是存的字符”A"了,然后调试分析,一点点加长字符串的长度。
大漠飞狐 2016-10-12
  • 打赏
  • 举报
回复
关于字节数,我不管改大点还是改成一样,或改小点都不行。读可以正常读,就是不能写

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧