WriteProcessMemory参数错误

Don-Chen 2009-04-03 05:14:37
一个Hook API的小程序,在用WriteProcessMemory把Hook代码写到远程进程的时候出错,GetLastError返回代码87(参数错误),求解决方法!
WriteProcessMemory(hTargetProcess, (LPVOID)dwFuncAddr, (LPCVOID)HookSend, 8192, NULL); 《=====就是这句错误
HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwHookProcId);《=====打开进程
dwFuncAddr = (DWORD)VirtualAllocEx(hTargetProcess, NULL, 8192,
MEM_COMMIT | MEM_RESERVE,PAGE_EXECUTE_READWRITE);
《===========申请远程线程内存

ps:这个程序参考另一个程序写的,那个程序运行在命令行模式下,正常运行,我想加个界面就不行了
...全文
312 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
狂放之歌 2009-04-05
  • 打赏
  • 举报
回复
纳米盘下不到附件~!
Don-Chen 2009-04-05
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 coding_hello 的回复:]
struct RemoteParam结构定义中的WCHAR szFileName[24]太短了,很容易就被wcscpy(RParam.szFileName, szSaveFileName);这句代码写越界,导致dwFuncAddr的值被修改。

字符串复制前要检查源buffer和目标串的长度。建议把WCHAR szFileName[24]改为WCHAR szFileName[MAX_PATH]
[/Quote]

真的是这样,谢谢了!分就给你了
野男孩 2009-04-05
  • 打赏
  • 举报
回复
struct RemoteParam结构定义中的WCHAR szFileName[24]太短了,很容易就被wcscpy(RParam.szFileName, szSaveFileName);这句代码写越界,导致dwFuncAddr的值被修改。

字符串复制前要检查源buffer和目标串的长度。建议把WCHAR szFileName[24]改为WCHAR szFileName[MAX_PATH]
Don-Chen 2009-04-05
  • 打赏
  • 举报
回复
为了对比,我把命令行模式下调试成功的程序也放上来。
hookWs32.rar
Don-Chen 2009-04-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 yinyuanqings 的回复:]
引用楼主 qishiyexu 的帖子:
一个Hook API的小程序,在用WriteProcessMemory把Hook代码写到远程进程的时候出错,GetLastError返回代码87(参数错误),求解决方法!
WriteProcessMemory(hTargetProcess, (LPVOID)dwFuncAddr, (LPCVOID)HookSend, 8192, NULL); 《=====就是这句错误
HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwHookProcId);《=====打开进程
dwFuncAddr = (DWORD)VirtualAllocEx(h…
[/Quote]

我是用过LPVOID的,但是不行,才改LPCVOID的,以为我看到一个能调试通的程序用LPCVOID没问题。而OpenProcess我是设置了all access 的权限的。
不会弄附件,只好上传到纳米盘,麻烦帮看看!
hookSocket.rar
hust_terry 2009-04-04
  • 打赏
  • 举报
回复
同意试试6楼的方法。
cnzdgs 2009-04-04
  • 打赏
  • 举报
回复
是WriteProcessMemory返回FALSE吗?OpenProcess和VirtualAllocEx都成功了吗?把这段代码完整贴出来(附件资源不存在)。
yinyuanqings 2009-04-04
  • 打赏
  • 举报
回复
[Quote=引用楼主 qishiyexu 的帖子:]
一个Hook API的小程序,在用WriteProcessMemory把Hook代码写到远程进程的时候出错,GetLastError返回代码87(参数错误),求解决方法!
WriteProcessMemory(hTargetProcess, (LPVOID)dwFuncAddr, (LPCVOID)HookSend, 8192, NULL); 《=====就是这句错误
HANDLE hTargetProcess = OpenProcess(PROCESS_ALL_ACCESS, false, dwHookProcId);《=====打开进程
dwFuncAddr = (DWORD)VirtualAllocEx(hTargetProcess, NULL, 8192,

[/Quote]
楼主你仔细看看MSDN上关于WriteProcessMemory的说明,第3个参数dwFuncAddr要求是一个LPVOID,而你传递的是一个LPCVOID,一个常量VOID指针是不能被cast成LPVOID的,你把(LPCVOID)HookSend改成(LPVOID)HookSend看看?
gyk120 2009-04-04
  • 打赏
  • 举报
回复
同意楼上
BOOL WriteProcessMemory(
  HANDLE hProcess,
  LPVOID lpBaseAddress,
  LPVOID lpBuffer,
  DWORD nSize,
  LPDWORD lpNumberOfBytesWritten
  );
jingzhongrong 2009-04-04
  • 打赏
  • 举报
回复
ERROR_INVALID_PARAMETER
87 The parameter is incorrect.

调试查看你的参数是否传递正确。

另外WriteProcessMemory的那个进程要有PROCESS_VM_WRITE、PROCESS_VM_OPERATION权限
jyh_baoding 2009-04-04
  • 打赏
  • 举报
回复
帮顶
Don-Chen 2009-04-04
  • 打赏
  • 举报
回复
有没有人帮忙啊?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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