跨进程读写其他程序中MFCGridCtr控件的数据

Rockismej 2019-06-23 01:29:31
跨进程获取数据,此程序控件用的是MFCGridCtr,我用获取hWnd,Sendmessge postmessage依然没搞定,如果谁亲自搞过的话,帮忙说下大致的思路和流程,多谢多谢了
...全文
390 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
gouyanfen 2019-06-27
  • 打赏
  • 举报
回复
引用 14 楼 Rockismej 的回复:
[quote=引用 12 楼 gouyanfen 的回复:] [quote=引用 楼主 Rockismej 的回复:] 跨进程获取数据,此程序控件用的是MFCGridCtr,我用获取hWnd,Sendmessge postmessage依然没搞定,如果谁亲自搞过的话,帮忙说下大致的思路和流程,多谢多谢了
没什么限制写个dll注入到目标进程,获取控件指针,然后找到对应的MFCGridCtr版本,查看对应函数偏移,去调用他自己的模块返回数据,然后把数据传给你的程序[/quote] 我这个程序就是以DLL的形式加载的,且宿主软件特别大功能较多,如果再写个DLL注入的话,可能操作不好的对宿主的稳定性有影响,所以想了下折中方法还是模拟稍微好点,但就是是非标准WINDOS控件,好多标准的消息不支持[/quote] 只是读取数据,指针找对,还是没问题的,我只是提供个思路,具体还得自己衡量了
Rockismej 2019-06-27
  • 打赏
  • 举报
回复
引用 14 楼 Rockismej 的回复:
[quote=引用 12 楼 gouyanfen 的回复:] [quote=引用 楼主 Rockismej 的回复:] 跨进程获取数据,此程序控件用的是MFCGridCtr,我用获取hWnd,Sendmessge postmessage依然没搞定,如果谁亲自搞过的话,帮忙说下大致的思路和流程,多谢多谢了
没什么限制写个dll注入到目标进程,获取控件指针,然后找到对应的MFCGridCtr版本,查看对应函数偏移,去调用他自己的模块返回数据,然后把数据传给你的程序[/quote] 我这个程序就是以DLL的形式加载的,且宿主软件特别大功能较多,如果再写个DLL注入的话,可能操作不好的对宿主的稳定性有影响,所以想了下折中方法还是模拟稍微好点,但就是是非标准WINDOS控件,好多标准的消息不支持[/quote]
引用 13 楼 赵4老师 的回复:
WinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/
这个看起来好高级的样子,我先学习学习,谢谢赵老师
Rockismej 2019-06-27
  • 打赏
  • 举报
回复
引用 12 楼 gouyanfen 的回复:
[quote=引用 楼主 Rockismej 的回复:] 跨进程获取数据,此程序控件用的是MFCGridCtr,我用获取hWnd,Sendmessge postmessage依然没搞定,如果谁亲自搞过的话,帮忙说下大致的思路和流程,多谢多谢了
没什么限制写个dll注入到目标进程,获取控件指针,然后找到对应的MFCGridCtr版本,查看对应函数偏移,去调用他自己的模块返回数据,然后把数据传给你的程序[/quote] 我这个程序就是以DLL的形式加载的,且宿主软件特别大功能较多,如果再写个DLL注入的话,可能操作不好的对宿主的稳定性有影响,所以想了下折中方法还是模拟稍微好点,但就是是非标准WINDOS控件,好多标准的消息不支持
gouyanfen 2019-06-25
  • 打赏
  • 举报
回复
引用 楼主 Rockismej 的回复:
跨进程获取数据,此程序控件用的是MFCGridCtr,我用获取hWnd,Sendmessge postmessage依然没搞定,如果谁亲自搞过的话,帮忙说下大致的思路和流程,多谢多谢了
没什么限制写个dll注入到目标进程,获取控件指针,然后找到对应的MFCGridCtr版本,查看对应函数偏移,去调用他自己的模块返回数据,然后把数据传给你的程序
赵4老师 2019-06-25
  • 打赏
  • 举报
回复
schlafenhamster 2019-06-24
  • 打赏
  • 举报
回复
如果 CMFCGridCtrl 不是 基于 消息响应的 话 , 就要 使用 :
CreateRemoteThread(hProcess,(LPTHREAD_START_ROUTINE)pcode,pParam))
在 远程 中 执行 其 API
Rockismej 2019-06-24
  • 打赏
  • 举报
回复
引用 7 楼 zgl7903 的回复:
MFCGridCtrl 开源的 可以自己分析下 https://www.codeproject.com/Articles/8/MFC-Grid-control-2-27/ 我感觉模拟键鼠选中, Ctrl+C Ctrl+V 通过剪切板可能会比较简单些
我试了下模拟也是搞不定,哎,WM_SETTEXT,WM_PASTE都不行
zgl7903 2019-06-24
  • 打赏
  • 举报
