首页
社区
课程
招聘
[已解决]WriteProcessMemory 进程崩溃
发表于: 2010-2-23 11:56 6987

[已解决]WriteProcessMemory 进程崩溃

MPL 活跃值
1
2010-2-23 11:56
6987
根据句柄和条目顺序号,单击 SysListView32 的条目。
测试任务管理器每次都成功;但测试某程序时每次都失败,造成那个程序的进程崩溃。
下断点到 PostMessage 一句的上一个 WriteProcessMemory 处,发现这里貌似有问题。
调试如果快的话,进程崩溃;慢的话会成功……
请问什么原因?
Thanks in advance.

  function ListView_ClickItem(hWnd: HWND; index: Integer): Bool;
  var
    hProcess: Cardinal;
    pid: Cardinal;
    pItem: PLVItem;
    LocalItem: TLVItem;
    iReadOrWriteCount: Cardinal;
    pNM: PNMHDR;
    LocalNM: NMHDR;
  begin
    GetWindowThreadProcessId(hWnd, pid);//取进程句柄
    hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, pid);

    {修改显示状态}
    ZeroMemory(@LocalItem, SizeOf(LocalItem));
    LocalItem.state := LVIS_SELECTED or LVIS_FOCUSED or LVIS_ACTIVATING;
    LocalItem.stateMask := LVIS_SELECTED;
    pItem := VirtualAllocEx(hProcess, nil, 1024{Sizeof(TLVItem)}, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(hProcess, pItem, @LocalItem, SizeOf(TLVItem), iReadOrWriteCount);
    Result := Bool(SendMessage(hWnd, LVM_SETITEMSTATE, index, Integer(pItem)));
    if not Result then Exit;

    {单击}
    ZeroMemory(@LocalNM, SizeOf(LocalNM));
    LocalNM.hwndFrom := hWnd;
    LocalNM.idFrom := GetDlgCtrlID(hWnd);
    LocalNM.code := NM_CLICK;//NM_DBLCLK;
    pNM := VirtualAllocEx(hProcess, nil, 1024{Sizeof(NMHDR)}, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
    WriteProcessMemory(hProcess, pNM, @LocalNM, SizeOf(NMHDR), iReadOrWriteCount);
    try
      PostMessage(GetParent(hWnd), WM_NOTIFY, LocalNM.idFrom, Integer(pNM));
    except
      Result := Bool(False);
    end;

    VirtualFreeEx(hProcess, pNM, 0, MEM_RELEASE);
    VirtualFreeEx(hProcess, pItem, 0, MEM_RELEASE);
    CloseHandle(hProcess);
  end;

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 6772
活跃值: (3689)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
用Sendmessage代替Postmessage.
2010-2-23 11:59
0
雪    币: 175
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
哥们儿你太凶猛了,果然如你所说啊!
还有俺把最后的几句 VirtualFreeEx 和 CloseHandle 删除,依然用 PostMessage 也是可以的!
可能 PostMessage 返回太快了,消息还没来得及处理,要用的结构体就被最后的几句释放了,所以出错!
谢了~
2010-2-23 13:26
0
雪    币: 175
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
有问题,这个地方必须用 PostMessage,否则不能完成点击的操作~
俺把 CloseHandle 放 VirtualFreeEx 前面就行了!
奇怪,CloseHandle 不是通常放最后的吗
2010-2-23 13:52
0
雪    币: 6772
活跃值: (3689)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我也是菜鸟,交个朋友,共同进步...
2010-2-23 13:53
0
雪    币: 6772
活跃值: (3689)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
CloseHandle 不能放前面
如查非要Postmessage,就加个Sleep(10)
2010-2-23 14:01
0
雪    币: 175
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
加 Sleep 好像行;但把 CloseHandle 放前面也能解决问题。网上有的代码就是把它放前面
2010-2-23 14:13
0
雪    币: 6772
活跃值: (3689)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
CloseHandle 不能放前面,不然内存将没有释放,你可以看一下VirtualFreeEx 的返回值就知道了
2010-2-23 14:18
0
雪    币: 175
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
返回值果然都是 0,没有释放
看来还是要加Sleep
谢了~
2010-2-23 14:29
0
游客
登录 | 注册 方可回帖
返回
//