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

Rockismej 2019-06-23 01:29:31
跨进程获取数据,此程序控件用的是MFCGridCtr,我用获取hWnd,Sendmessge postmessage依然没搞定,如果谁亲自搞过的话,帮忙说下大致的思路和流程,多谢多谢了
...全文
367 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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
  • 打赏
  • 举报
回复
有没有什么限制
纯c读写ini配置文件 用c/c++读写ini配置文件有不少第三方的开源库,如iniparser、libini、rwini、UltraLightINIParser等,但都不理想,往往代码较大、功能较弱、 接口使用不方便。尤其在大小写处理、前后空格、各种注释、平台换行符支持、带引号字符串处理、无section操作、原格式保持等方面存在问题。 现将本人精心制作的ini读写程序源码奉献给大家,纯c编写,简洁好用。支持windows和linux。 主要特点: 1、支持;和#注释符号,支持行尾注释。 2、支持带引号'或"成对匹配的字符串,提取时自动去引号。引号可带其它引号或;#注释符。 3、支持无section或空section(名称为空)。 4、支持10、16、8进制数,0x开头为16进制数,0开头为8进制。 5、支持section、key或=号前后带空格。 6、支持\n、\r、\r\n或\n\r换行格式。 7、不区分section、key大小写,但写入时以新串为准,并保持其大小写。 8、新增数据时,若section存在则在该节最后一个有效数据后添加,否则在文件尾部添加。 9、支持指定key所在整行删除,即删除该键值,包括注释。 10、可自动跳过格式错误行,修改时仍然保留。 11、修改时保留原注释:包括整行注释、行尾注释(包括前面空格)。 12、修改时保留原空行。以上三点主要是尽量保留原格式。 不足之处: 1、不支持单key多value(逗号分割),只能一次性提取后自行处理。 2、不支持同名重复section和key。(重复section可视为错误,重复key则可能造成分歧) 3、不能提取所有section或key名称。 使用只需两个文件inirw.h、inirw.c,另有测试程序和工程文件,支持windows和linux。

16,547

社区成员

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

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

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