获取其他程序的信息(VC实现)

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

介绍

        最近正试着从其他程序的listview控件中获取信息,因为需要传递一个指针以便存放取得的字符串,但Windows使用的是虚拟内存,指针是不允许跨进程访问的。

        Windows是这样通过虚拟内存来管理分配给所有应用程序的内存的:它让程序认为自己拥有2GB的内存空间可用,它也通过保护来避免程序互相占用内存.这样当一个程序有问题时,不会影响到其他程序。

        写了一些代码之后,我认识到我的指针是不允许的,所以无法工作。通过几个小时在MSDN上的发掘,我找到了这几个函数VirtualAllocEx()VirtualFreeEx()WriteProcessMemory() and ReadProcessMemory()有了这些函数的武装,我修改了我的代码:

 

#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <windows.h>
#include <commctrl.h>

int main(void) {
 /* 找到在wnidows下运行的listview. */
 HWND hwnd=FindWindow(NULL, "Stealing Program's Memory: ListView");
 HWND listview=FindWindowEx(hwnd, NULL, "SysListView32", NULL);

 int count=(int)SendMessage(listview, LVM_GETITEMCOUNT, 0, 0);
 int i;

 char item[512], subitem[512];

 /* 显示 listview 中的每一项以及它的子项
    并且一个一个的打印出来. */

 LVITEM lvi;
 lvi.cchTextMax=512;

 for(i=0; i<count; i++) {
  lvi.iSubItem=0;
  lvi.pszText=item;
  SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)&lvi);

  lvi.iSubItem=1;
  lvi.pszText=subitem;
  SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)&lvi);

  printf("%s - %s/n", item, subitem);
 }
 return 0;
}

就象我之前所说的,这无法工作,指向lvi,item和subitem的指针在跨进程访问时都出现了问题,如何解决呢?通过

WriteProcessMemory()和ReadProcessMemory()来使用其他程序的内存,在其他进程内实现LVM_GETITEMTEXT

并返回。从另外的程序内的listview控件读取items真象一个黑客。

 

首先,我们得到listview的进程,象下面这样:

unsigned long pid; HANDLE process; GetWindowThreadProcessId(listview, &pid); process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ| PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);

 

然后我们创建三个指针LVITEM *_lvi, char *_item, and char *_subitem 用VirtualAllocEx()把它们分配到

另外程序的虚拟内存空间里。

LVITEM *_lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM), MEM_COMMIT, PAGE_READWRITE); char *_item=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT, PAGE_READWRITE); char *_subitem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT, PAGE_READWRITE);

 

现在,我们用lvi.pszText指向_item并且用WriteMemoryProcess()把它的内存拷贝到_lvi

lvi.pszText=_item; WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);

 

现在我们有了一个LVITEM指针它在另外一个程序的虚拟内存空间是可以使用的,我们可以发送LVM_GETITEMTEXT消息给

listvie并且拷贝_item的文本到item中,这样我们就能在自己的程序里读取它。

SendMessage(hwnd, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi); ReadProcessMemory(process, _item, item, max, NULL);

 

 

在subitem中重复,然后释放我在其他程序里分配的内存:

VirtualFreeEx(process, _lvi, 0, MEM_RELEASE); VirtualFreeEx(process, _item, 0, MEM_RELEASE); VirtualFreeEx(process, _subitem, 0, MEM_RELEASE);

哈!一切OK,

 

 

#define WIN32_LEAN_AND_MEAN
#include <stdio.h>
#include <windows.h>
#include <commctrl.h>