回复
MFCGridCtrl 开源的 可以自己分析下 https://www.codeproject.com/Articles/8/MFC-Grid-control-2-27/ 我感觉模拟键鼠选中, Ctrl+C Ctrl+V 通过剪切板可能会比较简单些
Rockismej 2019-06-24
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster的回复:
如果 CMFCGridCtrl 不是 基于 消息响应的 话 , 就要 使用 :
CreateRemoteThread(hProcess,(LPTHREAD_START_ROUTINE)pcode,pParam))
在 远程 中 执行 其 API
好的,我再试试,多谢
Rockismej 2019-06-24
  • 打赏
  • 举报
回复
这种模拟的有一定的失败概率性存在,所以不太想用这种方法
Rockismej 2019-06-23
  • 打赏
  • 举报
回复
@zgl7903 @向立天 @worldy @Eleven @笨笨仔 几位大神也出来帮忙指导指导,多谢啦一下嘛
Rockismej 2019-06-23
  • 打赏
  • 举报
回复
@schlafenhamster
不行,这个消息起不到作用LVM_GETHEADER,感觉不是标准的windows控件,用这个消息对他完全不起作用
Rockismej 2019-06-23
  • 打赏
  • 举报
回复
不行,这个消息起不到作用LVM_GETHEADER,感觉不是标准的windows控件,用这个消息对他完全不起作用
schlafenhamster 2019-06-23
  • 打赏
  • 举报
回复
"我用获取hWnd,Sendmessge postmessage依然没搞定"
message 中的 参数 是 跨进程的 ,即不是一个 地址 空间 !



typedef struct tagMYLVCOLUMN
{
LVCOLUMN oldCol;
char text[80];
} MYLVCOLUMN, FAR* LPMYLVCOLUMN;
//
LPMYLVCOLUMN CRemoteListCtrlDlg::RemoteLVGetColumn(HWND hLvWnd)
{// GetItemCount
m_hHdWnd=ListView_GetHeader(m_hLvWnd);
int nColumn=::SendMessage(m_hHdWnd,HDM_GETITEMCOUNT,0,0);
// afxDump << nColumn << "\n";
// Get hProcess
DWORD pid;
GetWindowThreadProcessId(m_hLvWnd,&pid);
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
//
LPMYLVCOLUMN pRemoteCol = (LPMYLVCOLUMN)VirtualAllocEx(hProcess, NULL, nColumn*sizeof(MYLVCOLUMN), MEM_COMMIT, PAGE_READWRITE);
if (!pRemoteCol)
{
::MessageBox(NULL, "无法分配内存!", "错误!", NULL);
CloseHandle(hProcess);
return 0;
}
// local
LPMYLVCOLUMN pLocalCol=new MYLVCOLUMN[nColumn];
memset(pLocalCol,0,nColumn*sizeof(MYLVCOLUMN));
for(int i=0; i<nColumn; i++)
{
pLocalCol[i].oldCol.mask=LVCF_FMT | LVCF_TEXT | LVCF_WIDTH ;//| LVCF_SUBITEM;
pLocalCol[i].oldCol.cchTextMax=80;
pLocalCol[i].oldCol.pszText=pRemoteCol[i].text;// not pLocalCol[i].text
if(!WriteProcessMemory(hProcess, &pRemoteCol[i], &pLocalCol[i], sizeof(MYLVCOLUMN), NULL))
{
::MessageBox(NULL, "WriteProcessMemory!", "错误!", NULL);
CloseHandle(hProcess);
return 0;
}
ListView_GetColumn(m_hLvWnd,i,&pRemoteCol[i]);
// ::SendMessage(m_hLvWnd, LVM_GETCOLUMN, (WPARAM)i, (LPARAM)&pRemoteCol[i]);
if(!ReadProcessMemory(hProcess, &pRemoteCol[i], &pLocalCol[i], sizeof(MYLVCOLUMN), NULL))
{
::MessageBox(NULL, "ReadProcessMemory!", "错误!", NULL);
CloseHandle(hProcess);
return 0;
}
// !!!
pLocalCol[i].oldCol.pszText=pLocalCol[i].text;
// afxDump << pLocalCol[i].text << "\n";
}
//释放内存
CloseHandle(hProcess);
VirtualFreeEx(hProcess, pRemoteCol , 0, MEM_RELEASE);
return pLocalCol;
}
Rockismej 2019-06-23
  • 打赏
  • 举报
回复
没有别的限制了,直接模拟手动点击那种最好还是不要,因为有概率性失败
gouyanfen 2019-06-23
  • 打赏
  • 举报
回复
有没有什么限制

16,551

社区成员

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

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

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