int main(void) {
 HWND hwnd=FindWindow(NULL, "Stealing Program's Memory: ListView");
 HWND listview=FindWindowEx(hwnd, NULL, "SysListView32", NULL);

 int count=(int)SendMessage(listview, LVM_GETITEMCOUNT, 0, 0);
 int i;

 LVITEM lvi, *_lvi;
 char item[512], subitem[512];
 char *_item, *_subitem;
 unsigned long pid;
 HANDLE process;

 GetWindowThreadProcessId(listview, &pid);
 process=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|
                     PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, FALSE, pid);

 _lvi=(LVITEM*)VirtualAllocEx(process, NULL, sizeof(LVITEM),
                              MEM_COMMIT, PAGE_READWRITE);
 _item=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
                             PAGE_READWRITE);
 _subitem=(char*)VirtualAllocEx(process, NULL, 512, MEM_COMMIT,
                                PAGE_READWRITE);

 lvi.cchTextMax=512;

 for(i=0; i<count; i++) {
  lvi.iSubItem=0;
  lvi.pszText=_item;
  WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
  SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

  lvi.iSubItem=1;
  lvi.pszText=_subitem;
  WriteProcessMemory(process, _lvi, &lvi, sizeof(LVITEM), NULL);
  SendMessage(listview, LVM_GETITEMTEXT, (WPARAM)i, (LPARAM)_lvi);

  ReadProcessMemory(process, _item, item, 512, NULL);
  ReadProcessMemory(process, _subitem, subitem, 512, NULL);

  printf("%s - %s/n", item, subitem);
 }

 VirtualFreeEx(process, _lvi, 0, MEM_RELEASE);
 VirtualFreeEx(process, _item, 0, MEM_RELEASE);
 VirtualFreeEx(process, _subitem, 0, MEM_RELEASE);

 return 0;
}
转自:http://blog.csdn.net/jia_xiaoxin/article/details/2916899
vc.net2005+access实现天气预报。 vc.net 2005,用托管类的实现了天气预报的程序。作为工作以来的第一个程序,做的很认真,从什么都不清楚,到后面都算是对VS有一定的了解。在本程序中,参考问天网的的天气预报的数据,当给出了问天网当中的城市天气预报的URL后,通过vc.net下的HttpWebRequest连接上,得到了网页的源代码,利用正则表达式,去掉所有的标签,以及标签的内容,剩下的就只有天气预报的数据,包括:今天的, 阅读详情

相关推荐

获取本机通讯薄的内容

获取本机通讯薄的内容 编译:徐景周 下载示例源代码 简介 如果你想获取本机通讯簿(Outlook Express和Outlook2000)的内容,如:联系人名字、联系人邮件地址等时,可以试试下面的方法。下面是把此方法用VC6编写的示例程序运行效果:   由于读取Outlook Express(系统自带)和Outlook2000(Office2000中所带)中通讯薄内容所采取

xjbclz的专栏 638

C++获取其他程序信息

1.根据程序名称获取程序窗口句柄 //一个程序获取另一个程序Edit控件的内容 char temp[256]; strTest.clear(); //根据指定程序的标题名获取程序窗口的句柄 HWND hWnd = ::FindWindow(NULL, L"Test"); if (hWnd!=NULL) { EnumChildWindows(hWnd, EnumWindowsProc, NULL); UpdateData(0); } vector<CString&

yangsen001122的博客 825

向其他程序的ListView控件发送LVM_GETITEMTEXTVC源代码

本代码实现取得其它进程中ListView中的信息 关键字:WriteProcessMemory,VirtualAllocEx,OpenProcess,ListView,LVM_GETITEMTEXT

C++ 获取其它进程命令行

winxp,win7,win8测试有效   #include #include #include //获取进程命令行 BOOL GetProcessCommandLine(HANDLE hProcess, LPTSTR pszCmdLine, DWORD cchCmdLine) { BOOL bRet; DWORD dwPos; LPBYTE

sder3445555的专栏 6755

VC 获取其它运行中程序的命令行参数

VC获取其它运行中程序的命令行参数    我们都知道,在程序获取命令行参数很简单,WinMain函数会以参数的形式传递给我们,或者可以调用API GetCommandLine 获取。但是GetCommandLine函数不接受参数,获取的只是自己程序的命令行参数。那么如果我们想获取别的应用程序的命令行参数应该怎么办呢?  有的同学说,既然GetCommandLine只能获取程序的命

wonsoft的专栏 4958

C++-Win32-列表编辑-获取列表内容-获取列表行数-修改列表内容-SysListView32

  根据窗口控件ID获取对话框窗口句柄。 2.SendMessage函数–编辑列表   LVM_GETITEMTEXT消息获取窗口内容,LVM_GETITEMCOUNT获取行数,LVM_SETITEMTEXT修改内容,LVM_INSERTITEM插入一项。 3.列表增加专用宏函数   希望能够帮到需要原生代码的朋友。...

插件开发 1296

VC 匿名管道获取控制台程序的输出

PS:用子线程,并对输出的字符串进行拆解,效果更逼真.直接代码附解释: void CShellPingDlg::OnBnClickedBtnPing() // 窗体上按钮的BN_CLICKED事件{    CString host,addr;    GetDlgItemTextA(IDC_TXT_IP, host);//获取窗体CEdit空间 IDC_TXT_IP 的文本    a

XXup 4118

VC HID

1、头文件包含,库文件链接  在VC中开发HID应用程序时,需要包含setupapi.h和hidsdi.h,包含方式必须为extern "C",如下所示: extern "C" { // Declare the C libraries used #include "setupapi.h"  // Must link in setupapi.lib #include "hidsdi

jackedison1的专栏 457

VC中最大化及还原对话框实现

在使用VC编写基于MFC的对话框程序时,经常要将窗口在最大化和默认窗体之间进行切换,默认情况下点击最大化按钮后,对话框会全屏,但是里面的组件却没有按相同比例放大。以下给出实现的相关代码。          //最大化,获取当前对话框大小  CRect rectDlg;       ::GetWindowRect(m_hWnd,rectDlg); //该函数返回指定窗口的边框矩形的尺寸。

daofengdeba 4491

VC小知识总结!(精品收集)

VC小知识总结!(1) 如何通过代码获得应用程序主窗口的 指针?主窗口的 指针保存在CWinThread::m_pMainWnd中,调用AfxGetMainWnd实现。AfxGetMainWnd() ->ShowWindow(SW_SHOWMAXMIZED)//使程序最大化.(2) 确定应用程序的路径Use GetModuleFileName 获得应用程序的路径,然后去掉可执行文件名。Ex

new...... 1062

用flash调用VC打开文件对话框,取得路径。

    本来想用flash的as2调用html+javascript的方法取得本地路径,但项目催得紧,没有时间研究基本不会的html了。只好使用熟悉的vc,捣鼓了一整天,凑合出一个解决方法来。不罗嗦了,见正文。======================flash端的as2脚本如下://call Open file dialog//fscommand("exec", "delete

深深蓝的专栏 1160

VC5中显示256色位图

VC5中显示256色位图     李欣 周学泳 在Windows的编程中,彩色图像的显示和处理一直是一个重要的课题,即使是在显卡普遍支持真彩的今天,讨论256色位图的显示也是有意义的。通过对这一课题的讨论,可以了解如何在VC5中实现装入图像,创建和使用调色板,以及最后将图像画出来。 总的来说,要显示一幅256色的位图,首先应得到该图的有关信息,通过位图的颜色表创建一个逻辑调色板,然后将这个调色

糯米糊糊的专栏 2335

[转]vc下使用windows的性能计数器简介

 /*   vc下使用windows的性能计数器简介    *//*      作者:wlzqin   *//*Microsoft Windwos NT/2000 提供了一个强大的API集来访问系统事件和性能数据的众多计数器。我们既可以实时地得到计数器的值,也可以从一个日志文件中读取计数器数据。功能可为强大,而且使用简单。下面我就简单谈谈在vc中如何使用windows的性能计数器。好,废话少说,我

宋雷的技术博客 1644

在Win32程序中显示Dos调试窗口

    在很多程序中,都可以看到程序运行中,会有一个Dos窗口,实时显示一些运行信息,这里就告诉大家是如何实现的,我们做个简单的,其实对控制台的操作还有很多,有兴趣的可以去查资料。    用到的API函数如下:   //创建控制台  AllocConsole;  //获取控制台窗口  GetStdHandle;  //向控制台输出信息  WriteConsole;  //释

bdmh的专栏 4073

c#WinForm中通过鼠标点DataGrid事件获取DataGrid Cell数据

      有好一段时间不做.net的WinForm 程序了,.net 在WinForm中的DataGrid控件用起来,总觉得和VC++,VB6中的DataGrid命名区别太大!而且用法有点怪异!     我想实现的一个功能是,用户鼠标点DataGrid中的一行数据的时候,系统默认选中该数据,然后可以进行删除操作。程序代码如下:  private void dataGridScore_Double

1864

一个简单的鼠标钩子程序

一个简单的鼠标钩子程序 实现适时获取当前鼠标所在窗口的标题,并将其显示在一个EDITBOX中,程序运行截图: Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子的种类很多,每种钩子可以截获并处理相应的消息,如键

xl19900502的专栏 782

直接从RING3获取硬盘序列号

****************************************************************原作: Bardo出处: 《东方热讯》网站网址: www.easthot.net****************************************************************(如需转载,请不在删除以上信息,否则视为侵权!)*

桉树(anbull)的专栏 1281

程序调试过程中的日志文件源码

主要运行在VC6++环境下! 1 日志文件记录源代码: 1 #include<stdio.h> 2 #include<assert.h> 3 #include<time.h> 4 void my_log(char *strlog) 5 { 6 7 int ret; 8 9 time_t...

weixin_30725467的博客 122
上一篇: list control的用法 --virtual List
下一篇: USB命令(请求)和USB描述符
开发
博客等级 码龄19年 29粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值